ActivityStack.java revision 90c52de28691ca0bbbf7c039ef20f85ce46882cc
150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/* 250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * you may not use this file except in compliance with the License. 650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * You may obtain a copy of the License at 750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 1050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * See the License for the specific language governing permissions and 1450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * limitations under the License. 1550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornpackage com.android.server.am; 1850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.app.HeavyWeightSwitcherActivity; 2050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.internal.os.BatteryStatsImpl; 2150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 2250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.Activity; 240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.ActivityManager; 2550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.AppGlobals; 2650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager; 270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornimport android.app.IThumbnailRetriever; 2850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_CLASS_NOT_FOUND; 2950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_DELIVERED_TO_TOP; 3050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 3150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_INTENT_NOT_RESOLVED; 3250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_PERMISSION_DENIED; 3350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_RETURN_INTENT_TO_CALLER; 3450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SUCCESS; 3550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_SWITCHES_CANCELED; 3650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport static android.app.IActivityManager.START_TASK_TO_FRONT; 3750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IApplicationThread; 3850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.PendingIntent; 3950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.ResultInfo; 4050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.app.IActivityManager.WaitResult; 4150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.ComponentName; 4250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Context; 4350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IIntentSender; 4450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.Intent; 4550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.IntentSender; 4650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ActivityInfo; 4750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ApplicationInfo; 4850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.PackageManager; 4950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.pm.ResolveInfo; 5050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.content.res.Configuration; 510aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.content.res.Resources; 520aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 5350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.net.Uri; 5450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Binder; 55ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackbornimport android.os.Bundle; 5650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Handler; 5750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.IBinder; 5850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.Message; 5962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport android.os.ParcelFileDescriptor; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackbornimport java.io.IOException; 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 7550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack { 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 79b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn static final boolean DEBUG_STATES = false; 90ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 10050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 10150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // How long we can hold the sleep wake lock before giving up. 1034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT = 5*1000; 1044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 10550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 10650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 10750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 11150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 113621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // disabled. 114621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 11550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1160dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1170dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1180dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1190dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 14350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 15050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>(); 15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 17050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 1714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * List of activities that are in the process of going to sleep. 1724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 1734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn final ArrayList<ActivityRecord> mGoingToSleepActivities 1744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn = new ArrayList<ActivityRecord>(); 1754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 1764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 23550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2370dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2380dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2390dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2400dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2410dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2420dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2430dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 25650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 2584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * Set when we have taken too long waiting to go to sleep. 2594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 2604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn boolean mSleepTimeout = false; 2614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 26290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn /** 26390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn * Dismiss the keyguard after the next activity is displayed? 26490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn */ 26590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn boolean mDismissKeyguardOnNextActivity = false; 26690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 2670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailWidth = -1; 2680aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailHeight = -1; 2690aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 2704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT_MSG = 8; 27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 27250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 27350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 27450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 27550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 27650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 27750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 27850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 27950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 28050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 28150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 28250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 28350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 28450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 2854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn case SLEEP_TIMEOUT_MSG: { 2868e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn synchronized (mService) { 2878e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (mService.isSleeping()) { 2888e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Slog.w(TAG, "Sleep timeout! Sleeping now."); 2898e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn mSleepTimeout = true; 2908e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn checkReadyForSleepLocked(); 2918e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 2924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 2934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } break; 29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 29550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 29650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 29750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 29850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + token); 2990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn activityPaused(token, true); 30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + token); 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, true, null); 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + token); 32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityDestroyed(token); 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, false, null); 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 32650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 33050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 35650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 36850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 38950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && (token != r) && (taskId != r.task.taskId)) { 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 40050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 40250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 40450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 407ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn try { 408ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = (ActivityRecord)token; 409ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return mHistory.indexOf(r); 410ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } catch (ClassCastException e) { 411ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn Slog.w(TAG, "Bad activity token: " + token, e); 412ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return -1; 41350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 414ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 41550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 416ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final ActivityRecord isInStackLocked(IBinder token) { 417ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn try { 418ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = (ActivityRecord)token; 419ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (mHistory.contains(r)) { 420ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return r; 421ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 422ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } catch (ClassCastException e) { 423ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn Slog.w(TAG, "Bad activity token: " + token, e); 424ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 425ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return null; 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(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 TaskRecord cp = null; 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 48550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 49950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 50450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 50550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 50636cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn final void showAskCompatModeDialogLocked(ActivityRecord r) { 50736cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn Message msg = Message.obtain(); 50836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG; 50936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.obj = r.task.askedCompatMode ? null : r; 51036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn mService.mHandler.sendMessage(msg); 51136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn } 51236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 52350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 52750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.mayFreezeScreenLocked(app) ? r : null); 53031ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn mService.updateConfigurationLocked(config, r, false); 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 5340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn app.waitingToKill = null; 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 56050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 56150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 56250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 56450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 56550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 5674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 568e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 56936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(r); 5708ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 57162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn String profileFile = null; 57262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ParcelFileDescriptor profileFd = null; 57362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean profileAutoStop = false; 57462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 57562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (mService.mProfileProc == null || mService.mProfileProc == app) { 57662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.mProfileProc = app; 57762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile = mService.mProfileFile; 57862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = mService.mProfileFd; 57962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop = mService.mAutoStopProfiler; 58062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 58162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 582f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn app.hasShownUi = true; 583c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn app.pendingUiClean = true; 58462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFd != null) { 58562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn try { 58662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = profileFd.dup(); 58762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } catch (IOException e) { 58862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFd = null; 58962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 59062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r, 59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 5938ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.info, r.compat, r.icicle, results, newIntents, !andResume, 59462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.isNextTransitionForward(), profileFile, profileFd, 59562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileAutoStop); 59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59754e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 62050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 62150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 62550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 62650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 62750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 62950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 63550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 63650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 64250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 64350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 646ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r 647ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting new instance)"); 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 65188819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 65288819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(r.task); 65388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 6554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 661ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 662ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting in stopped state)"); 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 66450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.icicle = null; 6680aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.haveState = false; 6690aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 67250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6870dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 6880dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 68950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 6900dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 69750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 6986c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn app.addPackage(r.info.packageName); 69950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 70050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 70150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 70250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 70450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 70650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 70750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 70850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 70950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 71050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 71150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 71250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 71350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7144eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void stopIfSleepingLocked() { 7154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 71650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 71750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 71850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 71950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 72050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 72150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 72250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 7234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG); 7254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT); 7264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 72950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void awakeFromSleepingLocked() { 7314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mSleepTimeout = false; 7334eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 7344eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 7354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Ensure activities are no longer sleeping. 7374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(false); 7404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.clear(); 7424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void activitySleptLocked(ActivityRecord r) { 7454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 7464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void checkReadyForSleepLocked() { 7504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 7514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Do not care. 7524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mSleepTimeout) { 7564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mResumedActivity != null) { 7574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still have something resumed; can't sleep until it is paused. 7584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity); 75950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 76050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 7614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mPausingActivity != null) { 7644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still waiting for something to pause; can't sleep yet. 7654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity); 7664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mStoppingActivities.size() > 0) { 7704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to stop; can't sleep yet. 7714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 7724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mStoppingActivities.size() + " activities"); 77380a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 7744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn ensureActivitiesVisibleLocked(null, 0); 7784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Make sure any stopped but visible activities are now sleeping. 7804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // This ensures that the activity's onStop() is called. 7814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7834eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) { 7844eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 7854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7874eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleepActivities.size() > 0) { 7894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to sleep; can't sleep yet. 7904eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 7914eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mGoingToSleepActivities.size() + " activities"); 7924eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 79350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 79450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 7954eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 7994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 8004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 8014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.mShuttingDown) { 8024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mService.notifyAll(); 8034eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 806d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn public final Bitmap screenshotActivities(ActivityRecord who) { 807ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn if (who.noDisplay) { 808ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn return null; 809ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn } 810ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn 8110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Resources res = mService.mContext.getResources(); 8120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int w = mThumbnailWidth; 8130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int h = mThumbnailHeight; 8140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w < 0) { 8150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailWidth = w = 8160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width); 8170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailHeight = h = 8180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height); 8190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 8210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w > 0) { 8227c8a4b37765b7b491ab7979d589062ef546212bfDianne Hackborn return mService.mWindowManager.screenshotApplications(who, w, h); 8230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 8250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 82750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 82850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 840ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev); 841ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 84250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 84350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 847f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn prev.updateThumbnail(screenshotActivities(prev), null); 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 84950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.configChangeFlags); 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 88750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 88950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 89950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 90050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final void activityPaused(IBinder token, boolean timeout) { 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 9130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn TAG, "Activity paused: token=" + token + ", timeout=" + timeout); 91450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 91650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 91750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 91850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 91950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 9200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(index); 92150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 92250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 923ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r 924ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + (timeout ? " (due to timeout)" : " (pause complete)")); 92550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 92650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 92750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 92850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 937ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail, 938ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn CharSequence description) { 939ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.icicle = icicle; 940ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.haveState = true; 941ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.updateThumbnail(thumbnail, description); 942ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.stopped = true; 943ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)"); 944ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.STOPPED; 945ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (!r.finishing) { 946ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.configDestroy) { 947ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 948ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn resumeTopActivityLocked(null); 949ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 950ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 951ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 952ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 96350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 96450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 97450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 976ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(prev, true, false); 97750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 98480a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 9854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 9864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9964eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 9994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 103550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1057f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn next.clearThumbnail(); 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 10980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 113250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 11544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 1155905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn r.app.pendingUiClean = true; 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, true); 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 116050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 11830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, false); 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 126350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 127550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 127650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 127750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 127850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 127950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 128050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 128150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 128350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 128450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 12854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(next); 12864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 128750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 128850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 128950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 129050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 129150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 129250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 129350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 129450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 129550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 129650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 129750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12980dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 12990dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 13000dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1301034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1302034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1303034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1304034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1305034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1306034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1307034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1308034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1309034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1310034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1311034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1312034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1313034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1314034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1315034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1316034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1317034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1318034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1319034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1320034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 13210dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1322034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 13230dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 13240dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13250dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13260dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 134250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 134350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 134450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 134550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 134650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 134750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 134850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 134950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 135050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 135150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 135250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 136150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1365e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // Launching this app's activity, make sure the app is no longer 1366e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // considered stopped. 1367e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn try { 1368e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 1369e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn next.packageName, false); 1370e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } catch (RemoteException e1) { 1371a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn } catch (IllegalArgumentException e) { 1372a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 1373a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn + next.packageName + ": " + e); 1374e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 1375e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 137950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 13847da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13857da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 13897da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); 139050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 139350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 139450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 13977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 14027da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 140950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 14137da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14147da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 141550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 14167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 14177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(next, true); 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 143050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1432ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)"); 143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 143688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 143788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(next.task); 143888819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next : null); 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145331ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn updated = mService.updateConfigurationLocked(config, next, false); 145450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 147250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 147750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 148250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 148650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 148750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleSendResult(next, a); 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next); 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 149750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 149850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 150136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(next); 1502905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn next.app.pendingUiClean = true; 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleResumeActivity(next, 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 1510ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to " 1511ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + lastState + ": " + next); 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 15212f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 15222f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15247eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15257eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 153550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 153650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 153850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 153950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null, 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 155050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 15592f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 15602f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15627eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15637eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 157050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 15747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean doResume, boolean keepCurTransition) { 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 15830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 158950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1594f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 16130dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 161950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 162050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 162450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1626f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 162950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 16437da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 16447da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 16487da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition); 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 16537da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos, r, r.task.taskId, r.info.screenOrientation, r.fullscreen); 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 166150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 166250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 166350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 166450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 16852f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r, r.packageName, r.theme, 16862f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 16872f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r.info.applicationInfo), r.nonLocalizedLabel, 16887eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn r.labelRes, r.icon, r.windowFlags, prev, showStartingIcon); 168950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 170850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 1713621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (ACTIVITY_INACTIVE_RESET_TIME > 0 1714621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 17320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord below = i >= 0 ? mHistory.get(i) : null; 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 176250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 176850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 177650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 177750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 17860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(0); 178750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 178950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 1792f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(p.task, p.thumbHolder, false); 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 179550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 179650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1800f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(new TaskRecord(mService.mCurTask, target.info, null), 1801f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn null, false); 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(target, task.taskId); 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 1811f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ThumbnailHolder curThumbHolder = target.thumbHolder; 181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 18130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 1819f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(target.task, curThumbHolder, false); 1820f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn curThumbHolder = p.thumbHolder; 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p); 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 182650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 183650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 18500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn (mHistory.get( 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 18600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (target.resultTo != null) { 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 189650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 191450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 19200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 192550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 19380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(srcPos); 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 194350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 1949f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(task, null, false); 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p); 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 19670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(j); 196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 197450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 198450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 199450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 1998621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * @return Returns the old activity that should be continued to be used, 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 2002621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord newR, int launchFlags) { 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 200450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 200550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 200650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 200750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 20080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 200950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 201050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 201150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 201250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 201550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 20180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 2028621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 2029621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 20300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 2031621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2032621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2033621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2034621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2035621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2036621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2037621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 2038621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 2039621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 204450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 204550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 204650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 204750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 204850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 204950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(ret); 205050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 205150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 205250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 205350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 205550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 205750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 205850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 205950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 206250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 206350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 206450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 206550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * Completely remove all activities associated with an existing 20670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * task starting at a specified index. 20680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn */ 20690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private final void performClearTaskAtIndexLocked(int taskId, int i) { 20700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (i < (mHistory.size()-1)) { 20710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 20720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.task.taskId != taskId) { 20730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Whoops hit the end. 20740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return; 20750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.finishing) { 20770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 20780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 20790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED, 20810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn null, "clear")) { 20820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 20830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 20870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn /** 2088621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Completely remove all activities associated with an existing task. 2089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 2090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn private final void performClearTaskLocked(int taskId) { 2091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int i = mHistory.size(); 2092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2093621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // First find the requested task. 2094621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2095621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 20960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2097621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId == taskId) { 2098621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 2099621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2100621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2101621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2102621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 21030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Now find the start and clear it. 2104621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2105621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 21060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2107621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2108621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2109621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2110621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2111621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // We hit the bottom. Now finish it all... 21120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, i+1); 2113621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 2114621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2115621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2116621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2117621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2118621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 211950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 212150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 21260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord candidate = mHistory.get(i); 212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 213550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 213650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 213750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 213850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 213950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 214050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 214150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 214250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 21430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord newTop = mHistory.remove(where); 214450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 21450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord oldTop = mHistory.get(top-1); 214650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 214750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 214850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 214950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 215050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 215150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 215250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 215350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 215450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 215550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 2158621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity) { 2159efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2160efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn int err = START_SUCCESS; 2161efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2162efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn ProcessRecord callerApp = null; 2163efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (caller != null) { 2164efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 2165efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (callerApp != null) { 2166efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingPid = callerApp.pid; 2167efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingUid = callerApp.info.uid; 2168efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } else { 2169efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 2170efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 2171efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + intent.toString()); 2172efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn err = START_PERMISSION_DENIED; 2173efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2174efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2175efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2176efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS) { 217790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn Slog.i(TAG, "START {" + intent.toShortString(true, true, true) + "} from pid " 2178efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + (callerApp != null ? callerApp.pid : callingPid)); 2179efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Sending result to " + resultTo + " (index " + index + ")"); 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 21880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sourceRecord = mHistory.get(index); 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 219050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2214efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS && intent.getComponent() == null) { 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 222050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 222150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 222250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 222350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 222450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 222550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 222650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 222750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 222850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 222950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 223050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 22376c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn callingUid, aInfo.applicationInfo.uid, aInfo.exported); 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 22456c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn String msg; 22466c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn if (!aInfo.exported) { 22476c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 22486c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 22496c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 22506c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " not exported from uid " + aInfo.applicationInfo.uid; 22516c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } else { 22526c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 22536c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 22546c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 22556c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " requires " + aInfo.permission; 22566c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 226450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 226550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 226650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 228290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 2291621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (outActivity != null) { 2292621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn outActivity[0] = r; 2293621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 230150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 230250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 230350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 230450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 230550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 230690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 230750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 230850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 231050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 231950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 232590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, 232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 232790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mDismissKeyguardOnNextActivity && mPausingActivity == null) { 232890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // Someone asked to have the keyguard dismissed on the next 232990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // activity start, but we are not actually doing an activity 233090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // switch... just dismiss the keyguard now, because we 233190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn // probably want to see whatever is behind it. 233290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 233390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 233490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 233590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn return err; 233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2338621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontFromLaunchLocked(int launchFlags) { 2339621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2340621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2341621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2342621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Caller wants to appear on home activity, so before starting 2343621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // their own activity we will bring home to the front. 2344621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontLocked(); 2345621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2346621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2347621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 238450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 240950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 241550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 2421621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord reuseTask = null; 242250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 244150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 244250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 244350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 244450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 244550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 244650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 244750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 244850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 244950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 245050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 245266a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru if (curTop != null && curTop.task != taskTop.task) { 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 245850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 2459621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2478621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2479621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 2480621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 2481621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // The caller has requested to completely replace any 24827da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // existing task with its new activity. Well that should 2483621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // not be too hard... 2484621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask = taskTop.task; 2485621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn performClearTaskLocked(taskTop.task.taskId); 2486621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask.setIntent(r.intent, r.info); 2487621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 249350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2495621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn taskTop.task.taskId, r, launchFlags); 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 250539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 251950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2556621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (!addingToTask && reuseTask == null) { 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 256150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 257850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 258350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 258450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 258550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 258650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 258750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 258850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 258950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 259050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 259150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 259350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 259650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 260550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 260650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 260950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 26157da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean keepCurTransition = false; 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2620621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (reuseTask == null) { 2621621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // todo: should do better management of integers. 2622621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask++; 2623621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mService.mCurTask <= 0) { 2624621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask = 1; 2625621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2626f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true); 2627621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 2628621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " in new task " + r.task); 2629621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2630f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(reuseTask, reuseTask, true); 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 2633621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 263650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2642621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn sourceRecord.task.taskId, r, launchFlags); 26437da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn keepCurTransition = true; 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 264639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 264750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 264850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 264950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 265350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 265550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 265650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 265750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 265850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 265950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 266050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 266150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 266250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 266339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 266850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 267250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 2673f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false); 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 26830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn N > 0 ? mHistory.get(N-1) : null; 2684f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(prev != null 2685621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ? prev.task 2686f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent), null, true); 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 269139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 269239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 269339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 26947e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 269539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 269639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 269739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 269839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 26997e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 270039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 270150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 270250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 270350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 27057da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn startActivityLocked(r, newTask, doResume, keepCurTransition); 270650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 270750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 270962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo resolveActivity(Intent intent, String resolvedType, boolean debug, 271062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn String profileFile, ParcelFileDescriptor profileFd, boolean autoStopProfiler) { 271150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 271250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 271350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 271450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 271550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 271650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 271750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 271850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 271950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 272050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 272550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 272650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273862f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 273962f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (profileFile != null) { 274062f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn if (!aInfo.processName.equals("system")) { 274162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 274262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile, profileFd, autoStopProfiler); 274362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 274462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn } 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2746621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return aInfo; 2747621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2748621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2749621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, int callingUid, 2750621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 2751621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int grantedMode, IBinder resultTo, 2752621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 275362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean debug, String profileFile, ParcelFileDescriptor profileFd, 275462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn boolean autoStopProfiler, WaitResult outResult, Configuration config) { 2755621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2756621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2757621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2758621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2759621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2760621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2761621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2762621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2763621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2764621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2765621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 276662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedType, debug, 276762f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn profileFile, profileFd, autoStopProfiler); 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 2771621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2772621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2773621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 278854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 281150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 2812621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn realCallingUid, null, null, 0, new Intent[] { intent }, 2813621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 282350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 283450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 285050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 2858621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn onlyIfNeeded, componentSpecified, null); 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 286250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 286350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 286450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 286550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 286650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 286750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 286850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 286950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 287031ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn mService.updateConfigurationLocked(config, null, false); 287150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 287250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 287350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 287450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 287550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 287650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 287750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 287850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 287950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 288050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2881ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 288250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 288350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 288450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 288550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 288650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 288750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 288850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 288950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 289050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 289150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 289250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 289350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 289450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 289550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 289650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2897ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 289850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 289950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 290150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 290550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 290650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 290850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2909621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivities(IApplicationThread caller, int callingUid, 2910621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent[] intents, String[] resolvedTypes, IBinder resultTo) { 2911621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents == null) { 2912621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("intents is null"); 2913621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2914621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (resolvedTypes == null) { 2915621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("resolvedTypes is null"); 2916621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2917621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents.length != resolvedTypes.length) { 2918621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("intents are length different than resolvedTypes"); 2919621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2920621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2921621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord[] outActivity = new ActivityRecord[1]; 2922621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2923621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int callingPid; 2924621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2925621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2926621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 2927621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = Binder.getCallingPid(); 2928621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingUid = Binder.getCallingUid(); 2929621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2930621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = callingUid = -1; 2931621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2932621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 2933621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn try { 2934621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn synchronized (mService) { 2935621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2936621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=0; i<intents.length; i++) { 2937621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent = intents[i]; 2938621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent == null) { 2939621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2940621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2941621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2942621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2943621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2944621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2945621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2946621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2947621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2948621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2949621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2950621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2951621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2952621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 295362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], false, 295462f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn null, null, false); 2955621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2956621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags 2957621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2958621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException( 2959621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "FLAG_CANT_SAVE_STATE not supported here"); 2960621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2961621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2962621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedTypes[i], 2963621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, 0, aInfo, resultTo, null, -1, callingPid, callingUid, 2964621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn false, componentSpecified, outActivity); 2965621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (res < 0) { 2966621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return res; 2967621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2968621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2969621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn resultTo = outActivity[0]; 2970621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2971621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2972621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } finally { 2973621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Binder.restoreCallingIdentity(origId); 2974621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2975621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2976621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return IActivityManager.START_SUCCESS; 2977621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2978621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 300150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 300250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 300490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 300590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn if (mDismissKeyguardOnNextActivity) { 300690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = false; 300790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mService.mWindowManager.dismissKeyguard(); 300890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 301250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 30167e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 302050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 302350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleSendResult(r, list); 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 3054ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3055ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (stop requested)"); 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 305750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags); 30634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 30644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 30654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 3073ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r); 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 3076ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 309450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(s, false); 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 31104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if ((!s.waitingVisible || mService.isSleeping()) && remove) { 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312580a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn final void scheduleIdleLocked() { 312680a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn Message msg = Message.obtain(); 312780a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn msg.what = IDLE_NOW_MSG; 312880a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn mHandler.sendMessage(msg); 312980a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn } 313080a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn 313162f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn final ActivityRecord activityIdleInternal(IBinder token, boolean fromTimeout, 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 313562f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn ActivityRecord res = null; 313662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (token != null) { 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, token); 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 31550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 315662f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn res = r; 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 318950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 319329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn if (!mService.mBooted) { 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 322650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 3251ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 326650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327262f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn 327362f20ecf492d2b29881bba307c79ff55e68760e6Dianne Hackborn return res; 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Finishing activity: token=" + token 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this the last activity left? 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean lastActivity = true; 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 32950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 329650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!p.finishing && p != r) { 329750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastActivity = false; 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the last activity, but it is the home activity, then 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just don't finish it. 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastActivity) { 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 332250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 332750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 33300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord next = mHistory.get(index+1); 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // send the result 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultTo = r.resultTo; 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 3360a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.packageName, resultData, 3361a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.getUriPermissionsLocked()); 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultData); 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because clients have remote IPC references to this object so we 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 338050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 338150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 338450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 338550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 33860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn || (mHistory.get(index-1)).task != r.task; 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 33917da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 339950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 340750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int index = indexOfTokenLocked(r); 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 343750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 343850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 343950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 344050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 344180a7ac10634dabb39644004f3edfc648a2c036f7Dianne Hackborn scheduleIdleLocked(); 34424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 34434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3446ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3447ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (finish requested)"); 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 34554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 3461ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r); 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 3469ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return destroyActivityLocked(r, true, true) ? null : r; 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 347350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 347850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 348050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 348150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 348250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 3487ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices, 3488ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean setState) { 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3499ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (setState) { 3500ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)"); 3501ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.DESTROYED; 3502ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3503ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 350850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 350950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 351050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 351150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 351250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 351350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 351450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 351550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 351650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 351850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 351950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 352250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 352350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 35350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void removeActivityFromHistoryLocked(ActivityRecord r) { 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 354094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 354150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 3542f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.takeFromHistory(); 3543ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3544ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (removed from history)"); 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.removeAppToken(r); 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 355950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3570ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj) { 3571ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 3572ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = mHistory.get(i); 3573ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (owner != null && r.app != owner) { 3574ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn continue; 3575ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3576ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // We can destroy this one if we have its icicle saved and 3577ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it is not in the process of pausing/stopping/finishing. 3578ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.app != null && r.haveState && !r.visible && r.stopped && !r.finishing 3579ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYING 3580ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYED) { 3581ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, oomAdj); 3582ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3583ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3584ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3585ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 358650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 358750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 358850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 358950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 359050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 359250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 3593ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean removeFromApp, boolean oomAdj) { 359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 359950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 360050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3603ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn cleanUpActivityLocked(r, false, false); 360450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 360550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 360950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 361050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 3621ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn mService.updateLruProcessLocked(r.app, oomAdj, false); 362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 362850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleDestroyActivity(r, r.finishing, 363050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 363750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 363850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 363950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 364050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 364150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 364250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 364350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 364450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 364550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3646ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // If the activity is finishing, we need to wait on removing it 3647ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // from the list to give it a chance to do its cleanup. During 3648ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // that time it may make calls back with its token so we need to 3649ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // be able to find it on the list and so we don't want to remove 3650ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it from the list yet. Otherwise, we can just immediately put 3651ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it in the destroyed state since we are not removing it from the 3652ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // list. 365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 3654ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r 3655ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy requested)"); 365650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 366050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3661ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3662ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy skipped)"); 366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 366450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 366550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 366650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 366750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 366850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 366950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 367050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3671ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3672ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (no app)"); 367350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 367450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 367550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 367650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 367750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 367850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 367950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 368050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 368150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 368450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 368550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 368750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token); 368950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 369050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 36920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 370550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 370750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 37224eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app); 372350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3727621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 3728621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Move the current home activity's task (if one exists) to the front 3729621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * of the stack. 3730621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 3731621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontLocked() { 3732621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord homeTask = null; 3733621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 37340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord hr = mHistory.get(i); 3735621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (hr.isHomeActivity) { 3736621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn homeTask = hr.task; 373794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn break; 3738621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3739621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3740621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (homeTask != null) { 3741621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveTaskToFrontLocked(homeTask, null); 3742621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3743621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3744621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3745621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (top < 0 || (mHistory.get(top)).task.taskId == task) { 375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 37670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(0, r); 377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 37847da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 37857da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 37917da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 37927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false); 379350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 379450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 379550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 379650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 379750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 379850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 380950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 381050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 381650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 381750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 382850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 382950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 383050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 383150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 383250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 383350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 383450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 383550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 383650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 383750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 383850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 383950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 384050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 384350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 384450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 384550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 384650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 384750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 384850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 384950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 385050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 385150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 385250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 385350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 385450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 385550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 38560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 385750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 385850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 385950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 386050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 386150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 386250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 386350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(r); 386450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 386550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 386650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 386750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 386850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 386950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 387050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 38717da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38727da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 387350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 387450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 387550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 387650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 387750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 38787da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); 388050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 388150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 388250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 388350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 388450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 388550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 388650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 388750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 388850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 388950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) { 38910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true); 38920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 38930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed != null && resumed.thumbHolder == tr) { 38940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = resumed.stack.screenshotActivities(resumed); 38950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 38960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = tr.lastThumbnail; 38970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info; 38990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex) { 39020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false); 39030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (info.root == null) { 39040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId); 39050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex < 0) { 39090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Just remove the entire task. 39100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, info.rootIndex); 39110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info.root; 39120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex >= info.subtasks.size()) { 39150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex); 39160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Remove all of this task's activies starting at the sub task. 39200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex); 39210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, subtask.index); 39220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return subtask.activity; 39230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) { 39260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 39270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final TaskAccessInfo thumbs = new TaskAccessInfo(); 39280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // How many different sub-thumbnails? 39290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final int NA = mHistory.size(); 39300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn int j = 0; 39310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ThumbnailHolder holder = null; 39320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 39330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 39340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!ar.finishing && ar.task.taskId == taskId) { 39350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 39360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 39370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 39390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (j >= NA) { 39420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 39430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.root = mHistory.get(j); 39460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.rootIndex = j; 39470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 39480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>(); 39490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.subtasks = subtasks; 39500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord lastActivity = null; 39510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 39520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 39530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 39540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.finishing) { 39550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 39560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.task.taskId != taskId) { 39580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 39590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastActivity = ar; 39610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.thumbHolder != holder && holder != null) { 39620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.numSubThumbbails++; 39630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 39640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask(); 39650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = holder.lastThumbnail; 39660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.activity = ar; 39670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.index = j-1; 39680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn subtasks.add(sub); 39690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastActivity != null && subtasks.size() > 0) { 39720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed == lastActivity) { 39730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1); 39740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity); 39750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (thumbs.numSubThumbbails > 0) { 39780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.retriever = new IThumbnailRetriever.Stub() { 39790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public Bitmap getThumbnail(int index) { 39800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (index < 0 || index >= thumbs.subtasks.size()) { 39810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs.subtasks.get(index).thumbnail; 39840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }; 39860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 39880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 399050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 399150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 399250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 399350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 399450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 399550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 399650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 399750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 399850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 399950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 400050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 400150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 400250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 400350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 400450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 400550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 400650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 400750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 400850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 400950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 401050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 401150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 401250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 401350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 401450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 401550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 401650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 401750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 401850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 401950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 4020e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (r.configuration == newConfig && !r.forceNewConfig) { 402150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 402250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 402350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 402450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 402550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 402650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 402750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 402850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 402950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 403050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 403150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 403250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 403850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 403950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 404050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 404150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 404250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 404350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 4045e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 40493c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Figure out what has changed between the two configurations. 40503c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn int changes = oldConfig.diff(newConfig); 40513c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 40523c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 40533c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 4054e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn + Integer.toHexString(r.info.getRealConfigChanged()) 40553c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + ", newConfig=" + newConfig); 40563c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } 4057e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) { 40583c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 40593c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags |= changes; 40603c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 4061e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 40623c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (r.app == null || r.app.thread == null) { 40633c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40643c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is destroying non-running " + r); 4065ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 40663c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 40673c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // A little annoying: we are waiting for this activity to 40683c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // finish pausing. Let's not do anything now, but just 40693c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // flag that it needs to be restarted when done pausing. 40703c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40713c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is skipping already pausing " + r); 40723c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configDestroy = true; 40733c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return true; 40743c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 40753c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Try to optimize this case: the configuration is changing 40763c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // and we need to restart the top, resumed activity. 40773c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Instead of doing the normal handshaking, just say 40783c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // "restart!". 40793c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40803c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting resumed " + r); 40813c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 40823c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 40833c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else { 40843c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40853c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting non-resumed " + r); 40863c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 40873c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40893c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn 40903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // All done... tell the caller we weren't able to keep this 40913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // activity around. 40923c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return false; 409350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 409550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 409650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 409750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 409850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 409950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 410050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 410150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 410250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 410350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r); 410450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 410550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 410650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 410750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 410850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 410950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 411050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 411150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 411250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 411350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 411450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 411550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 411650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 411750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 411850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 411950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 412050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 412150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 412250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 412350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 412450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 412550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 412650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 412750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 412850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 412950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 413050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 413150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 4132e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 413350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r, results, newIntents, 413450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn changes, !andResume, mService.mConfiguration); 413550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 413650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 413750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 413850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 413950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 414050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 414150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 414250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 414350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 414450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 414550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 414650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 414750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 414850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 414950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 415050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 415150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 415290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn 415390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn public void dismissKeyguardOnNextActivityLocked() { 415490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn mDismissKeyguardOnNextActivity = true; 415590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn } 415650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 4157