ActivityStack.java revision 6c2c5fc9930d14d502a22326dee9bf4475dbd649
150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/* 250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License. 650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at 750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and 1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License. 1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am; 1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity; 2050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl; 2150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity; 2450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals; 2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager; 2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_CLASS_NOT_FOUND; 2750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_DELIVERED_TO_TOP; 2850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_INTENT_NOT_RESOLVED; 3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_PERMISSION_DENIED; 3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_RETURN_INTENT_TO_CALLER; 3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SUCCESS; 3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SWITCHES_CANCELED; 3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_TASK_TO_FRONT; 3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread; 3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent; 3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo; 3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult; 3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName; 4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context; 4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender; 4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent; 4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender; 4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo; 4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo; 4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager; 4750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo; 4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration; 490aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources; 500aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 5150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri; 5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpublic class ActivityStack { 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 103621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // disabled. 104621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 10550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1060dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1070dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1080dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1090dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mHistory = new ArrayList(); 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mLRUActivities = new ArrayList(); 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2210dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2220dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2260dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2270dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2410aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailWidth = -1; 2420aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailHeight = -1; 2430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + token); 2630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn activityPaused(token, true); 26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 27250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 27350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 27450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 27550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 27650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + token); 27750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, true, null); 27850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 27950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 28050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 28150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 28250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + token); 28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityDestroyed(token); 28550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 28650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, false, null); 28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 29250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 29350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 29550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 29650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 29850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 29950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 32650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 33050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && (token != r) && (taskId != r.task.taskId)) { 36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int count = mHistory.size(); 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // convert the token to an entry in the history. 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = -1; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=count-1; i>=0; i--) { 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Object o = mHistory.get(i); 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (o == token) { 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn index = i; 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return index; 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.mayFreezeScreenLocked(app) ? r : null); 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, r); 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r, 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info, r.icicle, results, newIntents, !andResume, 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52254e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 57488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 57588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(r.task); 57688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 57850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 57950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 58050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 5880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.icicle = null; 5890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.haveState = false; 5900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 59550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6080dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 6090dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 6110dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void pauseIfSleepingLocked() { 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mSleeping || mService.mShuttingDown) { 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not currently pausing an activity, get the current 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one to pause. If we are pausing one, we will just let that stuff 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // run and release the wake lock when all done. 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause..."); 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 655d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn public final Bitmap screenshotActivities(ActivityRecord who) { 6560aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Resources res = mService.mContext.getResources(); 6570aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int w = mThumbnailWidth; 6580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int h = mThumbnailHeight; 6590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w < 0) { 6600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailWidth = w = 6610aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width); 6620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailHeight = h = 6630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height); 6640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 6650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 6660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w > 0) { 6677c8a4b37765b7b491ab7979d589062ef546212bfDianne Hackborn return mService.mWindowManager.screenshotApplications(who, w, h); 6680aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 6690aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 6700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 6710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 691d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn prev.thumbnail = screenshotActivities(prev); 692d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn if (prev.task != null) { 693d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn prev.task.lastThumbnail = prev.thumbnail; 694d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.configChangeFlags); 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 75250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final void activityPaused(IBinder token, boolean timeout) { 75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 7600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn TAG, "Activity paused: token=" + token + ", timeout=" + timeout); 76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(index); 76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 78850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 79150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 79250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 80250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(prev, true); 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 81550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 82750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 82850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mGoingToSleep.isHeld()) { 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.release(); 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mShuttingDown) { 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 84250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 84350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 84750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 84950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.thumbnail = null; 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 91350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 92050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, true); 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, false); 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 107650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11280dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 11290dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 11300dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1131034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1132034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1133034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1134034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1135034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1136034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1137034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1138034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1139034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1140034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1141034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1142034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1143034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1144034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1145034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1146034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1147034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1148034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1149034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1150034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 11510dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1152034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 11530dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 11540dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 11550dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 11560dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 12037da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 12047da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 12087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 12167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 12177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 12217da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 12327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 12337da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 12357da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 12367da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(next, true); 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 125488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 125588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(next.task); 125688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next : null); 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updated = mService.updateConfigurationLocked(config, next); 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleSendResult(next, a); 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next); 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleResumeActivity(next, 131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 13357eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 13367eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null, 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 13717eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 13727eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 13837da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean doResume, boolean keepCurTransition) { 138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 14230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 14547da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14557da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); 145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 14597da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition); 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 14647da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos, r, r.task.taskId, r.info.screenOrientation, r.fullscreen); 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 147250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r, r.packageName, r.theme, r.nonLocalizedLabel, 14977eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn r.labelRes, r.icon, r.windowFlags, prev, showStartingIcon); 149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 1522621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (ACTIVITY_INACTIVE_RESET_TIME > 0 1523621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord below = i >= 0 ? (ActivityRecord)mHistory.get(i) : null; 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(0); 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task = p.task; 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1609621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn target.task = new TaskRecord(mService.mCurTask, target.info, null); 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 161350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(target, task.taskId); 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities--; 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = target.task; 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.numActivities++; 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p); 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ((ActivityRecord)mHistory.get( 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (target.resultTo != null) { 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(srcPos); 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task.numActivities--; 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = task; 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities++; 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p); 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(j); 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 1808621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * @return Returns the old activity that should be continued to be used, 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 1812621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord newR, int launchFlags) { 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 1838621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 1839621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 1840621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 1841621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 1842621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 1843621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1844621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 1845621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 1846621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1847621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 1848621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 1849621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(ret); 186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 1876621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Completely remove all activities associated with an existing task. 1877621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 1878621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn private final void performClearTaskLocked(int taskId) { 1879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int i = mHistory.size(); 1880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 1881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // First find the requested task. 1882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 1883621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 1884621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 1885621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId == taskId) { 1886621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 1887621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 1888621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1890621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 1891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Now clear it. 1892621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 1893621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 1894621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 1895621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 1896621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 1897621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1898621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 1899621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // We hit the bottom. Now finish it all... 1900621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 1901621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 1902621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 1903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 1904621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Whoops hit the end. 1905621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 1906621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1907621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 1908621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 1909621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1910621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 1911621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 1912621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 1913621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1914621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1915621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 1916621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1917621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1918621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 1919621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 1920621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord candidate = (ActivityRecord)mHistory.get(i); 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newTop = (ActivityRecord)mHistory.remove(where); 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord oldTop = (ActivityRecord)mHistory.get(top-1); 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 1960621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity) { 1961efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 1962efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn int err = START_SUCCESS; 1963efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 1964efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn ProcessRecord callerApp = null; 1965efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (caller != null) { 1966efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 1967efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (callerApp != null) { 1968efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingPid = callerApp.pid; 1969efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingUid = callerApp.info.uid; 1970efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } else { 1971efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 1972efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 1973efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + intent.toString()); 1974efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn err = START_PERMISSION_DENIED; 1975efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 1976efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 1977efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 1978efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS) { 1979efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.i(TAG, "Starting: " + intent + " from pid " 1980efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + (callerApp != null ? callerApp.pid : callingPid)); 1981efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Sending result to " + resultTo + " (index " + index + ")"); 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = (ActivityRecord)mHistory.get(index); 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2016efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS && intent.getComponent() == null) { 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 20386c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn callingUid, aInfo.applicationInfo.uid, aInfo.exported); 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 20456c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn String msg; 20466c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn if (!aInfo.exported) { 20476c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 20486c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 20496c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 20506c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " not exported from uid " + aInfo.applicationInfo.uid; 20516c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } else { 20526c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 20536c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 20546c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 20556c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " requires " + aInfo.permission; 20566c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 2090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (outActivity != null) { 2091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn outActivity[0] = r; 2092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return startActivityUncheckedLocked(r, sourceRecord, 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2127621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontFromLaunchLocked(int launchFlags) { 2128621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2129621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2130621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2131621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Caller wants to appear on home activity, so before starting 2132621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // their own activity we will bring home to the front. 2133621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontLocked(); 2134621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2135621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2136621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 214350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 2210621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord reuseTask = null; 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 224166a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru if (curTop != null && curTop.task != taskTop.task) { 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 2248621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 225650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2267621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2268621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 2269621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 2270621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // The caller has requested to completely replace any 22717da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // existing task with its new activity. Well that should 2272621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // not be too hard... 2273621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask = taskTop.task; 2274621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn performClearTaskLocked(taskTop.task.taskId); 2275621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask.setIntent(r.intent, r.info); 2276621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2284621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn taskTop.task.taskId, r, launchFlags); 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 229439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 231939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 233050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 233150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 233350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2345621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (!addingToTask && reuseTask == null) { 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 24047da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean keepCurTransition = false; 240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2409621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (reuseTask == null) { 2410621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // todo: should do better management of integers. 2411621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask++; 2412621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mService.mCurTask <= 0) { 2413621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask = 1; 2414621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2415621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn r.task = new TaskRecord(mService.mCurTask, r.info, intent); 2416621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 2417621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " in new task " + r.task); 2418621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2419621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn r.task = reuseTask; 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 2422621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2431621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn sourceRecord.task.taskId, r, launchFlags); 24327da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn keepCurTransition = true; 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 243539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 245239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = sourceRecord.task; 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N > 0 ? (ActivityRecord)mHistory.get(N-1) : null; 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = prev != null 2474621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ? prev.task 2475621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent); 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 248039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 248139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 248239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 24837e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 248439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 248539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 248639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 248739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 24887e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 248939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 24947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn startActivityLocked(r, newTask, doResume, keepCurTransition); 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2498621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo resolveActivity(Intent intent, String resolvedType, boolean debug) { 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2527621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return aInfo; 2528621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2529621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2530621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, int callingUid, 2531621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 2532621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int grantedMode, IBinder resultTo, 2533621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 2534621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean debug, WaitResult outResult, Configuration config) { 2535621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2536621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2537621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2538621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2539621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2540621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2541621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2542621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2543621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2544621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2545621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 2546621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedType, debug); 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 2550621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2551621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2552621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 256754e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 2591621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn realCallingUid, null, null, 0, new Intent[] { intent }, 2592621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 2637621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn onlyIfNeeded, componentSpecified, null); 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, null); 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2660ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2676ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2688621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivities(IApplicationThread caller, int callingUid, 2689621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent[] intents, String[] resolvedTypes, IBinder resultTo) { 2690621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents == null) { 2691621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("intents is null"); 2692621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2693621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (resolvedTypes == null) { 2694621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("resolvedTypes is null"); 2695621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2696621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents.length != resolvedTypes.length) { 2697621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("intents are length different than resolvedTypes"); 2698621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2699621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2700621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord[] outActivity = new ActivityRecord[1]; 2701621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2702621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int callingPid; 2703621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2704621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2705621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 2706621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = Binder.getCallingPid(); 2707621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingUid = Binder.getCallingUid(); 2708621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2709621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = callingUid = -1; 2710621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2711621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 2712621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn try { 2713621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn synchronized (mService) { 2714621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2715621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=0; i<intents.length; i++) { 2716621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent = intents[i]; 2717621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent == null) { 2718621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2719621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2720621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2721621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2722621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2723621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2724621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2725621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2726621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2727621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2728621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2729621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2730621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2731621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 2732621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], false); 2733621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2734621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags 2735621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2736621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException( 2737621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "FLAG_CANT_SAVE_STATE not supported here"); 2738621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2739621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2740621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedTypes[i], 2741621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, 0, aInfo, resultTo, null, -1, callingPid, callingUid, 2742621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn false, componentSpecified, outActivity); 2743621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (res < 0) { 2744621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return res; 2745621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2746621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2747621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn resultTo = outActivity[0]; 2748621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2749621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2750621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } finally { 2751621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Binder.restoreCallingIdentity(origId); 2752621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2753621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2754621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return IActivityManager.START_SUCCESS; 2755621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2756621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 27897e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleSendResult(r, list); 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags); 283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(s, false); 287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!s.waitingVisible && remove) { 287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityIdleInternal(IBinder token, boolean fromTimeout, 289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (token != null) { 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, token); 290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 292650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 292750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mBooted && !fromTimeout) { 295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Finishing activity: token=" + token 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this the last activity left? 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean lastActivity = true; 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!p.finishing && p != r) { 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastActivity = false; 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the last activity, but it is the home activity, then 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just don't finish it. 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastActivity) { 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities--; 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = (ActivityRecord)mHistory.get(index+1); 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // send the result 311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultTo = r.resultTo; 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 3117a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.packageName, resultData, 3118a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.getUriPermissionsLocked()); 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultData); 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because clients have remote IPC references to this object so we 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || ((ActivityRecord)mHistory.get(index-1)).task != r.task; 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 31487da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int index = indexOfTokenLocked(r); 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return destroyActivityLocked(r, true) ? null : r; 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices) { 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void removeActivityFromHistoryLocked(ActivityRecord r) { 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 328694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = false; 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.removeAppToken(r); 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removeFromApp) { 332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityLocked(r, false); 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(r.app, true, false); 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleDestroyActivity(r, r.finishing, 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token); 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3441621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 3442621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Move the current home activity's task (if one exists) to the front 3443621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * of the stack. 3444621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 3445621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontLocked() { 3446621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord homeTask = null; 3447621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 3448621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord hr = (ActivityRecord)mHistory.get(i); 3449621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (hr.isHomeActivity) { 3450621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn homeTask = hr.task; 345194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn break; 3452621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3453621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3454621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (homeTask != null) { 3455621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveTaskToFrontLocked(homeTask, null); 3456621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3457621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3458621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3459621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top < 0 || ((ActivityRecord)mHistory.get(top)).task.taskId == task) { 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(0, r); 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 34987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 34997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 35057da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 35067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false); 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(r); 357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 358150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 358250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 358350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 358450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 35857da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 35867da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 358750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 359050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 35927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 35937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); 359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 359950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 360350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 360450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 360550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 360950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configuration == newConfig) { 363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 363750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 363850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 364050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 364150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 364250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 364350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 364450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 364550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 364650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 364750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 364850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 365450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 365650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 366050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 366150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36623c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Figure out what has changed between the two configurations. 36633c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn int changes = oldConfig.diff(newConfig); 36643c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 36653c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 36663c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 36673c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(r.info.configChanges) 36683c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + ", newConfig=" + newConfig); 36693c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } 36703c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if ((changes&(~r.info.configChanges)) != 0) { 36713c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 36723c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags |= changes; 36733c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 36743c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (r.app == null || r.app.thread == null) { 36753c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 36763c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is destroying non-running " + r); 36773c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn destroyActivityLocked(r, true); 36783c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 36793c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // A little annoying: we are waiting for this activity to 36803c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // finish pausing. Let's not do anything now, but just 36813c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // flag that it needs to be restarted when done pausing. 36823c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 36833c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is skipping already pausing " + r); 36843c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configDestroy = true; 36853c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return true; 36863c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 36873c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Try to optimize this case: the configuration is changing 36883c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // and we need to restart the top, resumed activity. 36893c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Instead of doing the normal handshaking, just say 36903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // "restart!". 36913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 36923c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting resumed " + r); 36933c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 36943c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 36953c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else { 36963c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 36973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting non-resumed " + r); 36983c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 36993c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37013c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn 37023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // All done... tell the caller we weren't able to keep this 37033c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // activity around. 37043c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return false; 370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 370750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r); 371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 372250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 372350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 372950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 373050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 373250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r, results, newIntents, 374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn changes, !andResume, mService.mConfiguration); 374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 3764