ActivityStack.java revision 8e8d65ff5fdef12c6af3d003dfef19aadc39bea9
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; 5950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.PowerManager; 6050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.RemoteException; 6150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.os.SystemClock; 6250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.EventLog; 6350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Log; 6450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.util.Slog; 6550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport android.view.WindowManagerPolicy; 6650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.lang.ref.WeakReference; 6850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.ArrayList; 6950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.Iterator; 7050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackbornimport java.util.List; 7150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn/** 7350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * State and management of a single stack of activities. 7450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackbornfinal class ActivityStack { 7650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final String TAG = ActivityManagerService.TAG; 77b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn static final boolean localLOGV = ActivityManagerService.localLOGV; 7850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_SWITCH = ActivityManagerService.DEBUG_SWITCH; 7950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_PAUSE = ActivityManagerService.DEBUG_PAUSE; 8050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_VISBILITY = ActivityManagerService.DEBUG_VISBILITY; 8150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_USER_LEAVING = ActivityManagerService.DEBUG_USER_LEAVING; 8250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TRANSITION = ActivityManagerService.DEBUG_TRANSITION; 8350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_RESULTS = ActivityManagerService.DEBUG_RESULTS; 8450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_CONFIGURATION = ActivityManagerService.DEBUG_CONFIGURATION; 8550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean DEBUG_TASKS = ActivityManagerService.DEBUG_TASKS; 8650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn static final boolean DEBUG_STATES = false; 88ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 8950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS; 9050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity telling us it 9250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is idle. 9350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT = 10*1000; 9450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on the last activity to pause. This 9650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is short because it directly impacts the responsiveness of starting the 9750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // next activity. 9850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT = 500; 9950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // How long we can hold the sleep wake lock before giving up. 1014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT = 5*1000; 1024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 10350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we can hold the launch wake lock before giving up. 10450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT = 10*1000; 10550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 10650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long we wait until giving up on an activity telling us it has 10750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finished destroying itself. 10850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT = 10*1000; 10950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 11050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // How long until we reset a task when the user returns to it. Currently 111621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // disabled. 112621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn static final long ACTIVITY_INACTIVE_RESET_TIME = 0; 11350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1140dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // How long between activity launches that we consider safe to not warn 1150dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // the user about an unexpected activity being launched on top. 1160dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn static final long START_WARN_TIME = 5*1000; 1170dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 11850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Set to false to disable the preview that is shown while a new activity 11950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is being started. 12050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final boolean SHOW_APP_STARTING_PREVIEW = true; 12150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enum ActivityState { 12350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn INITIALIZING, 12450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RESUMED, 12550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSING, 12650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PAUSED, 12750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPING, 12850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn STOPPED, 12950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISHING, 13050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYING, 13150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn DESTROYED 13250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 13350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityManagerService mService; 13550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean mMainStack; 13650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Context mContext; 13850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 13950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The back history of all previous (and possibly still 14150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * running) activities. It contains HistoryRecord objects. 14250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); 14450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 14650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of running activities, sorted by recent usage. 14750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * The first entry in the list is the least recently used. 14850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * It contains HistoryRecord objects. 14950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 1500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<ActivityRecord>(); 15150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 15250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 15350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are waiting for a new activity 15450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to become visible before completing whatever operation they are 15550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * supposed to do. 15650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 15750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mWaitingVisibleActivities 15850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 15950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 16150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be stopped, but waiting 16250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the next activity to settle down before doing so. It contains 16350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 16450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 16550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mStoppingActivities 16650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 16750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 16850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 1694eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * List of activities that are in the process of going to sleep. 1704eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 1714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn final ArrayList<ActivityRecord> mGoingToSleepActivities 1724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn = new ArrayList<ActivityRecord>(); 1734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 1744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 17550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Animations that for the current transition have requested not to 17650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * be considered for the transition animation. 17750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 17850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mNoAnimActivities 17950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 18050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 18250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of activities that are ready to be finished, but waiting 18350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for the previous activity to settle down before doing so. It contains 18450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * HistoryRecord objects. 18550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 18650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> mFinishingActivities 18750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<ActivityRecord>(); 18850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 18950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next launched activity. 19150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched 19350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 19450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 19550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 19650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * List of people waiting to find out about the next visible activity. 19750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 19850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible 19950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn = new ArrayList<IActivityManager.WaitResult>(); 20050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when the system is going to sleep, until we have 20350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * successfully paused the current activity and released our wake lock. 20450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * At that point the system is allowed to actually sleep. 20550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 20650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mGoingToSleep; 20750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 20850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * We don't want to allow the device to go to sleep while in the process 21050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of launching an activity. This is primarily to allow alarm intent 21150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * receivers to launch an activity and get that to run before the device 21250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * goes back to sleep. 21350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 21450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final PowerManager.WakeLock mLaunchingActivity; 21550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 21650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 21750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * When we are in the process of pausing an activity, before starting the 21850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * next one, this variable holds the activity that is currently being paused. 21950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mPausingActivity = null; 22150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 22350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is the last activity that we put into the paused state. This is 22450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * used to determine if we need to do an activity transition while sleeping, 22550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * when we normally hold the top activity paused. 22650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 22750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mLastPausedActivity = null; 22850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 22950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 23050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Current activity that is resumed, or null if there is none. 23150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 23250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord mResumedActivity = null; 23350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 23450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 2350dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * This is the last activity that has been started. It is only used to 2360dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * identify when multiple activities are started at once so that the user 2370dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn * can be warned they may not be in the activity they think they are. 2380dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn */ 2390dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn ActivityRecord mLastStartedActivity = null; 2400dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 2410dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn /** 24250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set when we know we are going to be calling updateConfiguration() 24350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * soon, so want to skip intermediate config checks. 24450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 24550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mConfigWillChange; 24650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 24750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 24850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Set to indicate whether to issue an onUserLeaving callback when a 24950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * newly launched activity is being brought in front of us. 25050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 25150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean mUserLeaving = false; 25250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 25350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long mInitialStartTime = 0; 25450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn /** 2564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn * Set when we have taken too long waiting to go to sleep. 2574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn */ 2584eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn boolean mSleepTimeout = false; 2594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 2600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailWidth = -1; 2610aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int mThumbnailHeight = -1; 2620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 2634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn static final int SLEEP_TIMEOUT_MSG = 8; 26450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int PAUSE_TIMEOUT_MSG = 9; 26550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_TIMEOUT_MSG = 10; 26650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int IDLE_NOW_MSG = 11; 26750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int LAUNCH_TIMEOUT_MSG = 16; 26850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int DESTROY_TIMEOUT_MSG = 17; 26950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn static final int RESUME_TOP_ACTIVITY_MSG = 19; 27050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 27150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Handler mHandler = new Handler() { 27250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //public Handler() { 27350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if (localLOGV) Slog.v(TAG, "Handler started!"); 27450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //} 27550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 27650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn public void handleMessage(Message msg) { 27750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn switch (msg.what) { 2784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn case SLEEP_TIMEOUT_MSG: { 2798e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn synchronized (mService) { 2808e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (mService.isSleeping()) { 2818e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Slog.w(TAG, "Sleep timeout! Sleeping now."); 2828e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn mSleepTimeout = true; 2838e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn checkReadyForSleepLocked(); 2848e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 2854eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 2864eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } break; 28750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case PAUSE_TIMEOUT_MSG: { 28850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 28950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 29050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 29150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity pause timeout for " + token); 2920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn activityPaused(token, true); 29350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 29450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_TIMEOUT_MSG: { 29550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 29650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 29750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 29850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn nmsg.obj = msg.obj; 29950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 30050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 30150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 30350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 30450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 30550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity idle timeout for " + token); 30650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, true, null); 30750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 30850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case DESTROY_TIMEOUT_MSG: { 30950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 31050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't at this point know if the activity is fullscreen, 31150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so we need to be conservative and assume it isn't. 31250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity destroy timeout for " + token); 31350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityDestroyed(token); 31450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 31550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case IDLE_NOW_MSG: { 31650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IBinder token = (IBinder)msg.obj; 31750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn activityIdleInternal(token, false, null); 31850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 31950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case LAUNCH_TIMEOUT_MSG: { 32050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidDexOpt) { 32150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidDexOpt = false; 32250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message nmsg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 32350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(nmsg, LAUNCH_TIMEOUT); 32450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 32550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 32750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 32850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 32950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 33050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 33350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn case RESUME_TOP_ACTIVITY_MSG: { 33450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 33550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 33650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } break; 33850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 33950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 34050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn }; 34150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 34250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityStack(ActivityManagerService service, Context context, boolean mainStack) { 34350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService = service; 34450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mContext = context; 34550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mMainStack = mainStack; 34650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PowerManager pm = 34750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (PowerManager)context.getSystemService(Context.POWER_SERVICE); 34850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 34950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 35050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.setReferenceCounted(false); 35150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 35250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 35350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(ActivityRecord notTop) { 35450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 35550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 35750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r != notTop) { 35850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 35950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 36150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 36350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 36450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { 36650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 36750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 36950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && !r.delayedResume && r != notTop) { 37050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 37150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 37350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 37550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 37650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 37750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 37850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * This is a simplified version of topRunningActivityLocked that provides a number of 37950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * optional skip-over modes. It is intended for use with the ActivityController hook only. 38050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 38150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param token If non-null, any history records matching this token will be skipped. 38250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param taskId If non-zero, we'll attempt to skip over records with the same task ID. 38350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 38450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns the HistoryRecord of the next activity on the stack. 38550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 38650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { 38750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size()-1; 38850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 3890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 39050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: the taskId check depends on real taskId fields being non-zero 39150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && (token != r) && (taskId != r.task.taskId)) { 39250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 39350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 39550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 39750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 39850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int indexOfTokenLocked(IBinder token) { 400ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn try { 401ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = (ActivityRecord)token; 402ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return mHistory.indexOf(r); 403ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } catch (ClassCastException e) { 404ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn Slog.w(TAG, "Bad activity token: " + token, e); 405ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return -1; 40650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 40850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 409ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final ActivityRecord isInStackLocked(IBinder token) { 410ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn try { 411ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = (ActivityRecord)token; 412ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (mHistory.contains(r)) { 413ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return r; 414ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 415ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } catch (ClassCastException e) { 416ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn Slog.w(TAG, "Bad activity token: " + token, e); 417ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 418ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return null; 41950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean updateLRUListLocked(ActivityRecord r) { 42250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadit = mLRUActivities.remove(r); 42350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLRUActivities.add(r); 42450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return hadit; 42550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 42650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 42750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 42850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the top activity in any existing task matching the given 42950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Intent. Returns null if no such task is found. 43050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 43150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) { 43250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 43350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 43450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 43550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 43650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord cp = null; 43850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 43950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 44050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 44250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing && r.task != cp 44350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 44450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cp = r.task; 44550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() 44650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + "/aff=" + r.task.affinity + " to new cls=" 44750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); 44850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity != null) { 44950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.affinity.equals(info.taskAffinity)) { 45050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching affinity!"); 45150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 45250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 45350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.intent != null 45450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.intent.getComponent().equals(cls)) { 45550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 45650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 45750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 45850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 45950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.task.affinityIntent != null 46050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.task.affinityIntent.getComponent().equals(cls)) { 46150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 46250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 46350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 46450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 46550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 46850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 46950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 47050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 47150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 47250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 47350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the first activity (starting from the top of the stack) that 47450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is the same as the given activity. Returns null if no such activity 47550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * is found. 47650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 47750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 47850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ComponentName cls = intent.getComponent(); 47950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (info.targetActivity != null) { 48050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cls = new ComponentName(info.packageName, info.targetActivity); 48150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 48250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 48350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 48450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=(N-1); i>=0; i--) { 4850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 48650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 48750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.getComponent().equals(cls)) { 48850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Found matching class!"); 48950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 49050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); 49150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 49250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 49750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 49850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 49936cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn final void showAskCompatModeDialogLocked(ActivityRecord r) { 50036cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn Message msg = Message.obtain(); 50136cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.what = ActivityManagerService.SHOW_COMPAT_MODE_DIALOG_MSG; 50236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn msg.obj = r.task.askedCompatMode ? null : r; 50336cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn mService.mHandler.sendMessage(msg); 50436cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn } 50536cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn 50650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean realStartActivityLocked(ActivityRecord r, 50750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app, boolean andResume, boolean checkConfig) 50850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throws RemoteException { 50950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 51050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(app, 0); 51150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 51250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 51350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 51450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. Note that 51550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a result of this, it can call back into the activity 51650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager with a new orientation. We don't care about that, 51750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because the activity is not currently running so we are 51850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just restarting it anyway. 51950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkConfig) { 52050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 52150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 52250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.mayFreezeScreenLocked(app) ? r : null); 52331ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn mService.updateConfigurationLocked(config, r, false); 52450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 52550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = app; 5270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn app.waitingToKill = null; 52850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 52950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Launching: " + r); 53050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = app.activities.indexOf(r); 53250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx < 0) { 53350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.add(r); 53450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 53550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 53650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 53750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 53850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.thread == null) { 53950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new RemoteException(); 54050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 54250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 54350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 54450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 54550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 54650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 54750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 54850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " icicle=" + r.icicle 54950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 55050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 55150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 55250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 55350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 55450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 55550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.isHomeActivity) { 55750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHomeProcess = app; 55850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 55950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 5604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 561e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 56236cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(r); 5638ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 564f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn app.hasShownUi = true; 565c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn app.pendingUiClean = true; 56650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.thread.scheduleLaunchActivity(new Intent(r.intent), r, 56750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 5688ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn r.info, r.compat, r.icicle, results, newIntents, !andResume, 56950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 57050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 57154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 57250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Note that the package 57350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // manager will ensure that only activity can run in the main 57450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process of the .apk, which is the only thing that will be 57550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // considered heavy-weight. 57650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app.processName.equals(app.info.packageName)) { 57750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null 57850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mHeavyWeightProcess != app) { 57950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Log.w(TAG, "Starting new heavy weight process " + app 58050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " when already running " 58150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mService.mHeavyWeightProcess); 58250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 58350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = app; 58450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mService.mHandler.obtainMessage( 58550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 58650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 58750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendMessage(msg); 58850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 58950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 59050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 59150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 59250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.launchFailed) { 59350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second time we failed -- finish activity 59450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and give up. 59550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Second failure launching " 59650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString() 59750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", giving up", e); 59850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.appDiedLocked(app, app.pid, app.thread); 59950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 60050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "2nd-crash"); 60150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 60250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 60450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the first time we failed -- restart process and 60550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // retry. 60650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn app.activities.remove(r); 60750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw e; 60850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 60950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.launchFailed = false; 61150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (updateLRUListLocked(r)) { 61250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r 61350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " being launched, but already in LRU list"); 61450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 61550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 61650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 61750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // As part of the process of launching, ActivityThread also performs 61850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a resume. 61950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.RESUMED; 620ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + r 621ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting new instance)"); 62250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 62350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = r; 62450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.touchActiveTime(); 62588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 62688819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(r.task); 62788819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 62850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(r); 6294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 63050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 63150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not starting in the resumed state... which 63250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should look like we asked it to pause+stop (but remain visible), 63350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and it has done so and reported back the current icicle and 63450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // other state. 635ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 636ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (starting in stopped state)"); 63750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 63850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 63950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 64050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6410aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.icicle = null; 6420aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn r.haveState = false; 6430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 64450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launch the new version setup screen if needed. We do this -after- 64550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // launching the initial activity (that is, home), so that it can have 64650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a chance to initialize itself while in the background, making the 64750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switch back to it faster and look better. 64850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 64950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startSetupActivityLocked(); 65050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 65250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 65350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 65450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 65550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startSpecificActivityLocked(ActivityRecord r, 65650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean andResume, boolean checkConfig) { 65750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this activity's application already running? 65850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord app = mService.getProcessRecordLocked(r.processName, 65950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.applicationInfo.uid); 66050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6610dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn if (r.launchTime == 0) { 6620dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn r.launchTime = SystemClock.uptimeMillis(); 66350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mInitialStartTime == 0) { 6640dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mInitialStartTime = r.launchTime; 66550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mInitialStartTime == 0) { 66750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mInitialStartTime = SystemClock.uptimeMillis(); 66850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 66950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 67050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (app != null && app.thread != null) { 67150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 6726c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn app.addPackage(r.info.packageName); 67350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realStartActivityLocked(r, app, andResume, checkConfig); 67450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 67550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 67650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception when starting activity " 67750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent().flattenToShortString(), e); 67850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 67950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If a dead object exception was thrown -- fall through to 68150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // restart the application. 68250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 68450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 68550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "activity", r.intent.getComponent(), false); 68650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 68750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 6884eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void stopIfSleepingLocked() { 6894eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 69050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mGoingToSleep.isHeld()) { 69150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mGoingToSleep.acquire(); 69250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mLaunchingActivity.isHeld()) { 69350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 69450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 69550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 69650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 6974eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 6984eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn Message msg = mHandler.obtainMessage(SLEEP_TIMEOUT_MSG); 6994eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.sendMessageDelayed(msg, SLEEP_TIMEOUT); 7004eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7014eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7024eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 70350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 7044eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void awakeFromSleepingLocked() { 7054eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7064eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mSleepTimeout = false; 7074eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 7084eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 7094eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Ensure activities are no longer sleeping. 7114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7134eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(false); 7144eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7154eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.clear(); 7164eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7174eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7184eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void activitySleptLocked(ActivityRecord r) { 7194eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 7204eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 7214eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7224eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7234eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn void checkReadyForSleepLocked() { 7244eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 7254eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Do not care. 7264eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7274eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7284eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7294eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mSleepTimeout) { 7304eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mResumedActivity != null) { 7314eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still have something resumed; can't sleep until it is paused. 7324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause " + mResumedActivity); 73350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false"); 73450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, true); 7354eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7364eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7374eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mPausingActivity != null) { 7384eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still waiting for something to pause; can't sleep yet. 7394eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still waiting to pause " + mPausingActivity); 7404eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7414eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7424eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7434eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mStoppingActivities.size() > 0) { 7444eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to stop; can't sleep yet. 7454eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 7464eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mStoppingActivities.size() + " activities"); 7474eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn Message msg = Message.obtain(); 7484eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn msg.what = IDLE_NOW_MSG; 7494eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.sendMessage(msg); 7504eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 7514eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7524eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7534eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn ensureActivitiesVisibleLocked(null, 0); 7544eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7554eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Make sure any stopped but visible activities are now sleeping. 7564eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // This ensures that the activity's onStop() is called. 7574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 7580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 7594eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (r.state == ActivityState.STOPPING || r.state == ActivityState.STOPPED) { 7604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 7614eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleepActivities.size() > 0) { 7654eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn // Still need to tell some activities to sleep; can't sleep yet. 7664eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 7674eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn + mGoingToSleepActivities.size() + " activities"); 7684eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn return; 76950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 77050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 7714eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7724eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 7734eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn 7744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mGoingToSleep.isHeld()) { 7754eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleep.release(); 7764eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 7774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.mShuttingDown) { 7784eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mService.notifyAll(); 7794eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 78050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 78150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 782d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn public final Bitmap screenshotActivities(ActivityRecord who) { 783ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn if (who.noDisplay) { 784ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn return null; 785ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn } 786ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn 7870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Resources res = mService.mContext.getResources(); 7880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int w = mThumbnailWidth; 7890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int h = mThumbnailHeight; 7900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w < 0) { 7910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailWidth = w = 7920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width); 7930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn mThumbnailHeight = h = 7940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height); 7950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 7960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 7970aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (w > 0) { 7987c8a4b37765b7b491ab7979d589062ef546212bfDianne Hackborn return mService.mWindowManager.screenshotApplications(who, w, h); 7990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8000aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 8010aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 8020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 80350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { 80450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 80550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 80650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when pause is already pending for " 80750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + mPausingActivity, e); 80850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 80950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 81050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev == null) { 81150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn RuntimeException e = new RuntimeException(); 81250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.e(TAG, "Trying to pause when nothing is resumed", e); 81350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 81450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 81550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 816ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSING: " + prev); 817ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn else if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev); 81850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 81950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = prev; 82050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = prev; 82150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.state = ActivityState.PAUSING; 82250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.task.touchActiveTime(); 823f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn prev.updateThumbnail(screenshotActivities(prev), null); 82450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 82550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 82650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 82750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.app.thread != null) { 82850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev); 82950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 83050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY, 83150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(prev), 83250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.shortComponentName); 83350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, 83450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.configChangeFlags); 83550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 83650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateUsageStats(prev, false); 83750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 83850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 83950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ignore exception, if process died other code will cleanup. 84050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 84150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 84250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 84350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 84450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 84550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 84650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLastPausedActivity = null; 84750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 84850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 84950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not going to sleep, we want to ensure the device is 85050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // awake until the next activity is started. 85150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mSleeping && !mService.mShuttingDown) { 85250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.acquire(); 85350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 85450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To be safe, don't allow the wake lock to be held for too long. 85550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(LAUNCH_TIMEOUT_MSG); 85650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, LAUNCH_TIMEOUT); 85750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 85950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 86150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 86250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager pause its key dispatching until the new 86350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity has started. If we're pausing the activity just because 86450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen is being turned off and the UI is sleeping, don't interrupt 86550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // key dispatch; the same activity will pick it up again on wakeup. 86650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!uiSleeping) { 86750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.pauseKeyDispatchingLocked(); 86850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 86950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off"); 87050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 87150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 87250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Schedule a pause timeout in case the app doesn't respond. 87350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't give it much time because this directly impacts the 87450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // responsiveness seen by the user. 87550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG); 87650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = prev; 87750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT); 87850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete..."); 87950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 88050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity failed to schedule the 88150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // pause, so just treat it as being paused now. 88250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next."); 88350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 88450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 88650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 8870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final void activityPaused(IBinder token, boolean timeout) { 88850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v( 8890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn TAG, "Activity paused: token=" + token + ", timeout=" + timeout); 89050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = null; 89250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 89350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 89450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 89550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 8960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(index); 89750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 89850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == r) { 899ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to PAUSED: " + r 900ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + (timeout ? " (due to timeout)" : " (pause complete)")); 90150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.PAUSED; 90250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completePauseLocked(); 90350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 90450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, 90550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), r.shortComponentName, 90650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity != null 90750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? mPausingActivity.shortComponentName : "(none)"); 90850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 90950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 91250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 913ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void activityStoppedLocked(ActivityRecord r, Bundle icicle, Bitmap thumbnail, 914ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn CharSequence description) { 915ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.icicle = icicle; 916ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.haveState = true; 917ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.updateThumbnail(thumbnail, description); 918ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.stopped = true; 919ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)"); 920ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.STOPPED; 921ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (!r.finishing) { 922ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.configDestroy) { 923ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 924ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn resumeTopActivityLocked(null); 925ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 926ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 927ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 928ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 92950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completePauseLocked() { 93050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mPausingActivity; 93150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev); 93250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 93350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 93450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 93550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev); 93650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE); 93750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (prev.app != null) { 93850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev); 93950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.waitingVisible) { 94050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = false; 94150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(prev); 94250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v( 94350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Complete pause, no longer waiting: " + prev); 94450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 94550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.configDestroy) { 94650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The previous is being paused because the configuration 94750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is changing, which means it is actually stopping... 94850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // To juggle the fact that we are also starting a new 94950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance right now, we need to first completely stop 95050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the current instance before starting the new one. 95150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev); 952ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(prev, true, false); 95350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 95450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(prev); 95550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 95650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 95750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 95850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 95950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle"); 96050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 96150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 96250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 9634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 9644eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 96550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 96750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 96850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev); 96950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev = null; 97050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mPausingActivity = null; 97250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 9744eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (!mService.isSleeping()) { 97550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(prev); 97650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 9774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 97850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 97950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 98050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 98150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.resumeKeyDispatchingLocked(); 98250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 98350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 98450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.app != null && prev.cpuTimeAtResume > 0 98550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mBatteryStatsService.isOnBattery()) { 98650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long diff = 0; 98750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 98850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn diff = mService.mProcessStats.getCpuTimeForPid(prev.app.pid) 98950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn - prev.cpuTimeAtResume; 99050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 99150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (diff > 0) { 99250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl bsi = mService.mBatteryStatsService.getActiveStatistics(); 99350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (bsi) { 99450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn BatteryStatsImpl.Uid.Proc ps = 99550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bsi.getProcessStatsLocked(prev.info.applicationInfo.uid, 99650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.info.packageName); 99750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ps != null) { 99850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ps.addForegroundTimeLocked(diff); 99950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.cpuTimeAtResume = 0; // reset it 100450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 100550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 100650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 100750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Once we know that we have asked an application to put an activity in 100850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the resumed state (either by launching it or explicitly telling it), 100950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * this function updates the rest of our state to match that fact. 101050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 101150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void completeResumeLocked(ActivityRecord next) { 101250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.idle = false; 101350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.results = null; 101450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.newIntents = null; 101550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 101650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // schedule an idle timeout in case the app doesn't do it for us. 101750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 101850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 101950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 102050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 102150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 102250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity was never told to pause, so just keep 102350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // things going as-is. To maintain our own state, 102450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we need to emulate it coming back and saying it is 102550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // idle. 102650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg = mHandler.obtainMessage(IDLE_NOW_MSG); 102750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = next; 102850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 102950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 103150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 103250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(next); 103350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1035f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn next.clearThumbnail(); 103650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 103750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 103850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 103950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.resumeKeyDispatchingLocked(); 104050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 104150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 104250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 104350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 104450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Mark the point when the activity is resuming 104550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // TODO: To be more accurate, the mark should be before the onCreate, 104650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not after the onResume. But for subsequent starts, onResume is fine. 104750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null) { 104850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService.mProcessStatsThread) { 104950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = mService.mProcessStats.getCpuTimeForPid(next.app.pid); 105050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 105250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.cpuTimeAtResume = 0; // Couldn't get the cpu time of process 105350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 105550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 105650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 105750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure that all activities that need to be visible (that is, they 105850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * currently can be seen by the user) actually are. 105950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 106050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord top, 106150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord starting, String onlyThisProcess, int configChanges) { 106250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 106350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "ensureActivitiesVisible behind " + top 106450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " configChanges=0x" + Integer.toHexString(configChanges)); 106550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 106650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is not fullscreen, then we need to 106750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure any activities under it are now visible. 106850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int count = mHistory.size(); 106950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = count-1; 107050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (mHistory.get(i) != top) { 107150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 107250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 107350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r; 107450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean behindFullscreen = false; 107550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (; i>=0; i--) { 10760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 107750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 107850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make visible? " + r + " finishing=" + r.finishing 107950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state); 108050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 108150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 108250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 108350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean doThisProcess = onlyThisProcess == null 108550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName); 108650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 108750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First: if this is not the current activity being started, make 108850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure it matches the current configuration. 108950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting && doThisProcess) { 109050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivityConfigurationLocked(r, 0); 109150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 109250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 109350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 109450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyThisProcess == null 109550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || onlyThisProcess.equals(r.processName)) { 109650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity needs to be visible, but isn't even 109750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running... get it started, but don't resume it 109850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at this point. 109950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 110050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Start and freeze screen for " + r); 110150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 110250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, configChanges); 110350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 110550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 110650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Starting and making visible: " + r); 110750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 110850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 110950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != starting) { 111050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(r, false, false); 111150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 111250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 111350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 111450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.visible) { 111550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already visible, then there is nothing 111650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // else to do here. 111750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 111850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Skipping: already visible at " + r); 111950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 112050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 112150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (onlyThisProcess == null) { 112250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not currently visible, but is running. 112350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell it to become visible. 112450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = true; 112550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.RESUMED && r != starting) { 112650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is paused, tell it 112750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to now show its window. 112850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 112950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making visible and scheduling visibility: " + r); 113050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 113150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, true); 11324eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.sleeping = false; 113350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, true); 113450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 113550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 113650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 113750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 113850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making visibile: " 113950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 114050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 114350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 114450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Aggregate current change flags. 114550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn configChanges |= r.configChangeFlags; 114650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 114750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.fullscreen) { 114850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // At this point, nothing else needs to be shown 114950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 115050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping: fullscreen at " + r); 115150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 115250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 115350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 115450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 115650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 115750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now for any activities that aren't visible to the user, make 115850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure they no longer are keeping the screen frozen. 115950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i >= 0) { 11600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 116150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 116250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Make invisible? " + r + " finishing=" + r.finishing 116350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " state=" + r.state 116450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " behindFullscreen=" + behindFullscreen); 116550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 116650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (behindFullscreen) { 116750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.visible) { 116850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 116950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Making invisible: " + r); 117050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.visible = false; 117150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 117250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 117350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.state == ActivityState.STOPPING 117450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.state == ActivityState.STOPPED) 117550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && r.app != null && r.app.thread != null) { 117650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 117750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Scheduling invisibility: " + r); 117850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleWindowVisibility(r, false); 117950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 118150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just skip on any failure; we'll make it 118250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // visible when it next restarts. 118350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown making hidden: " 118450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + r.intent.getComponent(), e); 118550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 118650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 118750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 118850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Already invisible: " + r); 118950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.fullscreen) { 119150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 119250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Now behindFullscreen: " + r); 119350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn behindFullscreen = true; 119450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 119750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 119950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 120050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 120150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Version of ensureActivitiesVisible that can easily be called anywhere. 120250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 120350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void ensureActivitiesVisibleLocked(ActivityRecord starting, 120450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int configChanges) { 120550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 120650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 120750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(r, starting, null, configChanges); 120850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 120950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 121050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 121150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 121250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Ensure that the top activity in the stack is resumed. 121350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 121450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param prev The previously resumed activity, for when in the process 121550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * of pausing; can be null to call from elsewhere. 121650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 121750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if something is being resumed, or false if 121850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * nothing happened. 121950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 122050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean resumeTopActivityLocked(ActivityRecord prev) { 122150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Find the first activity that is not finishing. 122250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null); 122350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remember how we'll process this pause/resume situation, and ensure 122550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the state is reset however we wind up proceeding. 122650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean userLeaving = mUserLeaving; 122750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 122850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 122950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 123050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are no more activities! Let's just start up the 123150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Launcher... 123250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 123350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return mService.startHomeActivityLocked(); 123450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 123650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 123750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.delayedResume = false; 123850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 123950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity is the resumed one, nothing to do. 124050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == next && next.state == ActivityState.RESUMED) { 124150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 124250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 124350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 124450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 124550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 124650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 124750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 124850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are sleeping, and there is no resumed activity, and the top 124950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is paused, well that is the state we want. 125050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((mService.mSleeping || mService.mShuttingDown) 125150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mLastPausedActivity == next && next.state == ActivityState.PAUSED) { 125250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure we have executed any pending transitions, since there 125350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be nothing left to do at this point. 125450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 125550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 125650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 125750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 125850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 125950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity may be waiting for stop, but that is no longer 126050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // appropriate for it. 126150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(next); 12624eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(next); 12634eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 126450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(next); 126550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next); 126750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 126850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are currently pausing an activity, then don't do anything 126950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // until that is done. 127050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity != null) { 127150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity); 127250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 127350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 127450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 12750dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // Okay we are now going to start a switch, to 'next'. We may first 12760dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // have to pause the current activity, but this is an important point 12770dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn // where we have decided to go to 'next' so keep track of that. 1278034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // XXX "App Redirected" dialog is getting too many false positives 1279034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn // at this point, so turn off for now. 1280034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (false) { 1281034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (mLastStartedActivity != null && !mLastStartedActivity.finishing) { 1282034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn long now = SystemClock.uptimeMillis(); 1283034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final boolean inTime = mLastStartedActivity.startTime != 0 1284034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && (mLastStartedActivity.startTime + START_WARN_TIME) >= now; 1285034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int lastUid = mLastStartedActivity.info.applicationInfo.uid; 1286034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn final int nextUid = next.info.applicationInfo.uid; 1287034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn if (inTime && lastUid != nextUid 1288034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && lastUid != next.launchedFromUid 1289034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn && mService.checkPermission( 1290034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn android.Manifest.permission.STOP_APP_SWITCHES, 1291034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn -1, next.launchedFromUid) 1292034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 1293034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mService.showLaunchWarningLocked(mLastStartedActivity, next); 1294034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } else { 1295034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = now; 1296034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn mLastStartedActivity = next; 1297034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn } 12980dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } else { 1299034093a4ae94c0363cad36c60b41d41ea59420b1Dianne Hackborn next.startTime = SystemClock.uptimeMillis(); 13000dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn mLastStartedActivity = next; 13010dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13020dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn } 13030dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn 130450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We need to start pausing the current activity so the top one 130550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can be resumed... 130650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity != null) { 130750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); 130850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(userLeaving, false); 130950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 131050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 131150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 131250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null && prev != next) { 131350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!prev.waitingVisible && next != null && !next.nowVisible) { 131450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn prev.waitingVisible = true; 131550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.add(prev); 131650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 131750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Resuming top, waiting visible to hide: " + prev); 131850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 131950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is already visible, so hide the previous 132050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity's windows right now so we can show the new one ASAP. 132150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We only do this if the previous is finishing, which should mean 132250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is on top of the one being resumed so hiding it quickly 132350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is good. Otherwise, we want to do the normal route of allowing 132450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the resumed activity to be shown so we can decide if the 132550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // previous should actually be hidden depending on whether the 132650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // new one is found to be full-screen or not. 132750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 132850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 132950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: " 133050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 133150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 133250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 133350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 133450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: " 133550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + prev + ", waitingVisible=" 133650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + (prev != null ? prev.waitingVisible : null) 133750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", nowVisible=" + next.nowVisible); 133850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 133950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 134150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1342e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // Launching this app's activity, make sure the app is no longer 1343e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // considered stopped. 1344e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn try { 1345e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn AppGlobals.getPackageManager().setPackageStoppedState( 1346e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn next.packageName, false); 1347e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } catch (RemoteException e1) { 1348a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn } catch (IllegalArgumentException e) { 1349a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn Slog.w(TAG, "Failed trying to unstop package " 1350a925cd4101dceefae6b9c0634084f9fa72b12344Dianne Hackborn + next.packageName + ": " + e); 1351e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 1352e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn 135350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are starting up the next activity, so tell the window manager 135450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that the previous one will be hidden soon. This way it can know 135550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to ignore it when computing the desired screen orientation. 135650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 135750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.finishing) { 135850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 135950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: prev=" + prev); 136050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(prev)) { 13617da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13627da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 136350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 136450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 136550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE 13667da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); 136750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 136850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 136950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 137050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 137150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 137250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: prev=" + prev); 137350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 13747da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13757da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 137650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 137750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(prev.task == next.task 137850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 13797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); 138050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (false) { 138350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppWillBeHidden(prev); 138450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(prev, false); 138550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 138650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (mHistory.size() > 1) { 138750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 138850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: no previous"); 138950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mNoAnimActivities.contains(next)) { 13907da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13917da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 139250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 13937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 13947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); 139550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 139750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 139850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.app != null && next.app.thread != null) { 139950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next); 140050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is now becoming visible. 140250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(next, true); 140350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord lastResumedActivity = mResumedActivity; 140550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityState lastState = next.state; 140650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 140750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateCpuStats(); 140850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 1409ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to RESUMED: " + next + " (in existing)"); 141050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = ActivityState.RESUMED; 141150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = next; 141250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.touchActiveTime(); 141388819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn if (mMainStack) { 141488819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn mService.addRecentTaskLocked(next.task); 141588819b276b8a91943e7ff6f0509a87307562b30fDianne Hackborn } 141650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateLruProcessLocked(next.app, true, true); 141750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn updateLRUListLocked(next); 141850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 141950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Have the window manager re-evaluate the orientation of 142050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the screen based on the new activity order. 142150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean updated = false; 142250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 142350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 142450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( 142550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mConfiguration, 142650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.mayFreezeScreenLocked(next.app) ? next : null); 142750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 142850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frozenBeforeDestroy = true; 142950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143031ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn updated = mService.updateConfigurationLocked(config, next, false); 143150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 143350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!updated) { 143450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The configuration update wasn't able to keep the existing 143550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity, and instead started a new one. 143650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We should be all done, but let's just make sure our activity 143750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is still at the top and schedule another run if something 143850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // weird happened. 143950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord nextNext = topRunningActivityLocked(null); 144050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, 144150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Activity config changed during resume: " + next 144250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", new next: " + nextNext); 144350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (nextNext != next) { 144450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Do over! 144550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 144650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 144750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 144850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(next); 144950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 145150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.executeAppTransition(); 145250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.clear(); 145350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 145450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 145550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 145650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 145750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Deliver all pending results. 145850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList a = next.results; 145950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (a != null) { 146050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = a.size(); 146150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.finishing && N > 0) { 146250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 146350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Delivering results to " + next 146450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ": " + a); 146550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleSendResult(next, a); 146650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 146750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 146850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 146950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.newIntents != null) { 147050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleNewIntent(next.newIntents, next); 147150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 147250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 147350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, 147450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(next), 147550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.task.taskId, next.shortComponentName); 147650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14774eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn next.sleeping = false; 147836cd41f8efa6f6a683d3353d309ff548295af9e9Dianne Hackborn showAskCompatModeDialogLocked(next); 147950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.app.thread.scheduleResumeActivity(next, 148050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.isNextTransitionForward()); 148150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 14824eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 148350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 148450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 148550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 1486ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Resume failed; resetting state to " 1487ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + lastState + ": " + next); 148850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.state = lastState; 148950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = lastResumedActivity; 149050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "Restarting because process died: " + next); 149150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 149250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 149350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 149450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && mMainStack) { 149550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 149650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 14972f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 14982f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 149950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15007eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15017eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 150250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, false); 150550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 150650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 150750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 150850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // From this point on, if something goes wrong there is no way 150950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to recover the activity. 151050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 151150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.visible = true; 151250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn completeResumeLocked(next); 151350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 151450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If any exception gets thrown, toss away this 151550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity and try the next one. 151650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during resume of " + next, e); 151750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null, 151850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "resume-exception"); 151950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 152050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 152150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Didn't need to use the icicle, and it is now out of date. 152350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.icicle = null; 152450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.haveState = false; 152550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.stopped = false; 152650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 152750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 152850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Whoops, need to restart this activity! 152950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!next.hasBeenLaunched) { 153050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.hasBeenLaunched = true; 153150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 153250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW) { 153350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 153450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next, next.packageName, next.theme, 15352f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 15362f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn next.info.applicationInfo), 153750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.nonLocalizedLabel, 15387eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn next.labelRes, next.icon, next.windowFlags, 15397eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn null, true); 154050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next); 154250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startSpecificActivityLocked(next, true, true); 154450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 154650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 154750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 154850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 154950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void startActivityLocked(ActivityRecord r, boolean newTask, 15507da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean doResume, boolean keepCurTransition) { 155150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int NH = mHistory.size(); 155250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int addPos = -1; 155450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 155550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!newTask) { 155650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If starting in an existing task, find where that is... 155750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean startIt = true; 155850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i = NH-1; i >= 0; i--) { 15590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 156050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 156150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 156250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 156350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.task == r.task) { 156450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now, if this is not yet visible to the 156550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user, then just add it without starting; it will 156650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // get started when the user navigates back to it. 156750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos = i+1; 156850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!startIt) { 156950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1570f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 157150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 157250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 157350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 157450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 157550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 157750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 157850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 157950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.fullscreen) { 158150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startIt = false; 158250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 158550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 158650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Place a new activity at top of stack, so it is next to interact 158750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with the user. 158850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < 0) { 15890dad364adb9e9cbc2f7fa115602552f4897387adDianne Hackborn addPos = NH; 159050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 159250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we are not placing the new activity frontmost, we do not want 159350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to deliver the onUserLeaving callback to the actual frontmost 159450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity 159550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (addPos < NH) { 159650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = false; 159750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false"); 159850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 159950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 160050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Slot the activity into the history stack and proceed 160150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(addPos, r); 1602f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.putInHistory(); 160350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frontOfTask = newTask; 160450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (NH > 0) { 160550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We want to show the starting preview window if we are 160650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // switching to a new task, or the next activity's process is 160750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // not currently running. 160850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean showStartingIcon = newTask; 160950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord proc = r.app; 161050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null) { 161150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid); 161250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (proc == null || proc.thread == null) { 161450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn showStartingIcon = true; 161550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 161650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 161750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare open transition: starting " + r); 161850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 16197da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 16207da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); 162150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 162250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 162350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition( 16247da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition); 162550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 162650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 162750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(newTask 162850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_OPEN 16297da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); 163050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.remove(r); 163150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 163250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken( 163350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addPos, r, r.task.taskId, r.info.screenOrientation, r.fullscreen); 163450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean doShow = true; 163550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 163650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Even though this activity is starting fresh, we still need 163750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to reset it to make sure we apply affinities to move any 163850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing activities from other tasks in to it. 163950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 164050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 164150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags() 164250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 164350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resetTaskIfNeededLocked(r, r); 164450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn doShow = topRunningNonDelayedActivityLocked(null) == r; 164550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 164750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (SHOW_APP_STARTING_PREVIEW && doShow) { 164850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Figure out if we are transitioning from another activity that is 164950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // "has the same starting icon" as the next one. This allows the 165050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // window manager to keep the previous window it had previously 165150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // created, if it still had one. 165250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = mResumedActivity; 165350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev != null) { 165450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't want to reuse the previous starting preview if: 165550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (1) The current activity is in a different task. 165650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (prev.task != r.task) prev = null; 165750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // (2) The current activity is already displayed. 165850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (prev.nowVisible) prev = null; 165950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppStartingWindow( 16612f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r, r.packageName, r.theme, 16622f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn mService.compatibilityInfoForPackageLocked( 16632f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn r.info.applicationInfo), r.nonLocalizedLabel, 16647eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn r.labelRes, r.icon, r.windowFlags, prev, showStartingIcon); 166550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 166650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 166750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the first activity, don't do any fancy animations, 166850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because there is nothing for it to animate on top of. 166950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.addAppToken(addPos, r, r.task.taskId, 167050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.info.screenOrientation, r.fullscreen); 167150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 167350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 167450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 167650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 167750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 167850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 167950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 168050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 168150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 168250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform a reset of the given task, if needed as part of launching it. 168350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Returns the new HistoryRecord at the top of the task. 168450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 168550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop, 168650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord newActivity) { 168750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean forceReset = (newActivity.info.flags 168850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0; 1689621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (ACTIVITY_INACTIVE_RESET_TIME > 0 1690621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn && taskTop.task.getInactiveDuration() > ACTIVITY_INACTIVE_RESET_TIME) { 169150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((newActivity.info.flags 169250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE) == 0) { 169350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn forceReset = true; 169450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 169650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 169750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final TaskRecord task = taskTop.task; 169850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 169950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are going to move through the history list so that we can look 170050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at each activity 'target' with 'below' either the interesting 170150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity immediately below it in the stack or null. 170250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord target = null; 170350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int targetI = 0; 170450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int taskTopI = -1; 170550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int replyChainEnd = -1; 170650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int lastReparentPos = -1; 170750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=-1; i--) { 17080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord below = i >= 0 ? mHistory.get(i) : null; 170950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 171050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.finishing) { 171150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 171250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 171350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target == null) { 171450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 171550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 171650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a reply chain before this 171750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, it doesn't appear like the root of the chain wants 171850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // anything interesting, so drop it. 171950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 172050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 172150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 172250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int flags = target.info.flags; 172450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 172550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishOnTaskLaunch = 172650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0; 172750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean allowTaskReparenting = 172850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (flags&ActivityInfo.FLAG_ALLOW_TASK_REPARENTING) != 0; 172950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 173050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.task == task) { 173150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of the task being reset... we'll either 173250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finish this activity, push it out for another task, 173350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // or leave it as-is. We only do this 173450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for activities that are not the root of the task (since 173550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if we finish the root, we may no longer have the task!). 173650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI < 0) { 173750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = targetI; 173850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 173950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (below != null && below.task == task) { 174050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean clearWhenTaskReset = 174150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (target.intent.getFlags() 174250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn &Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0; 174350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!finishOnTaskLaunch && !clearWhenTaskReset && target.resultTo != null) { 174450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 174550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 174650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 174750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 174850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 174950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 175050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 175150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 175250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 175350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!finishOnTaskLaunch && !clearWhenTaskReset && allowTaskReparenting 175450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity != null 175550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !target.taskAffinity.equals(task.affinity)) { 175650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity has an affinity for another 175750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, then we need to move it out of here. We will 175850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // move it as far out of the way as possible, to the 175950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // bottom of the activity stack. This also keeps it 176050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // correctly ordered with any activities we previously 176150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // moved. 17620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(0); 176350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.taskAffinity != null 176450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && target.taskAffinity.equals(p.task.affinity)) { 176550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity currently at the bottom has the 176650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same task affinity as the one we are moving, 176750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then merge it into the same task. 1768f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(p.task, p.thumbHolder, false); 176950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 177050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to bottom task " + p.task); 177150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 177250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask++; 177350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mCurTask <= 0) { 177450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCurTask = 1; 177550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 1776f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn target.setTask(new TaskRecord(mService.mCurTask, target.info, null), 1777f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn null, false); 177850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target.task.affinityIntent = target.intent; 177950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target 178050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to new task " + target.task); 178150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(target, task.taskId); 178350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 178450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 178550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 178650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int dstPos = 0; 1787f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn ThumbnailHolder curThumbHolder = target.thumbHolder; 178850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 17890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 179050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 179150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 179250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 179350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p 179450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " out to target's task " + target.task); 1795f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(target.task, curThumbHolder, false); 1796f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn curThumbHolder = p.thumbHolder; 179750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 179850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(dstPos, p); 179950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(dstPos, p); 180050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 180150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn dstPos++; 180250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 180350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 180450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 180650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 180750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 180850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 180950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 181150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 181250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 181350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 181450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (forceReset || finishOnTaskLaunch 181550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || clearWhenTaskReset) { 181650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity should just be removed -- either 181750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because it asks for it, or the task should be 181850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cleared -- then finish it and anything that is 181950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // part of its reply chain. 182050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (clearWhenTaskReset) { 182150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we want to finish this activity 182250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and everything above it, so be sneaky and pretend 182350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // like these are all in the reply chain. 182450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI+1; 182550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (replyChainEnd < mHistory.size() && 18260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn (mHistory.get( 182750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd)).task == task) { 182850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd++; 182950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 183150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (replyChainEnd < 0) { 183250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 183350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 183450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 183550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 18360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 183750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 183850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 183950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 184050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 184150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 184250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 184350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 184450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 184550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 184650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop == p) { 184750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = below; 184850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 184950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTopI == replyChainEnd) { 185050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI = -1; 185150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 185350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 185450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we were in the middle of a chain, well the 185550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity that started it all doesn't want anything 185650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // special, so leave it all as-is. 185750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 185850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 185950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 186050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Reached the bottom of the task -- any reply chain 186150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should be left as-is. 186250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 186350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 186450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 186550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (target.resultTo != null) { 186650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is sending a reply to a previous 186750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, we can't do anything with it now until 186850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we reach the start of the reply chain. 186950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // XXX note that we are assuming the result is always 187050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the previous activity, which is almost always 187150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the case but we really shouldn't count on. 187250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 187350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 187450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 187550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 187650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (taskTopI >= 0 && allowTaskReparenting 187750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity != null 187850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && task.affinity.equals(target.taskAffinity)) { 187950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are inside of another task... if this activity has 188050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // an affinity for our task, then either remove it if we are 188150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // clearing or move it over to our task. Note that 188250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we currently punt on the case where we are resetting a 188350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task that is not at the top but who has activities above 188450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // with an affinity to it... this is really not a normal 188550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case, and we will need to later pull that task to the front 188650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and usually at that point we will do the reset and pick 188750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up those remaining activities. (This only happens if 188850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // someone starts an activity in a new task from an activity 188950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in a task that is not currently on top.) 189050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (forceReset || finishOnTaskLaunch) { 189150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 189250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 189350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 189450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord p = null; 189550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) { 18960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn p = mHistory.get(srcPos); 189750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 189850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 189950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, srcPos, 190150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "reset")) { 190250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 190350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 190450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd--; 190550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn srcPos--; 190650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 190850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 190950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 191050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (replyChainEnd < 0) { 191150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = targetI; 191250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int srcPos=replyChainEnd; srcPos>=targetI; srcPos--) { 19140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(srcPos); 191550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 191650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 191750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 191850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastReparentPos < 0) { 191950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos = taskTopI; 192050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = p; 192150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 192250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 192350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 192450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(srcPos); 1925f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn p.setTask(task, null, false); 192650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(lastReparentPos, p); 192750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p 192850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in to resetting task " + task); 192950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppToken(lastReparentPos, p); 193050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppGroupId(p, p.task.taskId); 193150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 193250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 193350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 193550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn replyChainEnd = -1; 193650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 193750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now we've moved it in to place... but what if this is 193850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a singleTop activity and we have put it on top of another 193950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the same activity? Then we drop the instance 194050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // below so it remains singleTop. 194150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (target.info.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) { 194250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int j=lastReparentPos-1; j>=0; j--) { 19430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(j); 194450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.finishing) { 194550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 194650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 194750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (p.intent.getComponent().equals(target.intent.getComponent())) { 194850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (finishActivityLocked(p, j, 194950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null, "replace")) { 195050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTopI--; 195150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastReparentPos--; 195250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 195850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 195950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn target = below; 196050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn targetI = i; 196150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 196250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 196350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return taskTop; 196450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 196550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 196650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 196750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clear operation as requested by 196850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * {@link Intent#FLAG_ACTIVITY_CLEAR_TOP}: search from the top of the 196950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * stack to the given task, then look for 197050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * an instance of that activity in the stack and, if found, finish all 197150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities on top of it and return the instance. 197250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 197350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param newR Description of the new activity being started. 1974621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * @return Returns the old activity that should be continued to be used, 197550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * or null if none was found. 197650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 197750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord performClearTaskLocked(int taskId, 1978621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord newR, int launchFlags) { 197950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 198050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 198150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First find the requested task. 198250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 198350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 19840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 198550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == taskId) { 198650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i++; 198750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 198850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 198950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 199150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now clear it. 199250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 199350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 19940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 199550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 199650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn continue; 199750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 199850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId != taskId) { 199950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 200050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 200150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.realActivity.equals(newR.realActivity)) { 200250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Here it is! Now finish everything in front... 200350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord ret = r; 2004621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i < (mHistory.size()-1)) { 2005621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 20060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn r = mHistory.get(i); 2007621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2008621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2009621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2010621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2011621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2012621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2013621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (finishActivityLocked(r, i, Activity.RESULT_CANCELED, 2014621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, "clear")) { 2015621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 201650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 201850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 201950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finally, if this is a normal launch mode (that is, not 202050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // expecting onNewIntent()), then we will finish the current 202150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of the activity so a new fresh one can be started. 202250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (ret.launchMode == ActivityInfo.LAUNCH_MULTIPLE 202350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0) { 202450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!ret.finishing) { 202550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(ret); 202650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 202750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(ret, index, Activity.RESULT_CANCELED, 202850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn null, "clear"); 202950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 203150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return ret; 203550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 203750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 203850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 203950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 204050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 204150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 20420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * Completely remove all activities associated with an existing 20430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn * task starting at a specified index. 20440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn */ 20450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private final void performClearTaskAtIndexLocked(int taskId, int i) { 20460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (i < (mHistory.size()-1)) { 20470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 20480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.task.taskId != taskId) { 20490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Whoops hit the end. 20500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return; 20510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (r.finishing) { 20530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 20540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 20550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!finishActivityLocked(r, i, Activity.RESULT_CANCELED, 20570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn null, "clear")) { 20580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn i++; 20590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 20620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 20630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn /** 2064621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Completely remove all activities associated with an existing task. 2065621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 2066621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn private final void performClearTaskLocked(int taskId) { 2067621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int i = mHistory.size(); 2068621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2069621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // First find the requested task. 2070621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2071621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 20720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2073621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId == taskId) { 2074621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i++; 2075621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn break; 2076621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2077621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2078621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 20790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Now find the start and clear it. 2080621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn while (i > 0) { 2081621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn i--; 20820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(i); 2083621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.finishing) { 2084621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2085621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2086621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (r.task.taskId != taskId) { 2087621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // We hit the bottom. Now finish it all... 20880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, i+1); 2089621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return; 2090621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2091621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2092621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2093621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2094621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 209550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Find the activity in the history stack within the given task. Returns 209650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * the index within the history at which it's found, or < 0 if not found. 209750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 209850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final int findActivityInHistoryLocked(ActivityRecord r, int task) { 209950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = mHistory.size(); 210050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 210150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 21020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord candidate = mHistory.get(i); 210350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.task.taskId != task) { 210450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 210550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (candidate.realActivity.equals(r.realActivity)) { 210750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return i; 210850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 210950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 211150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return -1; 211250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 211350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 211450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 211550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Reorder the history stack so that the activity at the given index is 211650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * brought to the front. 211750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 211850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord moveActivityToFrontLocked(int where) { 21190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord newTop = mHistory.remove(where); 212050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size(); 21210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord oldTop = mHistory.get(top-1); 212250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, newTop); 212350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn oldTop.frontOfTask = false; 212450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTop.frontOfTask = true; 212550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return newTop; 212650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 212750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 212850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityLocked(IApplicationThread caller, 212950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent intent, String resolvedType, 213050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Uri[] grantedUriPermissions, 213150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, ActivityInfo aInfo, IBinder resultTo, 213250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, 213350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid, int callingUid, boolean onlyIfNeeded, 2134621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity) { 2135efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2136efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn int err = START_SUCCESS; 2137efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2138efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn ProcessRecord callerApp = null; 2139efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (caller != null) { 2140efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callerApp = mService.getRecordForAppLocked(caller); 2141efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (callerApp != null) { 2142efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingPid = callerApp.pid; 2143efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn callingUid = callerApp.info.uid; 2144efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } else { 2145efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 2146efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + " (pid=" + callingPid + ") when starting: " 2147efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + intent.toString()); 2148efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn err = START_PERMISSION_DENIED; 2149efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2150efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 2151efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn 2152efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS) { 2153efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn Slog.i(TAG, "Starting: " + intent + " from pid " 2154efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn + (callerApp != null ? callerApp.pid : callingPid)); 2155efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn } 215650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 215750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord = null; 215850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultRecord = null; 215950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 216050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(resultTo); 216150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 216250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Sending result to " + resultTo + " (index " + index + ")"); 216350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 21640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sourceRecord = mHistory.get(index); 216550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0 && !sourceRecord.finishing) { 216650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord; 216750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 216850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 216950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 217050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 217150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 217250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 217350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 217450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && sourceRecord != null) { 217550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Transfer the result target from the source activity to the new 217650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // one being started, including any failures. 217750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 217850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_FORWARD_AND_REQUEST_CONFLICT; 217950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord = sourceRecord.resultTo; 218150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultWho = sourceRecord.resultWho; 218250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestCode = sourceRecord.requestCode; 218350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord.resultTo = null; 218450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 218550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord.removeResultsLocked( 218650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord, resultWho, requestCode); 218750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 218950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2190efb581018bbede2ecdc76bcd9722ded5b6903254Dianne Hackborn if (err == START_SUCCESS && intent.getComponent() == null) { 219150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find a class that can handle the given Intent. 219250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // That's the end of that! 219350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_INTENT_NOT_RESOLVED; 219450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 219550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 219650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err == START_SUCCESS && aInfo == null) { 219750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We couldn't find the specific class specified in the Intent. 219850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Also the end of the line. 219950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn err = START_CLASS_NOT_FOUND; 220050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 220250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (err != START_SUCCESS) { 220350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 220450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 220550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 220650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 220750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 220850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return err; 220950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 221050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 221150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int perm = mService.checkComponentPermission(aInfo.permission, callingPid, 22126c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn callingUid, aInfo.applicationInfo.uid, aInfo.exported); 221350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (perm != PackageManager.PERMISSION_GRANTED) { 221450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 221550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 221650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 221750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 221850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 22196c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn String msg; 22206c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn if (!aInfo.exported) { 22216c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 22226c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 22236c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 22246c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " not exported from uid " + aInfo.applicationInfo.uid; 22256c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } else { 22266c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn msg = "Permission Denial: starting " + intent.toString() 22276c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " from " + callerApp + " (pid=" + callingPid 22286c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + ", uid=" + callingUid + ")" 22296c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn + " requires " + aInfo.permission; 22306c2c5fc9930d14d502a22326dee9bf4475dbd649Dianne Hackborn } 223150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, msg); 223250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn throw new SecurityException(msg); 223350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 223450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 223550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 223650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mController != null) { 223750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean abort = false; 223850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 223950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The Intent we give to the watcher has the extra data 224050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // stripped off, since it can contain private information. 224150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent watchIntent = intent.cloneFilter(); 224250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn abort = !mService.mController.activityStarting(watchIntent, 224350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName); 224450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 224550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 224650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 224750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 224850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (abort) { 224950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultRecord != null) { 225050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 225150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, 225250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 225350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We pretend to the caller that it was really started, but 225550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // they will just get a cancel result. 225650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 225750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 225950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 226050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid, 226250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, aInfo, mService.mConfiguration, 226350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultRecord, resultWho, requestCode, componentSpecified); 2264621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (outActivity != null) { 2265621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn outActivity[0] = r; 2266621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 226750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 226850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 226950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == null 227050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || mResumedActivity.info.applicationInfo.uid != callingUid) { 227150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 227250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingActivityLaunch pal = new PendingActivityLaunch(); 227350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.r = r; 227450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.sourceRecord = sourceRecord; 227550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedUriPermissions = grantedUriPermissions; 227650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.grantedMode = grantedMode; 227750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pal.onlyIfNeeded = onlyIfNeeded; 227850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mPendingActivityLaunches.add(pal); 227950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SWITCHES_CANCELED; 228050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 228250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 228350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mDidAppSwitch) { 228450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is the second allowed switch since we stopped switches, 228550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so now just generally allow switches. Use case: user presses 228650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // home (switches disabled, switch to home, mDidAppSwitch now true); 228750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user taps a home icon (coming from home so allowed, we hit here 228850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and now allow anyone to switch again). 228950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mAppSwitchesAllowedTime = 0; 229050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 229150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mDidAppSwitch = true; 229250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 229350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.doPendingActivityLaunchesLocked(false); 229550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 229650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 229750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return startActivityUncheckedLocked(r, sourceRecord, 229850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, onlyIfNeeded, true); 229950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 230050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2301621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontFromLaunchLocked(int launchFlags) { 2302621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2303621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2304621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2305621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Caller wants to appear on home activity, so before starting 2306621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // their own activity we will bring home to the front. 2307621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontLocked(); 2308621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2309621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2310621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 231150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, 231250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord sourceRecord, Uri[] grantedUriPermissions, 231350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int grantedMode, boolean onlyIfNeeded, boolean doResume) { 231450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final Intent intent = r.intent; 231550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int callingUid = r.launchedFromUid; 231650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 231750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int launchFlags = intent.getFlags(); 231850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 231950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll invoke onUserLeaving before onPause only if the launching 232050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity did not explicitly state that this is an automated launch. 232150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 232250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, 232350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "startActivity() => mUserLeaving=" + mUserLeaving); 232450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 232550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has asked not to resume at this point, we make note 232650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of this in the record so that we can skip it when trying to find 232750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the top running activity. 232850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!doResume) { 232950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.delayedResume = true; 233050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 233150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 233250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) 233350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn != 0 ? r : null; 233450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 233550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the onlyIfNeeded flag is set, then we can do this if the activity 233650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being launched is the same as the one making the call... or, as 233750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a special case, if we do not know the caller then we count the 233850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current top activity as the caller. 233950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 234050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord checkedCaller = sourceRecord; 234150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (checkedCaller == null) { 234250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn checkedCaller = topRunningNonDelayedActivityLocked(notTop); 234350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!checkedCaller.realActivity.equals(r.realActivity)) { 234550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is not the same as launcher, so always needed. 234650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn onlyIfNeeded = false; 234750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 234950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 235050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sourceRecord == null) { 235150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This activity is not being started from another... in this 235250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // case we -always- start a new task. 235350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 235450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: " 235550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent); 235650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 235750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 235850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 235950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The original activity who is starting us is running as a single 236050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance... this new activity it is starting must go on its 236150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // own task. 236250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 236350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 236450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 236550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The activity being started is a single instance... it always 236650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // gets launched into its own task. 236750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 236850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 236950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 237050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 237150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For whatever reason this activity is being launched into a new 237250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task... yet the caller has requested a result back. Well, that 237350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is pretty messed up, so instead immediately send back a cancel 237450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and let the new task continue launched as normal without a 237550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // dependency on its originator. 237650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 237750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 237850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 237950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 238050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 238150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 238250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 238350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean addingToTask = false; 2384621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord reuseTask = null; 238550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 238650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 238750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 238850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 238950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If bring to front is requested, and no result is requested, and 239050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we can find a task that was started with this same 239150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // component, then instead of launching bring that one to the front. 239250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null) { 239350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // See if there is a task to bring to the front. If this is 239450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // a SINGLE_INSTANCE activity, there can be one and only one 239550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // instance of it in the history, and it is always in its own 239650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // unique task, so we do a special search. 239750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord taskTop = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 239850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? findTaskLocked(intent, r.info) 239950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : findActivityLocked(intent, r.info); 240050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop != null) { 240150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.task.intent == null) { 240250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This task was started because of movement of 240350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the activity based on affinity... now that we 240450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // are actually launching it, we can assign the 240550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // base intent. 240650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(intent, r.info); 240750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 240850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the target task is not in the front, then we need 240950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to bring it to the front... except... well, with 241050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 241150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to have the same behavior as if a new instance was 241250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // being started, which means not bringing it to the front 241350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // if the caller is not itself in the front. 241450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord curTop = topRunningNonDelayedActivityLocked(notTop); 241566a5d695ed9268869ca50e304bfeabd2a021c6cdJean-Baptiste Queru if (curTop != null && curTop.task != taskTop.task) { 241650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 241750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean callerAtFront = sourceRecord == null 241850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || curTop.task == sourceRecord.task; 241950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerAtFront) { 242050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We really do want to push this one into the 242150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user's face, right now. 2422621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 242350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveTaskToFrontLocked(taskTop.task, r); 242450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 242650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller has requested that the target task be 242750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // reset, then do so. 242850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 242950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop = resetTaskIfNeededLocked(taskTop, r); 243050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 243150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 243250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 243350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 243450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! And for paranoia, make 243550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 243650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 243750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 243850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 243950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 244050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2441621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if ((launchFlags & 2442621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 2443621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 2444621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // The caller has requested to completely replace any 24457da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // existing task with its new activity. Well that should 2446621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // not be too hard... 2447621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask = taskTop.task; 2448621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn performClearTaskLocked(taskTop.task.taskId); 2449621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn reuseTask.setIntent(r.intent, r.info); 2450621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 245150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 245250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 245350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this situation we want to remove all activities 245450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from the task up to the one being started. In most 245550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // cases this means we are resetting the task to its 245650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // initial state. 245750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2458621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn taskTop.task.taskId, r, launchFlags); 245950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 246050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.frontOfTask) { 246150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Activity aliases may mean we use different 246250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intents for the top activity, so make sure 246350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the task now has the identity of the new 246450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // intent. 246550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top.task.setIntent(r.intent, r.info); 246650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 246750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 246839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 246950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 247050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // A special case: we need to 247150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // start the activity because it is not currently 247250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // running, and the caller has asked to clear the 247350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to have this activity at the top. 247450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 247550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Now pretend like this activity is being started 247650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // by the top of its task, so it is put in the 247750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // right place. 247850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 247950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 248050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.realActivity.equals(taskTop.task.realActivity)) { 248150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case the top activity on the task is the 248250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // same as the one being launched, so we take that 248350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // as a request to bring the task to the foreground. 248450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the top activity in the task is the root 248550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity, deliver this new intent to it if it 248650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // desires. 248750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 248850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && taskTop.realActivity.equals(r.realActivity)) { 248950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task); 249050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (taskTop.frontOfTask) { 249150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 249250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 249339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn taskTop.deliverNewIntentLocked(callingUid, r.intent); 249450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!r.intent.filterEquals(taskTop.task.intent)) { 249550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching the root activity 249650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the task, but with a different intent. We 249750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // should start a new instance on top. 249850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 249950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 250050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 250150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 250250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case an activity is being launched in to an 250350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // existing task, without resetting that task. This 250450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is typically the situation of launching an activity 250550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // from a notification or shortcut. We want to place 250650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the new activity on top of the current task. 250750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn addingToTask = true; 250850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sourceRecord = taskTop; 250950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!taskTop.task.rootWasReset) { 251050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case we are launching in to an existing task 251150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that has not yet been started from its front door. 251250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The current task has been brought to the front. 251350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Ideally, we'd probably like to place this new task 251450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the bottom of its stack, but that's a little hard 251550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to do with the current organization of the code so 251650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for now we'll just drop it. 251750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn taskTop.task.setIntent(r.intent, r.info); 251850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2519621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (!addingToTask && reuseTask == null) { 252050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We didn't do anything... but it was needed (a.k.a., client 252150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // don't use that intent!) And for paranoia, make 252250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // sure we have correctly resumed the top activity. 252350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 252450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 252550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_TASK_TO_FRONT; 252750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 252950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 253150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 253250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //String uri = r.intent.toURI(); 253350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Intent intent2 = new Intent(uri); 253450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "Given intent: " + r.intent); 253550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "URI is: " + uri); 253650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "To intent: " + intent2); 253750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 253850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.packageName != null) { 253950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity being launched is the same as the one currently 254050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // at the top, then we need to check if it should only be launched 254150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // once. 254250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = topRunningNonDelayedActivityLocked(notTop); 254350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null && r.resultTo == null) { 254450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.realActivity.equals(r.realActivity)) { 254550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top.app != null && top.app.thread != null) { 254650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 254750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 254850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 254950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 255050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 255150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 255250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 255350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 255450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 255550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (onlyIfNeeded) { 255650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't need to start a new activity, and 255750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the client said not to do anything if that 255850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // is the case, so this is it! 255950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_RETURN_INTENT_TO_CALLER; 256050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 256250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 256350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 256750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 256850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 256950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo != null) { 257050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendActivityResultLocked(-1, 257150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo, r.resultWho, r.requestCode, 257250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Activity.RESULT_CANCELED, null); 257350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_CLASS_NOT_FOUND; 257550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 257650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 257750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean newTask = false; 25787da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn boolean keepCurTransition = false; 257950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 258050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Should this be considered a new task? 258150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.resultTo == null && !addingToTask 258250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2583621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (reuseTask == null) { 2584621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // todo: should do better management of integers. 2585621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask++; 2586621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mService.mCurTask <= 0) { 2587621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn mService.mCurTask = 1; 2588621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2589f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true); 2590621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 2591621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn + " in new task " + r.task); 2592621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2593f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(reuseTask, reuseTask, true); 259450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 259550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newTask = true; 2596621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveHomeToFrontFromLaunchLocked(launchFlags); 259750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 259850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (sourceRecord != null) { 259950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!addingToTask && 260050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 260150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are adding the activity to an existing 260250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // task, but the caller has asked to clear that task if the 260350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity is already running. 260450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = performClearTaskLocked( 2605621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn sourceRecord.task.taskId, r, launchFlags); 26067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn keepCurTransition = true; 260750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (top != null) { 260850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 260939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 261050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // For paranoia, make sure we have correctly 261150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // resumed the top activity. 261250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 261350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 261450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 261650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 261750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (!addingToTask && 261850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 261950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // In this case, we are launching an activity in our own task 262050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // that may already be running somewhere in the history, and 262150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we want to shuffle it to the front of the stack if so. 262250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId); 262350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (where >= 0) { 262450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord top = moveActivityToFrontLocked(where); 262550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 262639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent); 262750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (doResume) { 262850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 262950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_DELIVERED_TO_TOP; 263150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 263350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // An existing activity is starting this new activity, so we want 263450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to keep the new one in the same task as the one that is starting 263550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it. 2636f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false); 263750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 263850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in existing task " + r.task); 263950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 264050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 264150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This not being started from an existing activity, and not part 264250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of a new task... just put it in the top task, though these days 264350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this case should never happen. 264450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 264550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord prev = 26460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn N > 0 ? mHistory.get(N-1) : null; 2647f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.setTask(prev != null 2648621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ? prev.task 2649f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn : new TaskRecord(mService.mCurTask, r.info, intent), null, true); 265050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 265150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " in new guessed " + r.task); 265250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 265339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 265439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (grantedUriPermissions != null && callingUid > 0) { 265539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=0; i<grantedUriPermissions.length; i++) { 265639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionLocked(callingUid, r.packageName, 26577e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn grantedUriPermissions[i], grantedMode, r.getUriPermissionsLocked()); 265839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 265939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 266039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 266139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 26627e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn intent, r.getUriPermissionsLocked()); 266339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 266450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (newTask) { 266550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); 266650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 266750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 26687da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn startActivityLocked(r, newTask, doResume, keepCurTransition); 266950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_SUCCESS; 267050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 267150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2672621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo resolveActivity(Intent intent, String resolvedType, boolean debug) { 267350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Collect information about the target of the Intent. 267450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityInfo aInfo; 267550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 267650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 267750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 267850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, resolvedType, 267950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 268050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 268150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 268250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 268350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 268450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 268550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 268650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo != null) { 268750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Store the found target back into the intent, because now that 268850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // we have it we never want to do this again. For example, if the 268950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // user navigates back to this point in the history, we should 269050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // always restart the exact same activity. 269150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent.setComponent(new ComponentName( 269250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.applicationInfo.packageName, aInfo.name)); 269350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 269450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Don't debug things in the system process 269550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (debug) { 269650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!aInfo.processName.equals("system")) { 269750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setDebugApp(aInfo.processName, true, false); 269850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 269950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 270050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 2701621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return aInfo; 2702621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2703621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2704621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivityMayWait(IApplicationThread caller, int callingUid, 2705621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent, String resolvedType, Uri[] grantedUriPermissions, 2706621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int grantedMode, IBinder resultTo, 2707621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn String resultWho, int requestCode, boolean onlyIfNeeded, 2708621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean debug, WaitResult outResult, Configuration config) { 2709621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2710621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2711621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2712621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2713621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2714621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2715621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2716621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2717621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2718621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2719621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 2720621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedType, debug); 272150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 272250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 272350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int callingPid; 2724621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2725621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2726621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 272750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 272850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 272950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 273050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = callingUid = -1; 273150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 273250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 273350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = config != null 273450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mService.mConfiguration.diff(config) != 0; 273550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 273650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Starting activity when config will change = " + mConfigWillChange); 273750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 273850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 273950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 274050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && aInfo != null && 274154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 274250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This may be a heavy-weight process! Check to see if we already 274350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // have another, different heavy-weight process running. 274450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 274550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess != null && 274650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 274750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 274850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingPid = callingPid; 274950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int realCallingUid = callingUid; 275050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (caller != null) { 275150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 275250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callerApp != null) { 275350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingPid = callerApp.pid; 275450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn realCallingUid = callerApp.info.uid; 275550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 275650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Unable to find app for caller " + caller 275750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " (pid=" + realCallingPid + ") when starting: " 275850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + intent.toString()); 275950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return START_PERMISSION_DENIED; 276050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 276250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 276350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IIntentSender target = mService.getIntentSenderLocked( 276450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IActivityManager.INTENT_SENDER_ACTIVITY, "android", 2765621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn realCallingUid, null, null, 0, new Intent[] { intent }, 2766621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 276750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | PendingIntent.FLAG_ONE_SHOT); 276850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 276950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent newIntent = new Intent(); 277050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (requestCode >= 0) { 277150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Caller is requesting a result. 277250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 277350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 277450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 277550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn new IntentSender(target)); 277650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess.activities.size() > 0) { 277750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 277850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 277950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.packageName); 278050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 278150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn hist.task.taskId); 278250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 278350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 278450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo.packageName); 278550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setFlags(intent.getFlags()); 278650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntent.setClassName("android", 278750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn HeavyWeightSwitcherActivity.class.getName()); 278850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent = newIntent; 278950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resolvedType = null; 279050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn caller = null; 279150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingUid = Binder.getCallingUid(); 279250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn callingPid = Binder.getCallingPid(); 279350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn componentSpecified = true; 279450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 279550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ResolveInfo rInfo = 279650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn AppGlobals.getPackageManager().resolveIntent( 279750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn intent, null, 279850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PackageManager.MATCH_DEFAULT_ONLY 279950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn | ActivityManagerService.STOCK_PM_FLAGS); 280050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = rInfo != null ? rInfo.activityInfo : null; 280150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 280250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn aInfo = null; 280350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 280750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 280850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, 280950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn grantedUriPermissions, grantedMode, aInfo, 281050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo, resultWho, requestCode, callingPid, callingUid, 2811621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn onlyIfNeeded, componentSpecified, null); 281250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 281350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange && mMainStack) { 281450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller also wants to switch to a new configuration, 281550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // do so now. This allows a clean switch, as we are waiting 281650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for the current activity to pause (so we will not destroy 281750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it), and have not yet started the next activity. 281850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 281950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "updateConfiguration()"); 282050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mConfigWillChange = false; 282150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, 282250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Updating to new configuration after starting activity."); 282331ca854cdba31ec6ab089af743a8701a6192e07eDianne Hackborn mService.updateConfigurationLocked(config, null, false); 282450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 282550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 282650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 282750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 282850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (outResult != null) { 282950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.result = res; 283050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (res == IActivityManager.START_SUCCESS) { 283150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityLaunched.add(outResult); 283250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 283350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2834ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 283550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 283650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 283750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 283850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (res == IActivityManager.START_TASK_TO_FRONT) { 283950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = this.topRunningActivityLocked(null); 284050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.nowVisible) { 284150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.timeout = false; 284250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.who = new ComponentName(r.info.packageName, r.info.name); 284350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.totalTime = 0; 284450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = 0; 284550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 284650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn outResult.thisTime = SystemClock.uptimeMillis(); 284750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingActivityVisible.add(outResult); 284850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn do { 284950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 2850ba0492d5edd3e6e24d948c531b74ffb5fc9b922eDianne Hackborn mService.wait(); 285150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (InterruptedException e) { 285250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } while (!outResult.timeout && outResult.who == null); 285450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 285750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 285850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return res; 285950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 286050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 286150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 2862621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final int startActivities(IApplicationThread caller, int callingUid, 2863621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent[] intents, String[] resolvedTypes, IBinder resultTo) { 2864621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents == null) { 2865621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("intents is null"); 2866621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2867621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (resolvedTypes == null) { 2868621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new NullPointerException("resolvedTypes is null"); 2869621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2870621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intents.length != resolvedTypes.length) { 2871621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("intents are length different than resolvedTypes"); 2872621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2873621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2874621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityRecord[] outActivity = new ActivityRecord[1]; 2875621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2876621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int callingPid; 2877621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (callingUid >= 0) { 2878621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = -1; 2879621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else if (caller == null) { 2880621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = Binder.getCallingPid(); 2881621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingUid = Binder.getCallingUid(); 2882621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } else { 2883621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn callingPid = callingUid = -1; 2884621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2885621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 2886621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn try { 2887621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn synchronized (mService) { 2888621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2889621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=0; i<intents.length; i++) { 2890621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Intent intent = intents[i]; 2891621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent == null) { 2892621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn continue; 2893621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2894621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2895621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Refuse possible leaked file descriptors 2896621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (intent != null && intent.hasFileDescriptors()) { 2897621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException("File descriptors passed in Intent"); 2898621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2899621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2900621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn boolean componentSpecified = intent.getComponent() != null; 2901621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2902621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Don't modify the client's object! 2903621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn intent = new Intent(intent); 2904621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2905621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn // Collect information about the target of the Intent. 2906621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], false); 2907621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2908621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (mMainStack && aInfo != null && (aInfo.applicationInfo.flags 2909621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn & ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2910621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn throw new IllegalArgumentException( 2911621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn "FLAG_CANT_SAVE_STATE not supported here"); 2912621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2913621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2914621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedTypes[i], 2915621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn null, 0, aInfo, resultTo, null, -1, callingPid, callingUid, 2916621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn false, componentSpecified, outActivity); 2917621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (res < 0) { 2918621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return res; 2919621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2920621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2921621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn resultTo = outActivity[0]; 2922621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2923621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2924621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } finally { 2925621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn Binder.restoreCallingIdentity(origId); 2926621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2927621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 2928621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn return IActivityManager.START_SUCCESS; 2929621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 2930621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 293150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 293250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn long thisTime, long totalTime) { 293350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) { 293450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityLaunched.get(i); 293550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = timeout; 293650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 293750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 293850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 293950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = thisTime; 294050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = totalTime; 294150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 294350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 294450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 294550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void reportActivityVisibleLocked(ActivityRecord r) { 294650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) { 294750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn WaitResult w = mWaitingActivityVisible.get(i); 294850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.timeout = false; 294950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 295050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 295150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 295350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn w.thisTime = w.totalTime; 295450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.notifyAll(); 295650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 295750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 295850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void sendActivityResultLocked(int callingUid, ActivityRecord r, 295950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn String resultWho, int requestCode, int resultCode, Intent data) { 296050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (callingUid > 0) { 296250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 29637e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn data, r.getUriPermissionsLocked()); 296450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 296550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 296650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r 296750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " : who=" + resultWho + " req=" + requestCode 296850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + data); 296950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && r.app != null && r.app.thread != null) { 297050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 297150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ResultInfo> list = new ArrayList<ResultInfo>(); 297250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.add(new ResultInfo(resultWho, requestCode, 297350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultCode, data)); 297450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleSendResult(r, list); 297550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 297650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 297750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown sending result to " + r, e); 297850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 297950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.addResultLocked(null, resultWho, requestCode, resultCode, data); 298250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 298350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 298450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void stopActivityLocked(ActivityRecord r) { 298550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r); 298650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 298750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { 298850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.finishing) { 298950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn requestFinishActivityLocked(r, Activity.RESULT_CANCELED, null, 299050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "no-history"); 299150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.app != null && r.app.thread != null) { 299350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 299450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 299550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 299650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 299850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resumeKeyDispatchingLocked(); 299950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 300050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = false; 3001ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3002ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (stop requested)"); 300350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 300450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v( 300550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Stopping visible=" + r.visible + " for " + r); 300650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!r.visible) { 300750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 300850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 300950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleStopActivity(r, r.visible, r.configChangeFlags); 30104eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if (mService.isSleeping()) { 30114eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn r.setSleeping(true); 30124eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } 301350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 301450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Maybe just ignore exceptions here... if the process 301550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 301650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 301750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown during pause", e); 301850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Just in case, assume it to be stopped. 301950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopped = true; 3020ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r); 302150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPED; 302250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.configDestroy) { 3023ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 302450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 302850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 302950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ArrayList<ActivityRecord> processStoppingActivitiesLocked( 303050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean remove) { 303150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int N = mStoppingActivities.size(); 303250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (N <= 0) return null; 303350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 303550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 303650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean nowVisible = mResumedActivity != null 303750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && mResumedActivity.nowVisible 303850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn && !mResumedActivity.waitingVisible; 303950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=0; i<N; i++) { 304050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord s = mStoppingActivities.get(i); 304150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 304250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + nowVisible + " waitingVisible=" + s.waitingVisible 304350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " finishing=" + s.finishing); 304450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.waitingVisible && nowVisible) { 304550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(s); 304650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn s.waitingVisible = false; 304750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (s.finishing) { 304850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is finishing, it is sitting on top of 304950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // everyone else but we now know it is no longer needed... 305050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get rid of it. Otherwise, we need to go through the 305150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // normal flow and hide it once we determine that it is 305250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hidden by the activities in front of it. 305350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 305450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(s, false); 305550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 305650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 30574eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn if ((!s.waitingVisible || mService.isSleeping()) && remove) { 305850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 305950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (stops == null) { 306050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = new ArrayList<ActivityRecord>(); 306150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops.add(s); 306350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(i); 306450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn N--; 306550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 306650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 306850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 306950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return stops; 307050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 307150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 307250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityIdleInternal(IBinder token, boolean fromTimeout, 307350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration config) { 307450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 307550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 307650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> stops = null; 307750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> finishes = null; 307850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList<ActivityRecord> thumbnails = null; 307950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NS = 0; 308050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NF = 0; 308150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int NT = 0; 308250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn IApplicationThread sendThumbnail = null; 308350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean booting = false; 308450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean enableScreen = false; 308550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 308650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 308750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (token != null) { 308850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, token); 308950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 309050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 309150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get the activity record. 309250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 309350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 30940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 309550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 309650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (fromTimeout) { 309750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 309850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 309950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This is a hack to semi-deal with a race condition 310150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // in the client where it can be constructed with a 310250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // newer configuration from when we asked it to launch. 310350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We'll update with whatever configuration it now says 310450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it used to launch. 310550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (config != null) { 310650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = config; 310750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 310850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 310950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer need to keep the device awake. 311050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r && mLaunchingActivity.isHeld()) { 311150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 311250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mLaunchingActivity.release(); 311350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 311450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 311550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We are now idle. If someone is waiting for a thumbnail from 311650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // us, we can now deliver. 311750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.idle = true; 311850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.scheduleAppGcsLocked(); 311950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 312050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail = r.app.thread; 312150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.thumbnailNeeded = false; 312250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 312350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is fullscreen, set up to hide those under it. 312550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r); 312750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ensureActivitiesVisibleLocked(null, 0); 312850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 312950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 313050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 313150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mService.mBooted && !fromTimeout) { 313250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooted = true; 313350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn enableScreen = true; 313450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 313550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 313650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 313750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (fromTimeout) { 313850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn reportActivityLaunchedLocked(fromTimeout, null, -1, -1); 313950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 314150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Atomically retrieve all of the other things to do. 314250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stops = processStoppingActivitiesLocked(true); 314350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn NS = stops != null ? stops.size() : 0; 314450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NF=mFinishingActivities.size()) > 0) { 314550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 314650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.clear(); 314750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 314850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((NT=mService.mCancelledThumbnails.size()) > 0) { 314950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn thumbnails = new ArrayList<ActivityRecord>(mService.mCancelledThumbnails); 315050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.clear(); 315150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 315450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn booting = mService.mBooting; 315550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mBooting = false; 315650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 315850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 315950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i; 316050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 316150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Send thumbnail if requested. 316250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (sendThumbnail != null) { 316350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 316450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn sendThumbnail.requestThumbnail(token); 316550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 316650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 316750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(null, token, null, null, true); 316850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 316950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 317050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 317150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Stop any activities that are scheduled to do so but have been 317250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 317350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NS; i++) { 317450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)stops.get(i); 317550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 317650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 317750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishCurrentActivityLocked(r, FINISH_IMMEDIATELY); 317850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 317950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn stopActivityLocked(r); 318050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 318350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 318450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Finish any activities that are scheduled to do so but have been 318550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // waiting for the next one to start. 318650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NF; i++) { 318750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)finishes.get(i); 318850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 3189ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 319050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Report back to any thumbnail receivers. 319450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (i=0; i<NT; i++) { 319550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)thumbnails.get(i); 319650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.sendPendingThumbnail(r, null, null, null, true); 319750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 319850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 319950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (booting) { 320050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.finishBooting(); 320150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 320250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.trimApplications(); 320450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //dump(); 320550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //mWindowManager.dump(); 320650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 320750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (enableScreen) { 320850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.enableScreenAfterBoot(); 320950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 321150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 321250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 321350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the activity is being finished, false if for 321450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * some reason it is being left as-is. 321550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 321650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean requestFinishActivityLocked(IBinder token, int resultCode, 321750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Intent resultData, String reason) { 321850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v( 321950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Finishing activity: token=" + token 322050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", result=" + resultCode + ", data=" + resultData); 322150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 322350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 322450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 322550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 32260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 322750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 322850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Is this the last activity left? 322950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean lastActivity = true; 323050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 32310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord p = mHistory.get(i); 323250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!p.finishing && p != r) { 323350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn lastActivity = false; 323450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn break; 323550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 323750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 323850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this is the last activity, but it is the home activity, then 323950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // just don't finish it. 324050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (lastActivity) { 324150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 324250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 324350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 324650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishActivityLocked(r, index, resultCode, resultData, reason); 324750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 324850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 324950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 325050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 325150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if this activity has been removed from the history 325250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * list, or false if it is still in the list and will be removed later. 325350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 325450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean finishActivityLocked(ActivityRecord r, int index, 325550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int resultCode, Intent resultData, String reason) { 325650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 325750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Duplicate finish request for " + r); 325850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 325950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 326050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 326194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 326250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, 326350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 326450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName, reason); 326550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < (mHistory.size()-1)) { 32660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord next = mHistory.get(index+1); 326750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next.task == r.task) { 326850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.frontOfTask) { 326950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // The next activity is now the front of the task. 327050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.frontOfTask = true; 327150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { 327350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the caller asked that this activity (and all above it) 327450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // be cleared when the task is reset, don't lose that information, 327550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // but propagate it up to the next activity. 327650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 327750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 327950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pauseKeyDispatchingLocked(); 328250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 328350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 328450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.setFocusedActivityLocked(topRunningActivityLocked(null)); 328550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 328750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 328850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // send the result 328950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord resultTo = r.resultTo; 329050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (resultTo != null) { 329150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo 329250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " who=" + r.resultWho + " req=" + r.requestCode 329350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " res=" + resultCode + " data=" + resultData); 329450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.info.applicationInfo.uid > 0) { 329550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, 3296a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.packageName, resultData, 3297a1c69e084b5242ad4e4a1ef2fe8d99ba259b5af4Dianne Hackborn resultTo.getUriPermissionsLocked()); 329850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 329950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, 330050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resultData); 330150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.resultTo = null; 330250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 330350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r); 330450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 330550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this HistoryRecord is not holding on to other resources, 330650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // because clients have remote IPC references to this object so we 330750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // can't assume that will go away and want to avoid circular IPC refs. 330850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 330950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 331050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 331150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.icicle = null; 331250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 331350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 331450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 331550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 331650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 331750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 331850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 331950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 332150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean endTask = index <= 0 33220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn || (mHistory.get(index-1)).task != r.task; 332350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 332450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare close transition: finishing " + r); 332550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.prepareAppTransition(endTask 332650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ? WindowManagerPolicy.TRANSIT_TASK_CLOSE 33277da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); 332850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 332950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Tell window manager to prepare for this one to be removed. 333050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.setAppVisibility(r, false); 333150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mPausingActivity == null) { 333350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r); 333450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false"); 333550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn startPausingLocked(false, false); 333650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 333750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 333850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else if (r.state != ActivityState.PAUSING) { 333950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity is PAUSING, we will complete the finish once 334050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it is done pausing; else we can just directly finish it here. 334150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r); 334250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, 334350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn FINISH_AFTER_PAUSE) == null; 334450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 334550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r); 334650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 334750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 334850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 334950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 335050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_IMMEDIATELY = 0; 335250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_PAUSE = 1; 335350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static final int FINISH_AFTER_VISIBLE = 2; 335450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 335550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 335650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int mode) { 335750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int index = indexOfTokenLocked(r); 335850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index < 0) { 335950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return null; 336050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return finishCurrentActivityLocked(r, index, mode); 336350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 336450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 336550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, 336650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index, int mode) { 336750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // First things first: if this activity is currently visible, 336850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // and the resumed activity is not yet visible, then hold off on 336950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // finishing until the resumed one becomes visible. 337050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) { 337150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mStoppingActivities.contains(r)) { 337250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.add(r); 337350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mStoppingActivities.size() > 3) { 337450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we already have a few activities waiting to stop, 337550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // then give up on things going idle and start clearing 337650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // them out. 337750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = Message.obtain(); 337850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.what = IDLE_NOW_MSG; 337950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessage(msg); 33804eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn } else { 33814eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn checkReadyForSleepLocked(); 338250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 338350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 3384ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r 3385ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (finish requested)"); 338650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.STOPPING; 338750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.updateOomAdjLocked(); 338850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 338950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 339150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // make sure the record is cleaned out of other places. 339250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mStoppingActivities.remove(r); 33934eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn mGoingToSleepActivities.remove(r); 339450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 339550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 339650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 339750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 339850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final ActivityState prevState = r.state; 3399ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to FINISHING: " + r); 340050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.FINISHING; 340150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 340250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mode == FINISH_IMMEDIATELY 340350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.STOPPED 340450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn || prevState == ActivityState.INITIALIZING) { 340550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If this activity is already stopped, we can just finish 340650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it right now. 3407ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn return destroyActivityLocked(r, true, true) ? null : r; 340850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 340950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Need to go through the full pause cycle to get this 341050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // activity into the stopped state and then finish it. 341150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r); 341250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.add(r); 341350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 341450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return r; 341650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 341750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 341850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 341950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform the common clean-up of an activity record. This is called both 342050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * as part of destroyActivityLocked() (when destroying the client-side 342150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * representation) and cleaning things up as a result of its hosting 342250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * processing going away, in which case there is no remaining client-side 342350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * state to destroy so only the cleanup here is needed. 342450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 3425ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void cleanUpActivityLocked(ActivityRecord r, boolean cleanServices, 3426ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean setState) { 342750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mResumedActivity == r) { 342850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mResumedActivity = null; 342950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mFocusedActivity == r) { 343150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mFocusedActivity = null; 343250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 343350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 343450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configDestroy = false; 343550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.frozenBeforeDestroy = false; 343650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3437ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (setState) { 3438ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)"); 3439ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn r.state = ActivityState.DESTROYED; 3440ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3441ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 344250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Make sure this record is no longer in the pending finishes list. 344350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // This could happen, for example, if we are trimming activities 344450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // down to the max limit while they are still waiting to finish. 344550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mFinishingActivities.remove(r); 344650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mWaitingVisibleActivities.remove(r); 344750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 344850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Remove any pending results. 344950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && r.pendingResults != null) { 345050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn for (WeakReference<PendingIntentRecord> apr : r.pendingResults) { 345150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn PendingIntentRecord rec = apr.get(); 345250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (rec != null) { 345350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.cancelIntentSenderLocked(rec, false); 345450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.pendingResults = null; 345750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 345850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 345950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (cleanServices) { 346050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 346150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 346350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mPendingThumbnails.size() > 0) { 346450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // There are clients waiting to receive thumbnails so, in case 346550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // this is an activity that someone is waiting for, add it 346650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // to the pending list so we can correctly update the clients. 346750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mCancelledThumbnails.add(r); 346850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 346950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Get rid of any pending idle timeouts. 347150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r); 347250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 34730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); 347450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 347550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 347650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void removeActivityFromHistoryLocked(ActivityRecord r) { 347750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state != ActivityState.DESTROYED) { 347894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn r.makeFinishing(); 347950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(r); 3480f26fd99a7c2f554b0297760bb66336473c7db61fDianne Hackborn r.takeFromHistory(); 3481ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3482ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (removed from history)"); 348350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 348450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.removeAppToken(r); 348550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 348650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 348750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 348850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn cleanUpActivityServicesLocked(r); 348950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.removeUriPermissionsLocked(); 349050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 349250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 349350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 349450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Perform clean-up of service connections in an activity record. 349550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 349650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void cleanUpActivityServicesLocked(ActivityRecord r) { 349750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Throw away any services that have been bound by this activity. 349850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.connections != null) { 349950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Iterator<ConnectionRecord> it = r.connections.iterator(); 350050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (it.hasNext()) { 350150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ConnectionRecord c = it.next(); 350250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.removeConnectionLocked(c, null, r); 350350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.connections = null; 350550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 350750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3508ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn final void destroyActivitiesLocked(ProcessRecord owner, boolean oomAdj) { 3509ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 3510ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn ActivityRecord r = mHistory.get(i); 3511ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (owner != null && r.app != owner) { 3512ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn continue; 3513ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3514ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // We can destroy this one if we have its icicle saved and 3515ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it is not in the process of pausing/stopping/finishing. 3516ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (r.app != null && r.haveState && !r.visible && r.stopped && !r.finishing 3517ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYING 3518ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn && r.state != ActivityState.DESTROYED) { 3519ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, oomAdj); 3520ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3521ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3522ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 3523ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 352450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 352550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Destroy the current CLIENT SIDE instance of an activity. This may be 352650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * called both when actually finishing an activity, or when performing 352750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * a configuration switch where we destroy the current client-side object 352850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * but then create a new client-side object for this same HistoryRecord. 352950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 353050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean destroyActivityLocked(ActivityRecord r, 3531ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn boolean removeFromApp, boolean oomAdj) { 353250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v( 353350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing activity: token=" + r 353450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + ", app=" + (r.app != null ? r.app.processName : "(null)")); 353550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, 353650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), 353750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 353850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 353950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean removedFromHistory = false; 354050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3541ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn cleanUpActivityLocked(r, false, false); 354250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 354350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean hadApp = r.app != null; 354450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 354550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (hadApp) { 354650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (removeFromApp) { 354750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int idx = r.app.activities.indexOf(r); 354850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (idx >= 0) { 354950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.activities.remove(idx); 355050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) { 355250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHeavyWeightProcess = null; 355350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mHandler.sendEmptyMessage( 355450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG); 355550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 355650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app.activities.size() == 0) { 355750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // No longer have activities, so update location in 355850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // LRU list. 3559ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn mService.updateLruProcessLocked(r.app, oomAdj, false); 356050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 356250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean skipDestroy = false; 356450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 356550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 356650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r); 356750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleDestroyActivity(r, r.finishing, 356850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags); 356950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (Exception e) { 357050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We can just ignore exceptions here... if the process 357150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // has crashed, our death notification will clean things 357250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // up. 357350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn //Slog.w(TAG, "Exception thrown during finish", e); 357450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 357550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 357650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 357750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn skipDestroy = true; 357850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 357950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 358050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 358150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app = null; 358250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.nowVisible = false; 358350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3584ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // If the activity is finishing, we need to wait on removing it 3585ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // from the list to give it a chance to do its cleanup. During 3586ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // that time it may make calls back with its token so we need to 3587ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // be able to find it on the list and so we don't want to remove 3588ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it from the list yet. Otherwise, we can just immediately put 3589ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // it in the destroyed state since we are not removing it from the 3590ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn // list. 359150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing && !skipDestroy) { 3592ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYING: " + r 3593ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy requested)"); 359450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYING; 359550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG); 359650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn msg.obj = r; 359750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); 359850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3599ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3600ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (destroy skipped)"); 360150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 360250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 360350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 360450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // remove this record from the history. 360550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 360650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 360750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removedFromHistory = true; 360850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 3609ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r 3610ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn + " (no app)"); 361150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.state = ActivityState.DESTROYED; 361250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 361450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 361550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configChangeFlags = 0; 361650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 361750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!mLRUActivities.remove(r) && hadApp) { 361850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list"); 361950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return removedFromHistory; 362250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 362350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void activityDestroyed(IBinder token) { 362550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn synchronized (mService) { 362650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token); 362750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 362850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int index = indexOfTokenLocked(token); 362950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (index >= 0) { 36300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(index); 363150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.state == ActivityState.DESTROYING) { 363250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final long origId = Binder.clearCallingIdentity(); 363350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeActivityFromHistoryLocked(r); 363450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Binder.restoreCallingIdentity(origId); 363550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 363950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 364050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) { 364150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int i = list.size(); 364250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 364350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Removing app " + app + " from list " + list 364450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with " + i + " entries"); 364550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (i > 0) { 364650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn i--; 364750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = (ActivityRecord)list.get(i); 364850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 364950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "Record #" + i + " " + r + ": app=" + r.app); 365050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == app) { 365150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing this entry!"); 365250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn list.remove(i); 365350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 365450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 365550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 365650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 365750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn void removeHistoryRecordsForAppLocked(ProcessRecord app) { 365850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mLRUActivities, app); 365950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mStoppingActivities, app); 36604eba96bb314d8ff773ea33d6cb3179f25751ecceDianne Hackborn removeHistoryRecordsForAppLocked(mGoingToSleepActivities, app); 366150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mWaitingVisibleActivities, app); 366250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn removeHistoryRecordsForAppLocked(mFinishingActivities, app); 366350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 366450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 3665621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn /** 3666621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * Move the current home activity's task (if one exists) to the front 3667621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn * of the stack. 3668621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn */ 3669621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn final void moveHomeToFrontLocked() { 3670621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn TaskRecord homeTask = null; 3671621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn for (int i=mHistory.size()-1; i>=0; i--) { 36720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord hr = mHistory.get(i); 3673621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (hr.isHomeActivity) { 3674621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn homeTask = hr.task; 367594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn break; 3676621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3677621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3678621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn if (homeTask != null) { 3679621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn moveTaskToFrontLocked(homeTask, null); 3680621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3681621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn } 3682621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 3683621e17de87f18003aba2dedb719a2941020a7902Dianne Hackborn 368450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final void moveTaskToFrontLocked(TaskRecord tr, ActivityRecord reason) { 368550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr); 368650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 368750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int task = tr.taskId; 368850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int top = mHistory.size()-1; 368950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 36900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (top < 0 || (mHistory.get(top)).task.taskId == task) { 369150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // nothing to do! 369250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return; 369350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 369450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 369550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 369650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 369750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Applying the affinities may have removed entries from the history, 369850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // so get the size again. 369950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top = mHistory.size()-1; 370050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = top; 370150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 370250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task up to the top 370350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 370450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos >= 0) { 37050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 370650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 370750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 370850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 370950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + top); 371050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 371150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(top, r); 371250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(0, r); 371350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn top--; 371450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos--; 371650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 371750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 371850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 371950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to front transition: task=" + tr); 372050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 372150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 37227da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 37237da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 372450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 372550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 372650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 372750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 372850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 37297da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 37307da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false); 373150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 373350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToTop(moved); 373450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 373550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 373650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 373750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 373850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 373950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task); 374050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 374150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void finishTaskMoveLocked(int task) { 374350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn resumeTopActivityLocked(null); 374450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 374550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 374650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 374750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Worker method for rearranging history stack. Implements the function of moving all 374850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * activities for a specific task (gathering them if disjoint) into a single group at the 374950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * bottom of the stack. 375050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 375150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * If a watcher is installed, the action is preflighted and the watcher has an opportunity 375250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * to premeptively cancel the move. 375350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * 375450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @param task The taskId to collect and move to the bottom. 375550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * @return Returns true if the move completed, false if not. 375650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 375750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean moveTaskToBackLocked(int task, ActivityRecord reason) { 375850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Slog.i(TAG, "moveTaskToBack: " + task); 375950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 376050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If we have a watcher, preflight the move before committing to it. First check 376150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // for *other* available tasks, but if none are available, then try again allowing the 376250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // current task to be selected. 376350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack && mService.mController != null) { 376450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord next = topRunningActivityLocked(null, task); 376550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next == null) { 376650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn next = topRunningActivityLocked(null, 0); 376750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 376850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (next != null) { 376950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // ask watcher if this is allowed 377050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn boolean moveOK = true; 377150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 377250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moveOK = mService.mController.activityResuming(next.packageName); 377350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 377450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mController = null; 377550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (!moveOK) { 377750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 377850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 377950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 378150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ArrayList moved = new ArrayList(); 378350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_TRANSITION) Slog.v(TAG, 378550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Prepare to back transition: task=" + task); 378650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 378750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final int N = mHistory.size(); 378850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int bottom = 0; 378950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int pos = 0; 379050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 379150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Shift all activities with this task down to the bottom 379250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // of the stack, keeping them in the same internal order. 379350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn while (pos < N) { 37940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord r = mHistory.get(pos); 379550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v( 379650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TAG, "At " + pos + " ckp " + r.task + ": " + r); 379750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.task.taskId == task) { 379850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1)); 379950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.remove(pos); 380050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mHistory.add(bottom, r); 380150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn moved.add(r); 380250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn bottom++; 380350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn pos++; 380550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 380650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 380750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (reason != null && 380850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { 38097da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38107da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_NONE, false); 381150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn ActivityRecord r = topRunningActivityLocked(null); 381250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r != null) { 381350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mNoAnimActivities.add(r); 381450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 381550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } else { 38167da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mService.mWindowManager.prepareAppTransition( 38177da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); 381850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 381950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.moveAppTokensToBottom(moved); 382050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (VALIDATE_TOKENS) { 382150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.mWindowManager.validateAppTokens(mHistory); 382250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 382350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 382450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn finishTaskMoveLocked(task); 382550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 382650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 382750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 38280c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityManager.TaskThumbnails getTaskThumbnailsLocked(TaskRecord tr) { 38290c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(tr.taskId, true); 38300c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 38310c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed != null && resumed.thumbHolder == tr) { 38320c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = resumed.stack.screenshotActivities(resumed); 38330c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } else { 38340c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn info.mainThumbnail = tr.lastThumbnail; 38350c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38360c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info; 38370c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38380c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38390c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public ActivityRecord removeTaskActivitiesLocked(int taskId, int subTaskIndex) { 38400c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo info = getTaskAccessInfoLocked(taskId, false); 38410c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (info.root == null) { 38420c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown taskId " + taskId); 38430c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 38440c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex < 0) { 38470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Just remove the entire task. 38480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, info.rootIndex); 38490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return info.root; 38500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (subTaskIndex >= info.subtasks.size()) { 38530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn Slog.w(TAG, "removeTaskLocked: unknown subTaskIndex " + subTaskIndex); 38540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 38550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38570c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // Remove all of this task's activies starting at the sub task. 38580c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask subtask = info.subtasks.get(subTaskIndex); 38590c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn performClearTaskAtIndexLocked(taskId, subtask.index); 38600c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return subtask.activity; 38610c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38620c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38630c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public TaskAccessInfo getTaskAccessInfoLocked(int taskId, boolean inclThumbs) { 38640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord resumed = mResumedActivity; 38650c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final TaskAccessInfo thumbs = new TaskAccessInfo(); 38660c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn // How many different sub-thumbnails? 38670c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final int NA = mHistory.size(); 38680c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn int j = 0; 38690c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ThumbnailHolder holder = null; 38700c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 38710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 38720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (!ar.finishing && ar.task.taskId == taskId) { 38730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 38740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 38750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 38770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38780c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38790c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (j >= NA) { 38800c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 38810c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38820c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38830c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.root = mHistory.get(j); 38840c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.rootIndex = j; 38850c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 38860c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ArrayList<TaskAccessInfo.SubTask> subtasks = new ArrayList<TaskAccessInfo.SubTask>(); 38870c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.subtasks = subtasks; 38880c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord lastActivity = null; 38890c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn while (j < NA) { 38900c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn ActivityRecord ar = mHistory.get(j); 38910c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn j++; 38920c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.finishing) { 38930c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn continue; 38940c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38950c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.task.taskId != taskId) { 38960c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn break; 38970c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 38980c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastActivity = ar; 38990c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (ar.thumbHolder != holder && holder != null) { 39000c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.numSubThumbbails++; 39010c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn holder = ar.thumbHolder; 39020c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = new TaskAccessInfo.SubTask(); 39030c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = holder.lastThumbnail; 39040c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.activity = ar; 39050c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.index = j-1; 39060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn subtasks.add(sub); 39070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39080c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39090c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastActivity != null && subtasks.size() > 0) { 39100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (resumed == lastActivity) { 39110c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn TaskAccessInfo.SubTask sub = subtasks.get(subtasks.size()-1); 39120c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn sub.thumbnail = lastActivity.stack.screenshotActivities(lastActivity); 39130c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39140c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39150c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (thumbs.numSubThumbbails > 0) { 39160c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn thumbs.retriever = new IThumbnailRetriever.Stub() { 39170c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public Bitmap getThumbnail(int index) { 39180c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (index < 0 || index >= thumbs.subtasks.size()) { 39190c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return null; 39200c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs.subtasks.get(index).thumbnail; 39220c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39230c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn }; 39240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39250c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return thumbs; 39260c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 39270c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 392850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final void logStartActivity(int tag, ActivityRecord r, 392950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn TaskRecord task) { 393050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(tag, 393150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn System.identityHashCode(r), task.taskId, 393250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.shortComponentName, r.intent.getAction(), 393350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getType(), r.intent.getDataString(), 393450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.intent.getFlags()); 393550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 393650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 393750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn /** 393850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * Make sure the given activity matches the current configuration. Returns 393950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * false if the activity had to be destroyed. Returns true if the 394050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * configuration is the same, or the activity will remain running as-is 394150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * for whatever reason. Ensures the HistoryRecord is updated with the 394250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn * correct configuration and all other bookkeeping is handled. 394350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn */ 394450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn final boolean ensureActivityConfigurationLocked(ActivityRecord r, 394550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int globalChanges) { 394650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mConfigWillChange) { 394750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 394850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Skipping config check (will change): " + r); 394950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 395050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 395150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 395250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 395350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Ensuring correct configuration: " + r); 395450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 395550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Short circuit: if the two configurations are the exact same 395650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // object (the common case), then there is nothing to do. 395750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration newConfig = mService.mConfiguration; 3958e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (r.configuration == newConfig && !r.forceNewConfig) { 395950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 396050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration unchanged in " + r); 396150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 396250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 396350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 396450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // We don't worry about activities that are finishing. 396550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.finishing) { 396650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 396750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter in finishing " + r); 396850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 396950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 397050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 397150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 397250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Okay we now are going to make this activity have the new config. 397350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // But then we need to figure out how it needs to deal with that. 397450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn Configuration oldConfig = r.configuration; 397550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.configuration = newConfig; 397650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 397750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If the activity isn't currently running, just leave the new 397850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration and it will pick that up next time it starts. 397950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app == null || r.app.thread == null) { 398050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 398150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn "Configuration doesn't matter not running " + r); 398250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 3983e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 398450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 398550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 398650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 39873c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Figure out what has changed between the two configurations. 39883c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn int changes = oldConfig.diff(newConfig); 39893c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { 39903c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" 39913c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + Integer.toHexString(changes) + ", handles=0x" 3992e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn + Integer.toHexString(r.info.getRealConfigChanged()) 39933c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn + ", newConfig=" + newConfig); 39943c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } 3995e66763516a9c27c192adaba417616371a1c3c9bfDianne Hackborn if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) { 39963c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Aha, the activity isn't handling the change, so DIE DIE DIE. 39973c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags |= changes; 39983c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.startFreezingScreenLocked(r.app, globalChanges); 3999e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 40003c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (r.app == null || r.app.thread == null) { 40013c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40023c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is destroying non-running " + r); 4003ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn destroyActivityLocked(r, true, false); 40043c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.PAUSING) { 40053c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // A little annoying: we are waiting for this activity to 40063c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // finish pausing. Let's not do anything now, but just 40073c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // flag that it needs to be restarted when done pausing. 40083c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40093c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is skipping already pausing " + r); 40103c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configDestroy = true; 40113c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return true; 40123c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else if (r.state == ActivityState.RESUMED) { 40133c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Try to optimize this case: the configuration is changing 40143c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // and we need to restart the top, resumed activity. 40153c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // Instead of doing the normal handshaking, just say 40163c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // "restart!". 40173c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40183c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting resumed " + r); 40193c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, true); 40203c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 40213c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn } else { 40223c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG, 40233c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn "Switch is restarting non-resumed " + r); 40243c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn relaunchActivityLocked(r, r.configChangeFlags, false); 40253c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn r.configChangeFlags = 0; 402650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 40273c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn 40283c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // All done... tell the caller we weren't able to keep this 40293c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn // activity around. 40303c4c2b7e6f0674068d13b42d4dcf0fd009df0c49Dianne Hackborn return false; 403150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 403250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 403350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Default case: the activity can handle this new configuration, so 403450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // hand it over. Note that we don't need to give it the new 403550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // configuration, since we always send configuration changes to all 403650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // process when they happen so it can just use whatever configuration 403750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // it last got. 403850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (r.app != null && r.app.thread != null) { 403950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 404050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r); 404150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleActivityConfigurationChanged(r); 404250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 404350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // If process died, whatever. 404450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 404650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.stopFreezingScreenLocked(false); 404750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 404850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 404950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 405050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 405150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn private final boolean relaunchActivityLocked(ActivityRecord r, 405250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn int changes, boolean andResume) { 405350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<ResultInfo> results = null; 405450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn List<Intent> newIntents = null; 405550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 405650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn results = r.results; 405750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn newIntents = r.newIntents; 405850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 405950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r 406050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " with results=" + results + " newIntents=" + newIntents 406150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn + " andResume=" + andResume); 406250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY 406350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r), 406450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.task.taskId, r.shortComponentName); 406550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 406650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.startFreezingScreenLocked(r.app, 0); 406750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 406850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn try { 406950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); 4070e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn r.forceNewConfig = false; 407150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.app.thread.scheduleRelaunchActivity(r, results, newIntents, 407250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn changes, !andResume, mService.mConfiguration); 407350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // Note: don't need to call pauseIfSleepingLocked() here, because 407450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // the caller will only pass in 'andResume' if this activity is 407550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn // currently resumed, which implies we aren't sleeping. 407650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } catch (RemoteException e) { 407750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return false; 407850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 407950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 408050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (andResume) { 408150dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.results = null; 408250dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn r.newIntents = null; 408350dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn if (mMainStack) { 408450dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn mService.reportResumedActivityLocked(r); 408550dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 408650dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 408750dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn 408850dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn return true; 408950dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn } 409050dc3bca5afbce911636b3ba15ee953bc203a9d6Dianne Hackborn} 4091