ActivityStack.java revision 54e570f78b45d6c47578a4a2513097b590b6d43f
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; 4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri; 5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 5150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Bundle; 5250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpublic class ActivityStack { 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 7750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 10250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // 30 minutes. 10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 1000*60*30; 10450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1050dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1060dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1070dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1080dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 11450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 11650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 11750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mHistory = new ArrayList(); 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList mLRUActivities = new ArrayList(); 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 17250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 17350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2200dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2210dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2220dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2260dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 23750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 23950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 24150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 25750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 25850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + token); 25950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityPaused(token, null, true); 26050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 26150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 26250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 26350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 27250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + token); 27350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, true, null); 27450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 27550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 27650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 27750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 27850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 27950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + token); 28050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityDestroyed(token); 28150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 28250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, false, null); 28550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 28650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 29250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 29550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 29650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 29750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 29950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 32650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 33050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && (token != r) && (taskId != r.task.taskId)) { 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int count = mHistory.size(); 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // convert the token to an entry in the history. 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = -1; 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=count-1; i>=0; i--) { 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Object o = mHistory.get(i); 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (o == token) { 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn index = i; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return index; 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 40750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 40950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 41050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 41150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 41250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 41450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 41650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 41750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 41850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 44150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.mayFreezeScreenLocked(app) ? r : null); 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, r); 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r, 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info, r.icicle, results, newIntents, !andResume, 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 51854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 56850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.haveState = false; 56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 57150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 57450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 57550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 57650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 57850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 57950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 58050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 58850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 58950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 59550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6000dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 6010dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 6030dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void pauseIfSleepingLocked() { 62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mSleeping || mService.mShuttingDown) { 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not currently pausing an activity, get the current 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one to pause. If we are pausing one, we will just let that stuff 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // run and release the wake lock when all done. 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause..."); 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 66150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 66250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.configChangeFlags); 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 68850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 69850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 71450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 71550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 72350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 72450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 72550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 72650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityPaused(IBinder token, Bundle icicle, boolean timeout) { 73050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 73150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Activity paused: token=" + token + ", icicle=" + icicle 73250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", timeout=" + timeout); 73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 73550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 73650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 73750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 73850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 73950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(index); 74050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!timeout) { 74150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = icicle; 74250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.haveState = true; 74350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 74450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 74550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 74650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 74750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 74850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 74950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 75050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 75150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 75250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 75350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 75750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 75850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 76150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 76250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 76350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 76450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 76550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 76650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 76750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 76850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 77150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 77250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 77350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 77450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 77550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 77650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 77750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 77850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 77950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(prev, true); 78250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 78350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 78450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 78550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 78650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 78750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 78850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 78950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 79050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 79150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 79250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 79550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 79650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 79750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 79950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 80150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 80250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mGoingToSleep.isHeld()) { 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.release(); 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mShuttingDown) { 80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 81550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 81650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 81750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 82350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 82750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 82850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 84250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 84350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 84750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 84950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.thumbnail = null; 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 91350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 92050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 92350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 92450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 95250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, true); 96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, false); 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 107650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11040dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 11050dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 11060dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1107034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1108034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1109034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1110034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1111034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1112034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1113034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1114034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1115034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1116034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1117034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1118034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1119034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1120034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1121034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1122034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1123034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1124034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1125034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1126034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 11270dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1128034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 11290dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 11300dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 11310dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 11320dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE); 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN); 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(next, true); 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next : null); 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updated = mService.updateConfigurationLocked(config, next); 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleSendResult(next, a); 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next); 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 128550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 128650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleResumeActivity(next, 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pauseIfSleepingLocked(); 129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 129850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 129950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 130050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 130150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 130250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 130350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.labelRes, next.icon, null, true); 130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null, 132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.labelRes, next.icon, null, true); 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doResume) { 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 136650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 137450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 137550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 13900dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = true; 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities++; 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 141350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 141450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN); 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos, r, r.task.taskId, r.info.screenOrientation, r.fullscreen); 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 145450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 145550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r, r.packageName, r.theme, r.nonLocalizedLabel, 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.labelRes, r.icon, prev, showStartingIcon); 146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 147250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 150050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 150150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord below = i >= 0 ? (ActivityRecord)mHistory.get(i) : null; 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 155950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(0); 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task = p.task; 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task = new TaskRecord(mService.mCurTask, target.info, null, 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(target, task.taskId); 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities--; 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = target.task; 159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.numActivities++; 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p); 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 161350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(target.task); 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ((ActivityRecord)mHistory.get( 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (target.resultTo != null) { 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p = (ActivityRecord)mHistory.get(srcPos); 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(srcPos); 171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task.numActivities--; 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn p.task = task; 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn task.numActivities++; 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p); 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(j); 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the old activity that should be continue to be used, 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newR, int launchFlags, boolean doClear) { 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(i); 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doClear) { 180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i < (mHistory.size()-1)) { 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r = (ActivityRecord)mHistory.get(i); 181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear")) { 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(ret); 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord candidate = (ActivityRecord)mHistory.get(i); 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newTop = (ActivityRecord)mHistory.remove(where); 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord oldTop = (ActivityRecord)mHistory.get(top-1); 187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean componentSpecified) { 1884cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn Slog.i(TAG, "Starting: " + intent); 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Sending result to " + resultTo + " (index " + index + ")"); 189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = (ActivityRecord)mHistory.get(index); 189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int err = START_SUCCESS; 192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (intent.getComponent() == null) { 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = null; 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && caller != null) { 193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callerApp.pid; 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = callerApp.info.uid; 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_PERMISSION_DENIED; 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid, aInfo.exported ? -1 : aInfo.applicationInfo.uid); 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String msg = "Permission Denial: starting " + intent.toString() 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", uid=" + callingUid + ")" 196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " requires " + aInfo.permission; 196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 200850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return startActivityUncheckedLocked(r, sourceRecord, 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 206650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 206750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 206950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 207050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 207150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 207350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 207450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 207550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 207650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 207750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 207850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 207950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 208050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 208150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 208250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 208350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 208450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 208550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 208650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 208750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 208850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 208950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 209050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 209150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 209250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 209350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 209450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 210250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (curTop.task != taskTop.task) { 213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 214350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 214550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 216450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.taskId, r, launchFlags, true); 217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 218139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask) { 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 225650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // todo: should do better management of integers. 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = new TaskRecord(mService.mCurTask, r.info, intent, 230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new task " + r.task); 230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 230650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(r.task); 230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.task.taskId, r, launchFlags, true); 231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 231939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 233050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 233150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 233350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 233639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = sourceRecord.task; 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N > 0 ? (ActivityRecord)mHistory.get(N-1) : null; 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task = prev != null 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? prev.task 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent, 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0); 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 236439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 236539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 236639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 236739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 23687e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 236939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 237039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 237139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 237239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 23737e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 237439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startActivityLocked(r, newTask, doResume); 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, IBinder resultTo, 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean debug, WaitResult outResult, Configuration config) { 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Refuse possible leaked file descriptors 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't modify the client's object! 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = new Intent(intent); 239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 240950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingUid; 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller == null) { 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 244554e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid, null, null, 0, intent, 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType, PendingIntent.FLAG_CANCEL_CURRENT 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded, componentSpecified); 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateConfigurationLocked(config, null); 252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn wait(); 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn wait(); 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 25987e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleSendResult(r, list); 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 262650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags); 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 264650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 266350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(s, false); 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!s.waitingVisible && remove) { 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityIdleInternal(IBinder token, boolean fromTimeout, 270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 270950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 271050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (token != null) { 271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, token); 271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 274150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mBooted && !fromTimeout) { 276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 276650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Finishing activity: token=" + token 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this the last activity left? 285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean lastActivity = true; 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = (ActivityRecord)mHistory.get(i); 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!p.finishing && p != r) { 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastActivity = false; 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the last activity, but it is the home activity, then 286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just don't finish it. 286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastActivity) { 287050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 288150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.finishing = true; 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.numActivities--; 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = (ActivityRecord)mHistory.get(index+1); 289750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 291150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 291250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 291350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 291450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 291550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 291750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 291850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // send the result 291950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultTo = r.resultTo; 292050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 292150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 292250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 292350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 292450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 292550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 2926a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.packageName, resultData, 2927a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.getUriPermissionsLocked()); 292850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 292950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 293050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultData); 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because clients have remote IPC references to this object so we 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || ((ActivityRecord)mHistory.get(index-1)).task != r.task; 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE); 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 296350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int index = indexOfTokenLocked(r); 298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return destroyActivityLocked(r, true) ? null : r; 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices) { 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void removeActivityFromHistoryLocked(ActivityRecord r) { 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.inHistory = false; 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.removeAppToken(r); 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removeFromApp) { 313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityLocked(r, false); 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.persistent) { 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.decPersistentCountLocked(r.app); 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(r.app, true, false); 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleDestroyActivity(r, r.finishing, 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token); 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(index); 321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top < 0 || ((ActivityRecord)mHistory.get(top)).task.taskId == task) { 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean first = true; 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(0, r); 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (first && mMainStack) { 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.addRecentTaskLocked(r.task); 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn first = false; 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT); 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)mHistory.get(pos); 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(r); 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); 338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_BACK); 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configuration == newConfig) { 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 344150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't persistent, there is a chance we will 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // need to restart it. 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.persistent) { 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out what has changed between the two configurations. 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes = oldConfig.diff(newConfig); 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + Integer.toHexString(r.info.configChanges) 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", newConfig=" + newConfig); 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((changes&(~r.info.configChanges)) != 0) { 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags |= changes; 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is destroying non-running " + r); 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn destroyActivityLocked(r, true); 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A little annoying: we are waiting for this activity to 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish pausing. Let's not do anything now, but just 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // flag that it needs to be restarted when done pausing. 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is skipping already pausing " + r); 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = true; 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Try to optimize this case: the configuration is changing 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and we need to restart the top, resumed activity. 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Instead of doing the normal handshaking, just say 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "restart!". 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is restarting resumed " + r); 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Switch is restarting non-resumed " + r); 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // All done... tell the caller we weren't able to keep this 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity around. 350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r); 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r, results, newIntents, 354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn changes, !andResume, mService.mConfiguration); 354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 3562