150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/* 250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License. 650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at 750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and 1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License. 1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am; 1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1935be7560300a97fc3675bdd325910f28827d9508Jeff Sharkeyimport static android.Manifest.permission.START_ANY_ACTIVITY; 2035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkeyimport static android.content.pm.PackageManager.PERMISSION_GRANTED; 2135be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey 2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity; 2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl; 2450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity; 270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.ActivityManager; 287a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackbornimport android.app.ActivityOptions; 2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals; 3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager; 310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever; 3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread; 3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent; 3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo; 3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult; 3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName; 3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context; 3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender; 3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent; 4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender; 4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo; 4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo; 4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager; 4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo; 4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration; 460aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources; 470aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 49ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle; 5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 55e302a162359e191633e966520a6bab4ad569390cDianne Hackbornimport android.os.Process; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 58742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.UserId; 5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack { 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 75b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn static final boolean DEBUG_STATES = false; 8698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn static final boolean DEBUG_ADD_REMOVE = false; 8798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn static final boolean DEBUG_SAVED_STATE = false; 88ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 942a29b3ad1350785aedea3442b38042885533576cDianne Hackborn 952a29b3ad1350785aedea3442b38042885533576cDianne Hackborn // Ticks during which we check progress while waiting for an app to launch. 962a29b3ad1350785aedea3442b38042885533576cDianne Hackborn static final int LAUNCH_TICK = 500; 972a29b3ad1350785aedea3442b38042885533576cDianne Hackborn 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 103162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // How long we wait for the activity to tell us it has stopped before 104162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // giving up. This is a good amount of time because we really need this 105162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // from the application in order to get its saved state. 106162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn static final int STOP_TIMEOUT = 10*1000; 107162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn 1084eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // How long we can hold the sleep wake lock before giving up. 1094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT = 5*1000; 1104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 119621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // disabled. 120621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1220dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); 152be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 153be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn /** 154be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn * Used for validating app tokens with window manager. 155be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn */ 156be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final ArrayList<IBinder> mValidateAppTokens = new ArrayList<IBinder>(); 157be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>(); 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 1824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * List of activities that are in the process of going to sleep. 1834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 1844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn final ArrayList<ActivityRecord> mGoingToSleepActivities 1854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn = new ArrayList<ActivityRecord>(); 1864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 1874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 233621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn ActivityRecord mPausingActivity = null; 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2480dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2500dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2510dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2520dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2530dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2540dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 2694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * Set when we have taken too long waiting to go to sleep. 2704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 2714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn boolean mSleepTimeout = false; 2724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 27390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn /** 27490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn * Dismiss the keyguard after the next activity is displayed? 27590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn */ 27690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn boolean mDismissKeyguardOnNextActivity = false; 27790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 2780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailWidth = -1; 2790aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailHeight = -1; 2800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 281742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private int mCurrentUser; 282742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 28340c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int SLEEP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG; 28440c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1; 28540c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2; 28640c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3; 28740c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int LAUNCH_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4; 28840c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5; 28940c8db5a28e9abae2033facce1354e3677911fccDianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6; 29029ba7e66804e91cbd05fed74893061b4971ec52bDianne Hackborn static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 7; 291162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 8; 292755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 9; 293755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn 294755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn static class ScheduleDestroyArgs { 295755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn final ProcessRecord mOwner; 296755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn final boolean mOomAdj; 297755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn final String mReason; 298755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn ScheduleDestroyArgs(ProcessRecord owner, boolean oomAdj, String reason) { 299755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn mOwner = owner; 300755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn mOomAdj = oomAdj; 301755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn mReason = reason; 302755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 303755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 304755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 3124eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn case SLEEP_TIMEOUT_MSG: { 3138e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn synchronized (mService) { 3148e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (mService.isSleeping()) { 3158e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Slog.w(TAG, "Sleep timeout! Sleeping now."); 3168e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn mSleepTimeout = true; 3178e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn checkReadyForSleepLocked(); 3188e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 3194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 3204eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } break; 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 322be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 325be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + r); 3262a29b3ad1350785aedea3442b38042885533576cDianne Hackborn synchronized (mService) { 3272a29b3ad1350785aedea3442b38042885533576cDianne Hackborn if (r.app != null) { 3282a29b3ad1350785aedea3442b38042885533576cDianne Hackborn mService.logAppTooSlow(r.app, r.pauseTime, 3292a29b3ad1350785aedea3442b38042885533576cDianne Hackborn "pausing " + r); 3302a29b3ad1350785aedea3442b38042885533576cDianne Hackborn } 3312a29b3ad1350785aedea3442b38042885533576cDianne Hackborn } 3322a29b3ad1350785aedea3442b38042885533576cDianne Hackborn 333be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityPaused(r != null ? r.appToken : null, true); 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 345be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 346be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + r); 347be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityIdleInternal(r != null ? r.appToken : null, true, null); 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 3492a29b3ad1350785aedea3442b38042885533576cDianne Hackborn case LAUNCH_TICK_MSG: { 3502a29b3ad1350785aedea3442b38042885533576cDianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 3512a29b3ad1350785aedea3442b38042885533576cDianne Hackborn synchronized (mService) { 3522a29b3ad1350785aedea3442b38042885533576cDianne Hackborn if (r.continueLaunchTickingLocked()) { 3532a29b3ad1350785aedea3442b38042885533576cDianne Hackborn mService.logAppTooSlow(r.app, r.launchTickTime, 3542a29b3ad1350785aedea3442b38042885533576cDianne Hackborn "launching " + r); 3552a29b3ad1350785aedea3442b38042885533576cDianne Hackborn } 3562a29b3ad1350785aedea3442b38042885533576cDianne Hackborn } 3572a29b3ad1350785aedea3442b38042885533576cDianne Hackborn } break; 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 359be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 362be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + r); 363be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityDestroyed(r != null ? r.appToken : null); 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 366be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 367be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn activityIdleInternal(r != null ? r.appToken : null, false, null); 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 388162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn case STOP_TIMEOUT_MSG: { 389162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn ActivityRecord r = (ActivityRecord)msg.obj; 390162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // We don't at this point know if the activity is fullscreen, 391162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // so we need to be conservative and assume it isn't. 392162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn Slog.w(TAG, "Activity stop timeout for " + r); 393162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn synchronized (mService) { 394162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (r.isInHistory()) { 395162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn activityStoppedLocked(r, null, null, null); 396162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } 397162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } 398162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } break; 399755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn case DESTROY_ACTIVITIES_MSG: { 400755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn ScheduleDestroyArgs args = (ScheduleDestroyArgs)msg.obj; 401755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn synchronized (mService) { 402755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn destroyActivitiesLocked(args.mOwner, args.mOomAdj, args.mReason); 403755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 404755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 421742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // TODO: Don't look for any tasks from other users 42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 4240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 434742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // TODO: Don't look for any tasks from other users 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 4370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 456742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // TODO: Don't look for any tasks from other users 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 4590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 461be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (!r.finishing && (token != r.appToken) && (taskId != r.task.taskId)) { 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 470be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mHistory.indexOf(ActivityRecord.forToken(token)); 471be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 472be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 473be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final int indexOfActivityLocked(ActivityRecord r) { 474be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mHistory.indexOf(r); 475ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 477ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final ActivityRecord isInStackLocked(IBinder token) { 478be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 479be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (mHistory.contains(r)) { 480be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return r; 481ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 482ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return null; 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 503742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId = UserId.getUserId(info.applicationInfo.uid); 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 5060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 507742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (!r.finishing && r.task != cp && r.userId == userId 50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 547742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId = UserId.getUserId(info.applicationInfo.uid); 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 5510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 553742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (r.intent.getComponent().equals(cls) && r.userId == userId) { 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 56536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn final void showAskCompatModeDialogLocked(ActivityRecord r) { 56636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn Message msg = Message.obtain(); 56736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG; 56836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.obj = r.task.askedCompatMode ? null : r; 56936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn mService.mHandler.sendMessage(msg); 57036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn } 57136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn 572742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani /* 573742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Move the activities around in the stack to bring a user to the foreground. 574742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * @return whether there are any activities for the specified user. 575742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani */ 576742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final boolean switchUser(int userId) { 577742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani synchronized (mService) { 578742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mCurrentUser = userId; 579742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 580742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Only one activity? Nothing to do... 581742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (mHistory.size() < 2) 582742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return false; 583742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 584742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani boolean haveActivities = false; 585742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Check if the top activity is from the new user. 586742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ActivityRecord top = mHistory.get(mHistory.size() - 1); 587742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (top.userId == userId) return true; 588742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Otherwise, move the user's activities to the top. 589742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani int N = mHistory.size(); 590742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani int i = 0; 591742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani while (i < N) { 592742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ActivityRecord r = mHistory.get(i); 593742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (r.userId == userId) { 594742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ActivityRecord moveToTop = mHistory.remove(i); 595742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mHistory.add(moveToTop); 596742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // No need to check the top one now 597742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani N--; 598742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani haveActivities = true; 599742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 600742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani i++; 601742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 602742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 603742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // Transition from the old top to the new top 604742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani resumeTopActivityLocked(top); 605742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return haveActivities; 606742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 607742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 608742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 614be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6162a29b3ad1350785aedea3442b38042885533576cDianne Hackborn // schedule launch ticks to collect information about slow apps. 6172a29b3ad1350785aedea3442b38042885533576cDianne Hackborn r.startLaunchTickingLocked(); 6182a29b3ad1350785aedea3442b38042885533576cDianne Hackborn 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 628be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.mayFreezeScreenLocked(app) ? r.appToken : null); 629813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn mService.updateConfigurationLocked(config, r, false, false); 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 6330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn app.waitingToKill = null; 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 6664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 667e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 66836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(r); 6698ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 67062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn String profileFile = null; 67162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor profileFd = null; 67262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean profileAutoStop = false; 67362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 67462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileProc == null || mService.mProfileProc == app) { 67562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.mProfileProc = app; 67662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile = mService.mProfileFile; 67762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = mService.mProfileFd; 67862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop = mService.mAutoStopProfiler; 67962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 68062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 681f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn app.hasShownUi = true; 682c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn app.pendingUiClean = true; 68362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFd != null) { 68462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn try { 68562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = profileFd.dup(); 68662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } catch (IOException e) { 68762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = null; 68862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 68962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 690be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 691813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn System.identityHashCode(r), r.info, 692813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn new Configuration(mService.mConfiguration), 69358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn r.compat, r.icicle, results, newIntents, !andResume, 69462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.isNextTransitionForward(), profileFile, profileFd, 69562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop); 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69754e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 725be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 746ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r 747ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting new instance)"); 74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 75188819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 75288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(r.task); 75388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 7554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 75698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle); 75798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn r.icicle = null; 75898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn r.haveState = false; 75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 764ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 765ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting in stopped state)"); 76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7870dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 7880dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 7900dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 79150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 7986c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn app.addPackage(r.info.packageName); 79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 80250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 811a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn "activity", r.intent.getComponent(), false, false); 81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8144eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void stopIfSleepingLocked() { 8154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 8234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 8244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG); 8254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT); 8264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 8274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void awakeFromSleepingLocked() { 8314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 8324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mSleepTimeout = false; 8334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 8344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 8354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Ensure activities are no longer sleeping. 8374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 8380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 8394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(false); 8404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.clear(); 8424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void activitySleptLocked(ActivityRecord r) { 8454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 8464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 8474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void checkReadyForSleepLocked() { 8504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 8514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Do not care. 8524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 8534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mSleepTimeout) { 8564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mResumedActivity != null) { 8574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still have something resumed; can't sleep until it is paused. 8584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity); 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 8614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 8624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 863621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity != null) { 8644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still waiting for something to pause; can't sleep yet. 865621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity); 8664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 8674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mStoppingActivities.size() > 0) { 8704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to stop; can't sleep yet. 8714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 8724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mStoppingActivities.size() + " activities"); 87380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 8744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 8754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn ensureActivitiesVisibleLocked(null, 0); 8784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Make sure any stopped but visible activities are now sleeping. 8804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // This ensures that the activity's onStop() is called. 8814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 8820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 8834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) { 8844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 8854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleepActivities.size() > 0) { 8894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to sleep; can't sleep yet. 8904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 8914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mGoingToSleepActivities.size() + " activities"); 8924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 8954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 8974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 8984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 8994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 9004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 9014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.mShuttingDown) { 9024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mService.notifyAll(); 9034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 906d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn public final Bitmap screenshotActivities(ActivityRecord who) { 907ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn if (who.noDisplay) { 908ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn return null; 909ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn } 910ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn 9110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Resources res = mService.mContext.getResources(); 9120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int w = mThumbnailWidth; 9130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int h = mThumbnailHeight; 9140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w < 0) { 9150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailWidth = w = 9160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width); 9170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailHeight = h = 9180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height); 9190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 9200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 9210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w > 0) { 922be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn return mService.mWindowManager.screenshotApplications(who.appToken, w, h); 9230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 9240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 9250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 9260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 928621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity != null) { 929621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn RuntimeException e = new RuntimeException(); 930621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 931621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn + mPausingActivity, e); 932621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 940ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev); 941ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 943621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mPausingActivity = prev; 94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 947f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn prev.updateThumbnail(screenshotActivities(prev), null); 94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 957be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing, 958be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn userLeaving, prev.configChangeFlags); 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 965621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mPausingActivity = null; 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 969621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mPausingActivity = null; 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 984621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn 985621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity != null) { 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 991621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn prev.pauseKeyDispatchingLocked(); 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 10012a29b3ad1350785aedea3442b38042885533576cDianne Hackborn prev.pauseTime = SystemClock.uptimeMillis(); 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 1008621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn resumeTopActivityLocked(null); 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final void activityPaused(IBinder token, boolean timeout) { 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 10140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn TAG, "Activity paused: token=" + token + ", timeout=" + timeout); 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 10210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(index); 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 1023621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity == r) { 1024ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r 1025ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + (timeout ? " (due to timeout)" : " (pause complete)")); 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 1027621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn completePauseLocked(); 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 1031621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mPausingActivity != null 1032621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1038ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail, 1039ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn CharSequence description) { 1040b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn if (r.state != ActivityState.STOPPING) { 1041b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn Slog.i(TAG, "Activity reported stop, but no longer stopping: " + r); 1042b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn mHandler.removeMessages(STOP_TIMEOUT_MSG, r); 1043b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn return; 1044b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn } 104598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Saving icicle of " + r + ": " + icicle); 1046162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (icicle != null) { 1047162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // If icicle is null, this is happening due to a timeout, so we 1048162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // haven't really saved the state. 1049162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn r.icicle = icicle; 1050162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn r.haveState = true; 1051162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn r.updateThumbnail(thumbnail, description); 1052162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } 1053162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (!r.stopped) { 1054162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)"); 1055162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn mHandler.removeMessages(STOP_TIMEOUT_MSG, r); 1056162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn r.stopped = true; 1057162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn r.state = ActivityState.STOPPED; 10586e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn if (r.finishing) { 10596e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn r.clearOptionsLocked(); 10606e3d6daa3753be0ce170c1140cddd945e01e0a03Dianne Hackborn } else { 1061162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (r.configDestroy) { 1062162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn destroyActivityLocked(r, true, false, "stop-config"); 1063162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn resumeTopActivityLocked(null); 1064162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } else { 1065162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // Now that this process has stopped, we may want to consider 1066162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // it to be the previous app to try to keep around in case 1067162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn // the user wants to return to it. 1068162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn ProcessRecord fgApp = null; 1069162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (mResumedActivity != null) { 1070162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn fgApp = mResumedActivity.app; 1071162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } else if (mPausingActivity != null) { 1072162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn fgApp = mPausingActivity.app; 1073162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } 1074162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 1075162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 1076162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn && r.app != mService.mHomeProcess) { 1077162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn mService.mPreviousProcess = r.app; 1078162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 1079162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn } 108050685606cfa045213bcc1bf29ce1c00c256b055cDianne Hackborn } 1081ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 1082ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 1083ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 1084ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 1085621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn private final void completePauseLocked() { 1086621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn ActivityRecord prev = mPausingActivity; 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1089621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (prev != null) { 1090621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (prev.finishing) { 1091621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 1092621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 1093621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } else if (prev.app != null) { 1094621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 1095621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (prev.waitingVisible) { 1096621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn prev.waitingVisible = false; 1097621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mWaitingVisibleActivities.remove(prev); 1098621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 1099621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 1100621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } 1101621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (prev.configDestroy) { 1102621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // The previous is being paused because the configuration 1103621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // is changing, which means it is actually stopping... 1104621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // To juggle the fact that we are also starting a new 1105621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // instance right now, we need to first completely stop 1106621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // the current instance before starting the new one. 1107621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 1108621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn destroyActivityLocked(prev, true, false, "pause-config"); 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 1110621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mStoppingActivities.add(prev); 1111621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mStoppingActivities.size() > 3) { 1112621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // If we already have a few activities waiting to stop, 1113621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // then give up on things going idle and start clearing 1114621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // them out. 1115621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 1116621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn scheduleIdleLocked(); 1117621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } else { 1118621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn checkReadyForSleepLocked(); 1119621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1121621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } else { 1122621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 1123621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn prev = null; 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1125621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn mPausingActivity = null; 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1128621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (!mService.isSleeping()) { 1129621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn resumeTopActivityLocked(prev); 1130621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } else { 11314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 113242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (topRunningActivityLocked(null) == null) { 113342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn // If there are no more activities available to run, then 113442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn // do resume anyway to start something. 113542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn resumeTopActivityLocked(null); 113642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1138621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn 1139621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (prev != null) { 1140621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn prev.resumeKeyDispatchingLocked(); 1141621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1194f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn next.clearThumbnail(); 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1198621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn next.resumeKeyDispatchingLocked(); 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 12350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 1266be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 1290be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, true); 12914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 1292905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn r.app.pendingUiClean = true; 1293be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleWindowVisibility(r.appToken, true); 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 13200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 1332be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 1338be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleWindowVisibility(r.appToken, false); 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 138184375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn return resumeTopActivityLocked(prev, null); 138284375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn } 138384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn 138484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) { 138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 139784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn ActivityOptions.abort(options); 1398742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return mService.startHomeActivityLocked(0); 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 141084375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn ActivityOptions.abort(options); 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 1417dbad287b62966399d0d5029f3b10932895010337p && mLastPausedActivity == next 1418dbad287b62966399d0d5029f3b10932895010337p && (next.state == ActivityState.PAUSED 1419dbad287b62966399d0d5029f3b10932895010337p || next.state == ActivityState.STOPPED 1420dbad287b62966399d0d5029f3b10932895010337p || next.state == ActivityState.STOPPING)) { 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 142584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn ActivityOptions.abort(options); 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 14324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(next); 14334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 143684375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn next.updateOptionsLocked(options); 143784375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1440621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // If we are currently pausing an activity, then don't do anything 1441621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn // until that is done. 1442621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity != null) { 1443621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 1444621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn return false; 1445621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn } 1446621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn 14470dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 14480dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 14490dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1450034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1451034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1452034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1453034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1454034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1455034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1456034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1457034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1458034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1459034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1460034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1461034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1462034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1463034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1464034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1465034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1466034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1467034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1468034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1469034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 14700dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1471034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 14720dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 14730dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 14740dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 14750dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1484d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate // If the most recent activity was noHistory but was only stopped rather 1485d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate // than stopped+finished because the device went to sleep, we need to make 1486d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate // sure to finish it as we're making a new activity topmost. 1487d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate final ActivityRecord last = mLastPausedActivity; 1488d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (mService.mSleeping && last != null && !last.finishing) { 1489d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if ((last.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 1490d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate || (last.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 1491d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (DEBUG_STATES) { 1492d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate Slog.d(TAG, "no-history finish of " + last + " on new resume"); 1493d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } 1494d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate requestFinishActivityLocked(last.appToken, Activity.RESULT_CANCELED, null, 1495d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate "no-history"); 1496d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } 1497d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } 1498d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 1515be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1529e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // Launching this app's activity, make sure the app is no longer 1530e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // considered stopped. 1531e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn try { 1532e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 1533483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani next.packageName, false, next.userId); /* TODO: Verify if correct userid */ 1534e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } catch (RemoteException e1) { 1535a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn } catch (IllegalArgumentException e) { 1536a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 1537a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn + next.packageName + ": " + e); 1538e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 1539e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 15437a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn boolean noAnim = false; 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 15497da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 15507da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 15547da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1556be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev.appToken); 1557be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 15627a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn noAnim = true; 15637da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 15647da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 15687da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 1572be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev.appToken); 1573be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(prev.appToken, false); 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 15797a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn noAnim = true; 15807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 15817da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 15837da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 15847da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 15877a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn if (!noAnim) { 15887a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn next.applyOptionsLocked(); 15897a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn } else { 15907a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn next.clearOptionsLocked(); 15917a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn } 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 1597be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(next.appToken, true); 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15992a29b3ad1350785aedea3442b38042885533576cDianne Hackborn // schedule launch ticks to collect information about slow apps. 16002a29b3ad1350785aedea3442b38042885533576cDianne Hackborn next.startLaunchTickingLocked(); 16012a29b3ad1350785aedea3442b38042885533576cDianne Hackborn 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1607ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)"); 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 161188819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 161288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(next.task); 161388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 1624be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next.appToken : null); 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1628813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn updated = mService.updateConfigurationLocked(config, next, false, false); 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 1663be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleSendResult(next.appToken, a); 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 1668be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next.appToken); 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 167636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(next); 1677905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn next.app.pendingUiClean = true; 1678be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.app.thread.scheduleResumeActivity(next.appToken, 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 1685ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to " 1686ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + lastState + ": " + next); 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1695be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.appToken, next.packageName, next.theme, 16962f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 16972f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 16997eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 17007eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 1716be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 172298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next); 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1734be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn next.appToken, next.packageName, next.theme, 17352f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 17362f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 17387eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 17397eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 17507a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn boolean doResume, boolean keepCurTransition, Bundle options) { 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 17590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 176998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 177098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 177198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 177298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, 177398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here); 177498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1776f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 1777be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId, 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 1780be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 17828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 17960dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 180898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 180998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 181098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 181198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Adding activity " + r + " to stack at " + addPos, here); 181298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1814f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 18317da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 18327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 18377da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 18407a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn r.updateOptionsLocked(options); 184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 1842be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn addPos, r.appToken, r.task.taskId, r.info.screenOrientation, r.fullscreen); 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 1870be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.appToken, r.packageName, r.theme, 18712f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 18722f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r.info.applicationInfo), r.nonLocalizedLabel, 1873be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.labelRes, r.icon, r.windowFlags, 1874be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn prev != null ? prev.appToken : null, showStartingIcon); 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 1879be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r.appToken, r.task.taskId, 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 18818078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 1884be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1892be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final void validateAppTokensLocked() { 1893be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.clear(); 1894be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.ensureCapacity(mHistory.size()); 1895be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn for (int i=0; i<mHistory.size(); i++) { 1896be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mValidateAppTokens.add(mHistory.get(i).appToken); 1897be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 1898be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.validateAppTokens(mValidateAppTokens); 1899be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn } 1900be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 1909621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (ACTIVITY_INACTIVE_RESET_TIME > 0 1910621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 19280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord below = i >= 0 ? mHistory.get(i) : null; 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193304e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani // Don't check any lower in the stack if we're crossing a user boundary. 193404e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani if (below != null && below.userId != taskTop.userId) { 193504e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani break; 193604e0d265e3385e9d1fbc35e43c4e8caffbbe3290Amith Yamasani } 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 19860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(0); 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 1992f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(p.task, p.thumbHolder, false); 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2000f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(new TaskRecord(mService.mCurTask, target.info, null), 2001f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn null, false); 200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2006be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(target.appToken, task.taskId); 200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 2011f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ThumbnailHolder curThumbHolder = target.thumbHolder; 201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 20130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 2019f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(target.task, curThumbHolder, false); 2020f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn curThumbHolder = p.thumbHolder; 202198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 202298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 202398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 202498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + p + " to stack at " 202598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + dstPos, here); 202698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 2029be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p.appToken); 2030be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId); 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 2033be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 20560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn (mHistory.get( 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 20660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2094ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn 2095ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn } else if (target.resultTo != null && (below == null 2096ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn || below.task == target.task)) { 209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 2126ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Finishing task at index " 2127ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + targetI + " to " + replyChainEnd); 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 21290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 214350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2146ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Reparenting task at index " 2147ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + targetI + " to " + replyChainEnd); 214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 21490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(srcPos); 215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 216098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 216198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 216298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + p + " to stack at " 216398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + lastReparentPos, here); 216498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 2166f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(task, null, false); 216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 2169ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn + " from " + srcPos + " to " + lastReparentPos 217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 2171be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p.appToken); 2172be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppGroupId(p.appToken, p.task.taskId); 217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 2174be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 21850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(j); 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2199ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn 2200ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn } else if (below != null && below.task != target.task) { 2201ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn // We hit the botton of a task; the reply chain can't 2202ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn // pass through it. 2203ae0a0a84d1a1e5fcba0b18d473e1f31e11b7018eDianne Hackborn replyChainEnd = -1; 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 2221621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * @return Returns the old activity that should be continued to be used, 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 2225621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord newR, int launchFlags) { 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 22310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 22410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 2251621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 2252621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 22530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 2254621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2255621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2256621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2257621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2258621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2259621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2260621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 2261621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 2262621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 2272be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn int index = indexOfTokenLocked(ret.appToken); 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * Completely remove all activities associated with an existing 22900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * task starting at a specified index. 22910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn */ 22920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private final void performClearTaskAtIndexLocked(int taskId, int i) { 2293eabd328deea453a31d6b8f738c5bf0c3974d48b1Dianne Hackborn while (i < mHistory.size()) { 22940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 22950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.task.taskId != taskId) { 22960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Whoops hit the end. 22970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return; 22980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 22990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.finishing) { 23000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 23010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 23020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 23030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED, 23040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn null, "clear")) { 23050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 23060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 23070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 23080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 23090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 23100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn /** 2311621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Completely remove all activities associated with an existing task. 2312621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 2313621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn private final void performClearTaskLocked(int taskId) { 2314621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int i = mHistory.size(); 2315621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2316621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // First find the requested task. 2317621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2318621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 23190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2320621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId == taskId) { 2321621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 2322621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2323621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2324621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2325621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 23260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Now find the start and clear it. 2327621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2328621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 23290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2330621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2331621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2332621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2333621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2334621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // We hit the bottom. Now finish it all... 23350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, i+1); 2336621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 2337621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2338621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2339621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2340621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2341621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 23490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord candidate = mHistory.get(i); 235045a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn if (candidate.finishing) { 235145a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn continue; 235245a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn } 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 23690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord newTop = mHistory.remove(where); 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 23710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord oldTop = mHistory.get(top-1); 237298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 237398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 237498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 237598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + newTop + " to stack at " 237698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + top, here); 237798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 2385a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo, 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 2387a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn int callingPid, int callingUid, int startFlags, Bundle options, 2388621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity) { 2389efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2390a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn int err = ActivityManager.START_SUCCESS; 2391efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2392efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn ProcessRecord callerApp = null; 2393efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (caller != null) { 2394efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 2395efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (callerApp != null) { 2396efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingPid = callerApp.pid; 2397efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingUid = callerApp.info.uid; 2398efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } else { 2399efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 2400efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 2401efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + intent.toString()); 2402a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn err = ActivityManager.START_PERMISSION_DENIED; 2403efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2404efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2405efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2406a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (err == ActivityManager.START_SUCCESS) { 2407a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani final int userId = aInfo != null ? UserId.getUserId(aInfo.applicationInfo.uid) : 0; 240821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn Slog.i(TAG, "START {" + intent.toShortString(true, true, true, false) 2409a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani + " u=" + userId + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); 2410efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 241798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn TAG, "Will send result to " + resultTo + " (index " + index + ")"); 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 24190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sourceRecord = mHistory.get(index); 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 24338078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2434a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2446a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 2449a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn err = ActivityManager.START_INTENT_NOT_RESOLVED; 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2452a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (err == ActivityManager.START_SUCCESS && aInfo == null) { 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 2455a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn err = ActivityManager.START_CLASS_NOT_FOUND; 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2458a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (err != ActivityManager.START_SUCCESS) { 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 24658078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 246935be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey final int startAnyPerm = mService.checkPermission( 247035be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey START_ANY_ACTIVITY, callingPid, callingUid); 247135be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 24726c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn callingUid, aInfo.applicationInfo.uid, aInfo.exported); 247335be7560300a97fc3675bdd325910f28827d9508Jeff Sharkey if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 24806c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn String msg; 24816c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn if (!aInfo.exported) { 24826c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 24836c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 24846c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 24856c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " not exported from uid " + aInfo.applicationInfo.uid; 24866c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } else { 24876c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 24886c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 24896c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 24906c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " requires " + aInfo.permission; 24916c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 251790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 25188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2519a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_SUCCESS; 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2523742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 2527621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (outActivity != null) { 2528621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn outActivity[0] = r; 2529621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 2538a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn pal.startFlags = startFlags; 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 254090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 25418078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2542a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_SWITCHES_CANCELED; 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, 25617a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn startFlags, true, options); 2562621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mDismissKeyguardOnNextActivity && mPausingActivity == null) { 256390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // Someone asked to have the keyguard dismissed on the next 256490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // activity start, but we are not actually doing an activity 256590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // switch... just dismiss the keyguard now, because we 256690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // probably want to see whatever is behind it. 256790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 256890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 256990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 257090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn return err; 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2573621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontFromLaunchLocked(int launchFlags) { 2574621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2575621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2576621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2577621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Caller wants to appear on home activity, so before starting 2578621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // their own activity we will bring home to the front. 2579621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontLocked(); 2580621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2581621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2582621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 25847a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn ActivityRecord sourceRecord, int startFlags, boolean doResume, 25857a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn Bundle options) { 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 2588742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId = r.userId; 2589742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 2612a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 2619a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 265703fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn boolean movedHome = false; 2658621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord reuseTask = null; 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 268966a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru if (curTop != null && curTop.task != taskTop.task) { 269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 269603fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn movedHome = true; 2697621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 26988078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn moveTaskToFrontLocked(taskTop.task, r, options); 269984375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn options = null; 270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2707a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 271384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn resumeTopActivityLocked(null, options); 271484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn } else { 271584375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn ActivityOptions.abort(options); 271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2717a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_RETURN_INTENT_TO_CALLER; 271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2719621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2720621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 2721621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 2722621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // The caller has requested to completely replace any 27237da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // existing task with its new activity. Well that should 2724621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // not be too hard... 2725621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask = taskTop.task; 2726621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn performClearTaskLocked(taskTop.task.taskId); 2727621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask.setIntent(r.intent, r.info); 2728621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2736621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn taskTop.task.taskId, r, launchFlags); 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 274639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2797621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (!addingToTask && reuseTask == null) { 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 280284375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn resumeTopActivityLocked(null, options); 280384375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn } else { 280484375876fcef73c5fa9c3de205c7db908ee14e15Dianne Hackborn ActivityOptions.abort(options); 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2806a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_TASK_TO_FRONT; 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 2824742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2836a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 2840a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_RETURN_INTENT_TO_CALLER; 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 2843a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_DELIVERED_TO_TOP; 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28558078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2856a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_CLASS_NOT_FOUND; 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 28607da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean keepCurTransition = false; 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2865621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (reuseTask == null) { 2866621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // todo: should do better management of integers. 2867621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask++; 2868621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mService.mCurTask <= 0) { 2869621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask = 1; 2870621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2871f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true); 2872621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 2873621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " in new task " + r.task); 2874621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2875f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(reuseTask, reuseTask, true); 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 287803fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn if (!movedHome) { 287903fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 288003fcc333cf0fbbc4df1215649746d6360801efd8Dianne Hackborn } 288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn sourceRecord.task.taskId, r, launchFlags); 28907da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn keepCurTransition = true; 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 289339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 28998078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 2900a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_DELIVERED_TO_TOP; 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 29117a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn top.updateOptionsLocked(options); 291239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2916a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_DELIVERED_TO_TOP; 291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 2922f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false); 292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 29320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn N > 0 ? mHistory.get(N-1) : null; 2933f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(prev != null 2934621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ? prev.task 2935f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent), null, true); 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 293939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 294039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 29417e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 294239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 29477a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn startActivityLocked(r, newTask, doResume, keepCurTransition, options); 2948a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_SUCCESS; 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2951a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 2952483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani String profileFile, ParcelFileDescriptor profileFd, int userId) { 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 2960483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani | ActivityManagerService.STOCK_PM_FLAGS, userId); 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 2975a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 2981a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 298292a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy if (!aInfo.processName.equals("system")) { 298392a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 298492a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy } 298592a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy } 298692a8b22e7410e74e1cba1b856333116652af8a5cSiva Velusamy 298762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFile != null) { 298862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (!aInfo.processName.equals("system")) { 298962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 2990a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn profileFile, profileFd, 2991a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0); 299262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 299362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2995621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return aInfo; 2996621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2997621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2998621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, int callingUid, 2999a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn Intent intent, String resolvedType, IBinder resultTo, 3000a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn String resultWho, int requestCode, int startFlags, String profileFile, 3001a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config, 3002a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn Bundle options, int userId) { 3003621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 3004621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 3005621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 3006621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3007621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 3008621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3009621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 3010621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 3011621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3012621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 3013a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 3014483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani profileFile, profileFd, userId); 301595a6a96e1cfb79b1960bb2a9e6bc22d9d8e5a238Amith Yamasani if (aInfo != null && mService.isSingleton(aInfo.processName, aInfo.applicationInfo)) { 3016a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani userId = 0; 3017a4a54e2a5f383e766bfecaec776e0b00002badd1Amith Yamasani } 3018742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani aInfo = mService.getActivityInfoForUser(aInfo, userId); 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 3022621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 3023621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 3024621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 303954e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 30578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 3058a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_PERMISSION_DENIED; 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 3063a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn ActivityManager.INTENT_SENDER_ACTIVITY, "android", 3064621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn realCallingUid, null, null, 0, new Intent[] { intent }, 3065621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 30667a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn | PendingIntent.FLAG_ONE_SHOT, null); 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 3098483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani | ActivityManagerService.STOCK_PM_FLAGS, userId); 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 3100742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani aInfo = mService.getActivityInfoForUser(aInfo, userId); 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 3109a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn aInfo, resultTo, resultWho, requestCode, callingPid, callingUid, 3110a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn startFlags, options, componentSpecified, null); 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 3122813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn mService.updateConfigurationLocked(config, null, false, false); 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 3129a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn if (res == ActivityManager.START_SUCCESS) { 313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 3133ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 3137a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn } else if (res == ActivityManager.START_TASK_TO_FRONT) { 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 3149ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3161621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivities(IApplicationThread caller, int callingUid, 3162a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn Intent[] intents, String[] resolvedTypes, IBinder resultTo, 3163a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn Bundle options, int userId) { 3164621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents == null) { 3165621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("intents is null"); 3166621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3167621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (resolvedTypes == null) { 3168621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("resolvedTypes is null"); 3169621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3170621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents.length != resolvedTypes.length) { 3171621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("intents are length different than resolvedTypes"); 3172621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3173621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3174621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord[] outActivity = new ActivityRecord[1]; 3175621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3176621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int callingPid; 3177621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 3178621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 3179621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 3180621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = Binder.getCallingPid(); 3181621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingUid = Binder.getCallingUid(); 3182621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 3183621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = callingUid = -1; 3184621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3185621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 3186621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn try { 3187621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn synchronized (mService) { 3188621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3189621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=0; i<intents.length; i++) { 3190621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent = intents[i]; 3191621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent == null) { 3192621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 3193621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3194621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3195621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 3196621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 3197621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 3198621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3199621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3200621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 3201621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3202621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 3203621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 3204621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3205621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 3206a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 3207483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani 0, null, null, userId); 3208742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani // TODO: New, check if this is correct 3209742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani aInfo = mService.getActivityInfoForUser(aInfo, userId); 3210621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3211621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags 3212621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 3213621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException( 3214621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "FLAG_CANT_SAVE_STATE not supported here"); 3215621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3216621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 32177a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn Bundle theseOptions; 32187a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn if (options != null && i == intents.length-1) { 32197a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn theseOptions = options; 32207a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn } else { 32217a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn theseOptions = null; 32227a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn } 3223621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedTypes[i], 3224a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn aInfo, resultTo, null, -1, callingPid, callingUid, 32257a2195cdd33f27c79eda343defc1f7ccf59cc8acDianne Hackborn 0, theseOptions, componentSpecified, outActivity); 3226621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (res < 0) { 3227621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return res; 3228621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3229621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3230be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 3231621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3232621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3233621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } finally { 3234621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Binder.restoreCallingIdentity(origId); 3235621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3236621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3237a4972e951bf2bdb7afdafee95b3ab0c15b8bacaeDianne Hackborn return ActivityManager.START_SUCCESS; 3238621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3239621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3253621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 326590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 326690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mDismissKeyguardOnNextActivity) { 326790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 326890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 326990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 32777e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 3288be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleSendResult(r.appToken, list); 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 3303d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (!mService.mSleeping) { 3304d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (DEBUG_STATES) { 3305d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate Slog.d(TAG, "no-history finish of " + r); 3306d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } 3307d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 3308d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate "no-history"); 3309d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } else { 3310d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r 3311d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate + " on stop because we're just sleeping"); 3312d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate } 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33145007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate } 33155007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate 33165007ddded6ec4b47c253d3c039806eb5dd77b40eChristopher Tate if (r.app != null && r.app.thread != null) { 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3322621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn r.resumeKeyDispatchingLocked(); 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 3325ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3326ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (stop requested)"); 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 3331be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3333be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags); 33344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 33354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 33364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 3337162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG); 3338162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn msg.obj = r; 3339162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn mHandler.sendMessageDelayed(msg, STOP_TIMEOUT); 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 3347ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r); 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 335028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "stop-except"); 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 3381be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(s.appToken, false); 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if ((!s.waitingVisible || mService.isSleeping()) && remove) { 338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn final void scheduleIdleLocked() { 340080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn Message msg = Message.obtain(); 340180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn msg.what = IDLE_NOW_MSG; 340280a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn mHandler.sendMessage(msg); 340380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn } 340480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn 340562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout, 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityRecord res = null; 341062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 342042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn boolean activityRemoved = false; 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 3423be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 3424be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn if (r != null) { 3425be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 34262a29b3ad1350785aedea3442b38042885533576cDianne Hackborn r.finishLaunchTickingLocked(); 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 3430be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn int index = indexOfActivityLocked(r); 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 343262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn res = r; 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 346929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mService.mBooted) { 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 352742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn activityRemoved = destroyActivityLocked(r, true, false, "finish-idle"); 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 354862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 354942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (activityRemoved) { 355042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn resumeTopActivityLocked(null); 355142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 355242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn 355362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn return res; 355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 3563d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate if (DEBUG_RESULTS || DEBUG_STATES) Slog.v( 356498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn TAG, "Finishing activity @" + index + ": token=" + token 3565d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate + ", result=" + resultCode + ", data=" + resultData 3566d3f175c8179e8fbb275a5ef53b5a6fc4d88c1f24Christopher Tate + ", reason=" + reason); 356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3576ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn final void finishSubActivityLocked(IBinder token, String resultWho, int requestCode) { 3577ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn ActivityRecord self = isInStackLocked(token); 3578ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (self == null) { 3579ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn return; 3580ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3581ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn 3582ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn int i; 3583ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn for (i=mHistory.size()-1; i>=0; i--) { 3584ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 3585ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (r.resultTo == self && r.requestCode == requestCode) { 3586ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if ((r.resultWho == null && resultWho == null) || 3587ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn (r.resultWho != null && r.resultWho.equals(resultWho))) { 3588ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn finishActivityLocked(r, i, 3589ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn Activity.RESULT_CANCELED, null, "request-sub"); 3590ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3591ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3592ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3593ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3594ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn 3595ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn final boolean finishActivityAffinityLocked(IBinder token) { 3596ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn int index = indexOfTokenLocked(token); 3597ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 3598ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn TAG, "Finishing activity affinity @" + index + ": token=" + token); 3599ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (index < 0) { 3600ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn return false; 3601ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3602ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn ActivityRecord r = mHistory.get(index); 3603ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn 3604bfc1be1101b87f193b043b62edd1722b8c4eb23cAmith Yamasani while (index >= 0) { 3605ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn ActivityRecord cur = mHistory.get(index); 3606ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (cur.task != r.task) { 3607ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn break; 3608ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3609ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (cur.taskAffinity == null && r.taskAffinity != null) { 3610ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn break; 3611ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3612ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) { 3613ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn break; 3614ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3615ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity"); 3616ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn index--; 3617ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3618ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn return true; 3619ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn } 3620ecc5a9cca000b62d2a649b795460fd791a206a89Dianne Hackborn 36215c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) { 36225c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // send the result 36235c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn ActivityRecord resultTo = r.resultTo; 36245c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (resultTo != null) { 36255c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 36265c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 36275c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 36285c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 36295c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 36305c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.packageName, resultData, 36315c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.getUriPermissionsLocked()); 36325c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 36335c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 36345c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn resultData); 36355c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.resultTo = null; 36365c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 36375c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 36385c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn 36395c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 36405c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // because clients have remote IPC references to this object so we 36415c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 36425c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.results = null; 36435c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.pendingResults = null; 36445c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.newIntents = null; 36455c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn r.icicle = null; 36465c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn } 36475c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn 364850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 36548078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn return finishActivityLocked(r, index, resultCode, resultData, reason, false); 36558078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } 36568078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn 36578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn /** 36588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn * @return Returns true if this activity has been removed from the history 36598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn * list, or false if it is still in the list and will be removed later. 36608078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn */ 36618078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 36628078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn int resultCode, Intent resultData, String reason, boolean immediate) { 366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 366450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 366894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 367050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 367150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 367250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 36730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord next = mHistory.get(index+1); 367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 367550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 367950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 368150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 368250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 368350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 368450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 368950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 369050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36955c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn finishActivityResultsLocked(r, resultCode, resultData); 369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37048078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn if (immediate) { 37058078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn return finishCurrentActivityLocked(r, index, 37068078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn FINISH_IMMEDIATELY) == null; 37078078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } else if (mResumedActivity == r) { 370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 37090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn || (mHistory.get(index-1)).task != r.task; 371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 37147da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); 371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 3717be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.setAppVisibility(r.appToken, false); 371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3719621e2fecb559d5afa5e43d58e8a7ee2d71c74430Dianne Hackborn if (mPausingActivity == null) { 372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 372250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 372350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 373250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 3744be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn final int index = indexOfActivityLocked(r); 374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 376480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 37654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 37664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3769ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3770ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (finish requested)"); 377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 37784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 3784ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r); 378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 379242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn boolean activityRemoved = destroyActivityLocked(r, true, true, "finish-imm"); 379342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (activityRemoved) { 379442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn resumeTopActivityLocked(null); 379542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 379642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn return activityRemoved ? null : r; 379750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 379850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 3814ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices, 3815ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean setState) { 381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3826ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (setState) { 3827ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)"); 3828ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.DESTROYED; 3829ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3830ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 383750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 383850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 384250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 384350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 385250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 385650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 386042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn removeTimeoutsForActivityLocked(r); 386142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 386242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn 386342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn private void removeTimeoutsForActivityLocked(ActivityRecord r) { 386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 3865162bc0ea0d7862b92f18d0ce47310a85304205f7Dianne Hackborn mHandler.removeMessages(STOP_TIMEOUT_MSG, r); 386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 38670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 38682a29b3ad1350785aedea3442b38042885533576cDianne Hackborn r.finishLaunchTickingLocked(); 386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38715c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn final void removeActivityFromHistoryLocked(ActivityRecord r) { 387250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 38735c607433e3d609e1a023adb496018fd1389a8ec8Dianne Hackborn finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); 387494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 387598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 387698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 387798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 387898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing activity " + r + " from stack"); 387998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 3881f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.takeFromHistory(); 3882ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3883ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (removed from history)"); 388450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 3885be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn mService.mWindowManager.removeAppToken(r.appToken); 388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 3887be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 388950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 389050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 389150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 389250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 389350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 389450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 389550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 389650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 389750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 389850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 389950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 390050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 390150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 390250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 390350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 390450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 390550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 390650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 390750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3908755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn 3909755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn final void scheduleDestroyActivities(ProcessRecord owner, boolean oomAdj, String reason) { 3910755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_ACTIVITIES_MSG); 3911755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn msg.obj = new ScheduleDestroyArgs(owner, oomAdj, reason); 3912755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn mHandler.sendMessage(msg); 3913755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 3914755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn 391528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj, String reason) { 3916755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn boolean lastIsOpaque = false; 391742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn boolean activityRemoved = false; 3918ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 3919ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = mHistory.get(i); 3920755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn if (r.finishing) { 3921755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn continue; 3922755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 3923755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn if (r.fullscreen) { 3924755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn lastIsOpaque = true; 3925755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 3926ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (owner != null && r.app != owner) { 3927ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn continue; 3928ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3929755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn if (!lastIsOpaque) { 3930755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn continue; 3931755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn } 3932ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // We can destroy this one if we have its icicle saved and 3933ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it is not in the process of pausing/stopping/finishing. 3934755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn if (r.app != null && r != mResumedActivity && r != mPausingActivity 3935755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn && r.haveState && !r.visible && r.stopped 3936ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYING 3937ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYED) { 3938755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Destroying " + r + " in state " + r.state 3939755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn + " resumed=" + mResumedActivity 3940755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn + " pausing=" + mPausingActivity); 394142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (destroyActivityLocked(r, true, oomAdj, reason)) { 394242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn activityRemoved = true; 394342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 3944ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3945ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 394642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (activityRemoved) { 394742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn resumeTopActivityLocked(null); 394842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 3949ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3950ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 395150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 395250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 395350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 395750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 395828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn boolean removeFromApp, boolean oomAdj, String reason) { 395950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 3960755c8bfbffe5134232217ef4c3998194b344ae17Dianne Hackborn TAG, "Removing activity from " + reason + ": token=" + r 396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 396250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 396428695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn r.task.taskId, r.shortComponentName, reason); 396550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 396650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 396750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3968ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn cleanUpActivityLocked(r, false, false); 396950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 397050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 397150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 397250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 397350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 397650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 397750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 397850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 398350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 3986ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn mService.updateLruProcessLocked(r.app, oomAdj, false); 398750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 398850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 398950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 399250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 399350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 3994be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing, 399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 399650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 399850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 399950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 400050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 400450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 401050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 4011ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // If the activity is finishing, we need to wait on removing it 4012ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // from the list to give it a chance to do its cleanup. During 4013ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // that time it may make calls back with its token so we need to 4014ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // be able to find it on the list and so we don't want to remove 4015ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it from the list yet. Otherwise, we can just immediately put 4016ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it in the destroyed state since we are not removing it from the 4017ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // list. 401850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 4019ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r 4020ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy requested)"); 402150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 402250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 402350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 402450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 402550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 4026ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 4027ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy skipped)"); 402850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 402950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 403050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 403150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 403250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 4036ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 4037ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (no app)"); 403850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 403950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 404250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 404350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 404550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 404950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 405050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 405150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 405250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 405342e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn final long origId = Binder.clearCallingIdentity(); 405442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn try { 405542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn ActivityRecord r = ActivityRecord.forToken(token); 405642e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (r != null) { 405742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 405842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 405942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn 406042e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn int index = indexOfActivityLocked(r); 406142e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (index >= 0) { 406242e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn if (r.state == ActivityState.DESTROYING) { 406345a25bcfc9af74bc4275cc710347304e581f3c51Dianne Hackborn cleanUpActivityLocked(r, true, false); 406442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn removeActivityFromHistoryLocked(r); 406542e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } 406650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 406742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn resumeTopActivityLocked(null); 406842e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn } finally { 406942e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn Binder.restoreCallingIdentity(origId); 407050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 407442e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn private void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 407550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 407650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 408150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 408250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 408350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 408450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 408550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 408650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 408742e620caf0407f1b5e02935ac4323742c65459fdDianne Hackborn removeTimeoutsForActivityLocked(r); 408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 408950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 409250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 409350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 409450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 40954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app); 409650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 409750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 4100621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 4101621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Move the current home activity's task (if one exists) to the front 4102621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * of the stack. 4103621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 4104621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontLocked() { 4105621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord homeTask = null; 4106621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 41070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord hr = mHistory.get(i); 4108621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (hr.isHomeActivity) { 4109621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn homeTask = hr.task; 411094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn break; 4111621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 4112621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 4113621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (homeTask != null) { 41148078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn moveTaskToFrontLocked(homeTask, null, null); 4115621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 4116621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 4117621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 41187f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn final void updateTransitLocked(int transit, Bundle options) { 41197f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn if (options != null) { 41207f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 41217f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn if (r != null && r.state != ActivityState.RESUMED) { 41227f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn r.updateOptionsLocked(options); 41237f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } else { 41247f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn ActivityOptions.abort(options); 41257f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } 41267f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } 41277f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn mService.mWindowManager.prepareAppTransition(transit, false); 41287f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } 4129621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 41308078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason, Bundle options) { 413150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 413250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 413450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 413550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 41360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (top < 0 || (mHistory.get(top)).task.taskId == task) { 413750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 41387f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn if (reason != null && 41397f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 41407f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn ActivityOptions.abort(options); 41417f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } else { 41427f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options); 41437f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn } 414450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 414550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 414650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 4147be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ArrayList<IBinder> moved = new ArrayList<IBinder>(); 414850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 414950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 415050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 415150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 415250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 415350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 415450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 415550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 415650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 41570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 415850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 415950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 416050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 416150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 416298cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 416398cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 416498cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 416598cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + r + " to stack at " + top, here); 416698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 416750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 416850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 4169be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn moved.add(0, r.appToken); 417050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 417150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 417250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 417350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 417450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 417550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 417650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 417750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 417850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 41797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 41807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 418150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 418250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 418350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 418450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41858078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn ActivityOptions.abort(options); 418650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 41877f58b95f7c2bd75a991ec6a2f05676aaba47a544Dianne Hackborn updateTransitLocked(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, options); 418850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 418950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 419050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 419150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 4192be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 419350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 419450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 419550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 419650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 419750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 419850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 419950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 420050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 420150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 420250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 420350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 420450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 420550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 420650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 420750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 420850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 420950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 421050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 421150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 421250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 421350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 421450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 421550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 421650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 421750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 421850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 421950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 422050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 422150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 422250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 422350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 422450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 422550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 422650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 422750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 422850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 422950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 423050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 423150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 423250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 423450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 423550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 423850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 4239be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn ArrayList<IBinder> moved = new ArrayList<IBinder>(); 424050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 424150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 424250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 424350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 424450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 424550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 424650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 424750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 424850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 424950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 425050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 42510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 425250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 425350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 425450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 425550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 425698cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn if (DEBUG_ADD_REMOVE) { 425798cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn RuntimeException here = new RuntimeException("here"); 425898cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn here.fillInStackTrace(); 425998cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn Slog.i(TAG, "Removing and adding activity " + r + " to stack at " 426098cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn + bottom, here); 426198cfebc6e871937e296fc1c6b89e07cdc8d5ba28Dianne Hackborn } 426250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 426350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 4264be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn moved.add(r.appToken); 426550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 426650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 426750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 426850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 426950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 427050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 427150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 42727da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 42737da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 427450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 427550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 427650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 427750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 427850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 42797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 42807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); 428150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 428250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 428350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 4284be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn validateAppTokensLocked(); 428550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 428650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 428750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 428850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 428950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 429050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) { 42920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true); 42930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 42940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed != null && resumed.thumbHolder == tr) { 42950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = resumed.stack.screenshotActivities(resumed); 42960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 42970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = tr.lastThumbnail; 42980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 42990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info; 43000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43029da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex, 43039da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn boolean taskRequired) { 43040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false); 43050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (info.root == null) { 43069da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn if (taskRequired) { 43079da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId); 43089da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn } 43090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 43100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex < 0) { 43130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Just remove the entire task. 43140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, info.rootIndex); 43150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info.root; 43160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex >= info.subtasks.size()) { 43199da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn if (taskRequired) { 43209da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex); 43219da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn } 43220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 43230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Remove all of this task's activies starting at the sub task. 43260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex); 43270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, subtask.index); 43280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return subtask.activity; 43290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) { 43320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 43330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final TaskAccessInfo thumbs = new TaskAccessInfo(); 43340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // How many different sub-thumbnails? 43350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final int NA = mHistory.size(); 43360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn int j = 0; 43370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ThumbnailHolder holder = null; 43380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 43390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 43400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!ar.finishing && ar.task.taskId == taskId) { 43410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 43420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 43430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 43450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (j >= NA) { 43480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 43490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.root = mHistory.get(j); 43520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.rootIndex = j; 43530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 43540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>(); 43550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.subtasks = subtasks; 43560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord lastActivity = null; 43570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 43580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 43590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 43600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.finishing) { 43610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 43620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.task.taskId != taskId) { 43640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 43650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastActivity = ar; 43670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.thumbHolder != holder && holder != null) { 43680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.numSubThumbbails++; 43690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 43700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask(); 43710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = holder.lastThumbnail; 43720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.activity = ar; 43730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.index = j-1; 43740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn subtasks.add(sub); 43750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastActivity != null && subtasks.size() > 0) { 43780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed == lastActivity) { 43790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1); 43800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity); 43810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (thumbs.numSubThumbbails > 0) { 43840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.retriever = new IThumbnailRetriever.Stub() { 43850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public Bitmap getThumbnail(int index) { 43860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (index < 0 || index >= thumbs.subtasks.size()) { 43870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 43880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs.subtasks.get(index).thumbnail; 43900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }; 43920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 43940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 43950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 439650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 439750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 439850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 439950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 440050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 440150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 440250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 440350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 440450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 440550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 440650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 440750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 440850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 440950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 441050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 441150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 441250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 441350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 441450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 441550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 441650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 441750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 441850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 441950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 442050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 442150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 442250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 442350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 442450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 442550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 4426e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (r.configuration == newConfig && !r.forceNewConfig) { 442750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 442850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 442950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 443050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 443150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 443250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 443350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 443450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 443550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 443650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 443750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 443850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 443950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 444050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 444150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 444250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 444350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 444458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn 444558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // Determine what has changed. May be nothing, if this is a config 444658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // that has come back from the app after going idle. In that case 444758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // we just want to leave the official config object now in the 444858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // activity and do nothing else. 444958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn final int changes = oldConfig.diff(newConfig); 445058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn if (changes == 0 && !r.forceNewConfig) { 445158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 445258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn "Configuration no differences in " + r); 445358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn return true; 445458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn } 445558f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn 445650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 445750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 445850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 445950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 446050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 446150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 4462e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 446350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 446450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 446550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 446658f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn // Figure out how to handle the changes between the configurations. 44673c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 44683c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 44693c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 4470e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn + Integer.toHexString(r.info.getRealConfigChanged()) 44713c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + ", newConfig=" + newConfig); 44723c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } 4473e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) { 44743c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 44753c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags |= changes; 44763c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 4477e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 44783c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (r.app == null || r.app.thread == null) { 44793c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 4480b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn "Config is destroying non-running " + r); 448128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn destroyActivityLocked(r, true, false, "config"); 44823c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 44833c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // A little annoying: we are waiting for this activity to 44843c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // finish pausing. Let's not do anything now, but just 44853c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // flag that it needs to be restarted when done pausing. 44863c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 4487b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn "Config is skipping already pausing " + r); 44883c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configDestroy = true; 44893c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return true; 44903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 44913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Try to optimize this case: the configuration is changing 44923c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // and we need to restart the top, resumed activity. 44933c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Instead of doing the normal handshaking, just say 44943c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // "restart!". 44953c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 4496b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn "Config is relaunching resumed " + r); 44973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 44983c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 44993c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else { 45003c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 4501b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn "Config is relaunching non-resumed " + r); 45023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 45033c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 450450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45053c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn 45063c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // All done... tell the caller we weren't able to keep this 45073c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // activity around. 45083c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return false; 450950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 451050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 451150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 451250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 451350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 451450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 451550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 451650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 451750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 451850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 4519be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r.appToken); 452050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 452150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 452250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 452350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 452450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 452550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 452650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 452750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 452850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 452950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 453050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 453150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 453250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 453350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 453450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 453550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 453650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 453750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 453850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 453950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 454050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 454150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 454250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 454350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 454450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 454550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 454650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 4547b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, 4548b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ") 4549b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn + r); 4550e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 4551be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents, 4552813075a67897fec54699289972c642a48a2ba9d5Dianne Hackborn changes, !andResume, new Configuration(mService.mConfiguration)); 455350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 455450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 455550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 455650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 4557b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, "Relaunch failed", e); 455850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 455950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 456050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 456150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 456250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 456350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 456450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 456550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 4566b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn r.state = ActivityState.RESUMED; 4567b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn } else { 4568b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 4569b61a02657b9e577179c934bbb5e199ce919c4642Dianne Hackborn r.state = ActivityState.PAUSED; 457050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 457150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 457250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 457350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 457490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 457590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn public void dismissKeyguardOnNextActivityLocked() { 457690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = true; 457790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 457850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 4579