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