ActivityStackSupervisor.java revision 20e7227454bf6f3500c6eb97a17483dd8b764341
1270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner/* 2270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Copyright (C) 2013 The Android Open Source Project 3270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 4270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * you may not use this file except in compliance with the License. 6270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * You may obtain a copy of the License at 7270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 8270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 10270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Unless required by applicable law or agreed to in writing, software 11270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * See the License for the specific language governing permissions and 14270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * limitations under the License. 15270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner */ 16270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 17270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpackage com.android.server.am; 18270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CLEANUP; 208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; 218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG; 228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver; 2420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo; 252219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context; 262219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent; 272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo; 288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle; 292219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper; 308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException; 318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog; 322219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor; 348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException; 35270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter; 362219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList; 378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List; 38270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 39270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor { 402219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public static final int HOME_STACK_ID = 0; 41270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 42270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner final ActivityManagerService mService; 432219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner final Context mContext; 442219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner final Looper mLooper; 45270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 46270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner /** Dismiss the keyguard after the next activity is displayed? */ 47270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner private boolean mDismissKeyguardOnNextActivity = false; 48270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Identifier counter for all ActivityStacks */ 508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private int mLastStackId = 0; 518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Task identifier that activities are currently being started in. Incremented each time a 538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * new task is created. */ 548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private int mCurTaskId = 0; 558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** The stack containing the launcher app */ 572219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ActivityStack mHomeStack; 5820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 5920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner /** The stack currently receiving input or launching the next activity */ 602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ActivityStack mMainStack; 618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** All the non-launcher stacks */ 632219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 642219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 652219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public ActivityStackSupervisor(ActivityManagerService service, Context context, 662219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner Looper looper) { 67270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService = service; 682219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mContext = context; 692219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mLooper = looper; 702219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 712219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 722219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void init() { 732219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this); 742219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner setMainStack(mHomeStack); 758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.add(mHomeStack); 76270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 77270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 78270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void dismissKeyguard() { 79270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner if (mDismissKeyguardOnNextActivity) { 80270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = false; 81270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService.mWindowManager.dismissKeyguard(); 82270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 83270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 84270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 8520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean isHomeStackMain() { 8620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return mHomeStack == mMainStack; 8720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 8820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 892219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner boolean isMainStack(ActivityStack stack) { 902219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner return stack == mMainStack; 912219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 922219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 9320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityStack getMainStack() { 9420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return mMainStack; 9520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 9620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void setMainStack(ActivityStack stack) { 982219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mMainStack = stack; 992219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 1002219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 101270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void setDismissKeyguard(boolean dismiss) { 102270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = dismiss; 103270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 104270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 1058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord anyTaskForIdLocked(int id) { 1068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner ActivityStack stack = mStacks.get(stackNdx); 1088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord task = stack.taskForIdLocked(id); 1098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (task != null) { 1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return task; 1118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 1148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int getNextTaskId() { 1178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner do { 1188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId++; 1198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mCurTaskId <= 0) { 1208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId = 1; 1218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } while (anyTaskForIdLocked(mCurTaskId) != null); 1238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mCurTaskId; 1248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 12620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception { 12720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean didSomething = false; 12820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final String processName = app.processName; 12920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 13020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 13120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord hr = stack.topRunningActivityLocked(null); 13220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (hr != null) { 13320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (hr.app == null && app.uid == hr.info.applicationInfo.uid 13420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner && processName.equals(hr.processName)) { 13520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner try { 13620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (headless) { 13720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner Slog.e(TAG, "Starting activities not supported on headless device: " 13820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner + hr); 13920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } else if (stack.realStartActivityLocked(hr, app, true, true)) { 14020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner didSomething = true; 14120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 14220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } catch (Exception e) { 14320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner Slog.w(TAG, "Exception in new application when starting activity " 14420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner + hr.intent.getComponent().flattenToShortString(), e); 14520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner throw e; 14620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 14720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } else { 14820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner stack.ensureActivitiesVisibleLocked(hr, null, processName, 0); 14920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 15020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 15120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 15220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return didSomething; 15320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 15420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 15520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean allResumedActivitiesIdle() { 15620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 15720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (mStacks.get(stackNdx).mResumedActivity == null || 15820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner !mStacks.get(stackNdx).mResumedActivity.idle) { 15920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return false; 16020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 16120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 16220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return true; 16320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 16420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 16520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, 16620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { 16720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord r = null; 16820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final int numStacks = mStacks.size(); 16920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 17020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 17120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityRecord ar = 17220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner stack.getTasksLocked(maxNum - list.size(), receiver, pending, list); 17320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (isMainStack(stack)) { 17420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner r = ar; 17520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 17620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 17720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return r; 17820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 17920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 1802219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void startHomeActivity(Intent intent, ActivityInfo aInfo) { 1812219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mHomeStack.startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0, 1822219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner null, false, null); 1838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppDiedLocked(ProcessRecord app, boolean restarting) { 1868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Just in case. 1878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 1888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 1898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 1908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mPausingActivity != null && stack.mPausingActivity.app == app) { 1918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG, 1928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner "App died while pausing: " + stack.mPausingActivity); 1938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.mPausingActivity = null; 1948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mLastPausedActivity != null && stack.mLastPausedActivity.app == app) { 1968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.mLastPausedActivity = null; 1978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 1988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Remove this application's activities from active lists. 2008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean hasVisibleActivities = stack.removeHistoryRecordsForAppLocked(app); 2018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (!restarting) { 2038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (!stack.resumeTopActivityLocked(null)) { 2048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // If there was nothing to resume, and we are not already 2058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // restarting this process, but there is a visible activity that 2068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // is hosted by the process... then make sure all visible 2078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // activities are running, taking care of restarting this 2088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // process. 2098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (hasVisibleActivities) { 2108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.ensureActivitiesVisibleLocked(null, 0); 2118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 2188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 2198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.closeSystemDialogsLocked(); 2228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 2268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 2278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 2288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 2298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 2308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 2318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 2348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner didSomething = true; 2358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 2388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void resumeTopActivityLocked() { 2418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int start, end; 24220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (isHomeStackMain()) { 2438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner start = 0; 2448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner end = 1; 2458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else { 2468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner start = 1; 2478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner end = mStacks.size(); 2488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = start; stackNdx < end; ++stackNdx) { 2508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.get(stackNdx).resumeTopActivityLocked(null); 2518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 2558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 2568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.finishTopRunningActivityLocked(app); 2598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleIdleLocked() { 2638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.get(stackNdx).scheduleIdleLocked(); 2658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) { 2698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) { 2718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 2728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private ActivityStack getStack(int stackId) { 2778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.getStackId() == stackId) { 2808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return stack; 2818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 2848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int createStack(int relativeStackId, int position, float weight) { 2878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner synchronized (this) { 2888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner while (true) { 2898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (getStack(mLastStackId) == null) { 2938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner break; 2948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId, this)); 2978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mLastStackId; 2988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void moveTaskToStack(int taskId, int stackId, boolean toTop) { 3028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 3038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 3048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 3058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 3068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.moveTask(taskId, toTop); 3088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 3118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 3128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.get(stackNdx).stopIfSleepingLocked(); 3138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 3178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean timedout = false; 3188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mResumedActivity != null) { 3228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.stopIfSleepingLocked(); 3238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final long endTime = System.currentTimeMillis() + timeout; 3248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner while (stack.mResumedActivity != null || stack.mPausingActivity != null) { 3258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner long delay = endTime - System.currentTimeMillis(); 3268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (delay <= 0) { 3278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 3288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner timedout = true; 3298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner break; 3308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 3328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mService.wait(); 3338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 3348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 3398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 3428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.awakeFromSleepingLocked(); 3468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.resumeTopActivityLocked(null); 3478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 3518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.handleAppCrashLocked(app); 3558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean updateConfigurationLocked(int changes, ActivityRecord starting) { 3598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean kept = true; 3608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (changes != 0 && starting == null) { 3648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // If the configuration changed, and the caller is not already 3658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // in the process of starting an activity, then find the top 3668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // activity to check if its configuration needs to change. 3678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner starting = stack.topRunningActivityLocked(null); 3688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (starting != null) { 3718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (!stack.ensureActivityConfigurationLocked(starting, changes)) { 3728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner kept = false; 3738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // And we need to make sure at this point that all other activities 3758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // are made visible with the correct configuration. 3768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.ensureActivitiesVisibleLocked(starting, changes); 3778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return kept; 3808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 3838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.scheduleDestroyActivities(app, false, reason); 3878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 3918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean haveActivities = false; 3928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 3938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 3958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner haveActivities |= stack.switchUserLocked(userId, uss); 3968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return haveActivities; 3982219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3992219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 400270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 401270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:"); 402270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.println(mDismissKeyguardOnNextActivity); 403270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 4048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 40520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 40620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return mMainStack.getDumpActivitiesLocked(name); 40720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 4098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 4108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 4118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 4128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 4138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 4148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":"); 4158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage); 4168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" Running activities (most recent first):"); 4188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, !dumpAll, false, 4198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpPackage); 4208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mWaitingVisibleActivities.size() > 0) { 4218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" Activities waiting for another to become visible:"); 4238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpHistoryList(fd, pw, stack.mWaitingVisibleActivities, " ", "Wait", false, 4248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner !dumpAll, false, dumpPackage); 4258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mStoppingActivities.size() > 0) { 4278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" Activities waiting to stop:"); 4298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpHistoryList(fd, pw, stack.mStoppingActivities, " ", "Stop", false, 4308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner !dumpAll, false, dumpPackage); 4318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mGoingToSleepActivities.size() > 0) { 4338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" Activities waiting to sleep:"); 4358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, " ", "Sleep", false, 4368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner !dumpAll, false, dumpPackage); 4378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mFinishingActivities.size() > 0) { 4398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" Activities waiting to finish:"); 4418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner dumpHistoryList(fd, pw, stack.mFinishingActivities, " ", "Fin", false, 4428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner !dumpAll, false, dumpPackage); 4438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 4468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 4478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 4488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" Stack #"); pw.println(mStacks.indexOf(stack)); 4498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.mPausingActivity != null) { 4508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" mPausingActivity: " + stack.mPausingActivity); 4518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" mResumedActivity: " + stack.mResumedActivity); 4538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpAll) { 4548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" mLastPausedActivity: " + stack.mLastPausedActivity); 4558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" mSleepTimeout: " + stack.mSleepTimeout); 4568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 4598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpAll) { 4608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" mCurTaskId: " + mCurTaskId); 4628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return true; 4648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 4668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 4678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 4688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String dumpPackage) { 4698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 4708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean needNL = false; 4718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final String innerPrefix = prefix + " "; 4728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final String[] args = new String[0]; 4738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 4748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 4758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 4768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 4778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 4798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 4808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(" "); 4818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 4828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 4848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 4858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 4868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 4878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 4888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 4898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 4908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 4918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 4928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 4938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 4948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 4958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 4998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 5008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 5018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 5028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 5038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 5048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 5058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 5068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 5078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 5088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 5118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 5128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 5138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 5148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 5158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 5168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 5178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 5188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 5198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 5208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 5218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 5228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 5238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 5248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 5268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 5278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 5288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 5298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 5318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 534270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 535