ActivityStackSupervisor.java revision 23ac33bb85de7e840dd3c35c21c05ead5bc39b03
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;
2023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION;
218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE;
228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
2523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
2623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
2723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
2820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
2923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
3020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
3123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
3223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
332219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
3423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
352219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
3623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
372219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
3823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
452219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
502219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
55270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
58270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
59270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor {
602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
61270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
62270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
632219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
642219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
65270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
66270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
67270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
68270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mLastStackId = 0;
718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
7820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
7920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    /** The stack currently receiving input or launching the next activity */
802219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mMainStack;
818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
832219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
842219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
862219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
87270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
882219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
892219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
902219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
912219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
922219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void init() {
932219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this);
942219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        setMainStack(mHomeStack);
958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
96270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
97270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
98270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
99270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
100270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
101270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mService.mWindowManager.dismissKeyguard();
102270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
103270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
104270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
10520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean isHomeStackMain() {
10620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mHomeStack == mMainStack;
10720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
10820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    boolean isMainStack(ActivityStack stack) {
1102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        return stack == mMainStack;
1112219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
11320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityStack getMainStack() {
11420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack;
11520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
11620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void setMainStack(ActivityStack stack) {
1182219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mMainStack = stack;
1192219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1202219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
121270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
122270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
123270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
124270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
1268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
1288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
1298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
1308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
1318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
1348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
1378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
1388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
1398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
1408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
1418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
1438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
1448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
14720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
14820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
14920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
15020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
15120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
15220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
15320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
15420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
15520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
15620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
15720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
15820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
15920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        } else if (stack.realStartActivityLocked(hr, app, true, true)) {
16020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
16120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
16220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
16320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
16420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
16520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
16620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
16720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                } else {
16820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.ensureActivitiesVisibleLocked(hr, null, processName, 0);
16920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
17020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
17120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
17220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
17320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
17420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
17520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
17620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
17720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (mStacks.get(stackNdx).mResumedActivity == null ||
17820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    !mStacks.get(stackNdx).mResumedActivity.idle) {
17920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
18020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
18120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
18220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
18320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
18420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
18520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
18620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
18720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
18820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final int numStacks = mStacks.size();
18920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
19220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
19320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (isMainStack(stack)) {
19420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
19520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
19620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
19720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
19820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
19920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
20023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
20123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
20223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
20323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
20423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
20523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
20623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
20723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
20823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
20923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
21023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
21123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
21223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
21323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
21423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
21523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
21623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
21723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
21823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
21923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
22023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
22123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
22223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
22323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
22423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
22523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
22623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
22723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
22823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
22923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
23023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
23123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
23223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
23323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
23423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
23523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
23623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
23723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
23823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
23923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
24023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
24123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
24223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
24323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
24423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
24523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
24623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
2472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
2482219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mHomeStack.startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
2492219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
2508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
25223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
25323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
25423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
25523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
25623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
25723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
25823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
25923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
26023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
26123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
26223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
26323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
26423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
26523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
26623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
26723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
26823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
26923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
27023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
27123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
27223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
27323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
27423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
27523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
27623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
27723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
27823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
27923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
28023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
28123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            mMainStack.mConfigWillChange = config != null
28223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
28323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
28423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    "Starting activity when config will change = " + mMainStack.mConfigWillChange);
28523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
28623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
28723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
28823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
28923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
29023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
29123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
29223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
29323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
29423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
29523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
29623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingPid = callingPid;
29723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
29823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
29923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
30023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
30123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingPid = callerApp.pid;
30223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
30323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
30423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
30523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + " (pid=" + realCallingPid + ") when starting: "
30623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
30723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
30823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
30923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
31023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
31123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
31323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
31423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
31523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
31623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
31723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
31923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
32023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
32123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
32223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
32323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
32423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
32523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
32623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
32723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
32823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
32923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
33023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
33123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
33223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
33323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
33423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
33523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
33623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
33723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
33823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
33923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
34023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
34123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
34223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
34323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
34423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
34523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
34623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
34723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
34823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
34923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
35023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
35123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
35223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
35323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
35423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
35523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
35623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
35723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
35823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int res = mMainStack.startActivityLocked(caller, intent, resolvedType,
35923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
36023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
36123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
36223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (mMainStack.mConfigWillChange) {
36323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
36423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
36523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
36623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
36723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
36823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
36923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mMainStack.mConfigWillChange = false;
37023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
37123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
37223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
37323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
37423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
37523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
37623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
37723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
37823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
37923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
38023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mMainStack.mWaitingActivityLaunched.add(outResult);
38123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
38223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
38323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
38423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
38523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
38623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
38723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
38823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityRecord r = mMainStack.topRunningActivityLocked(null);
38923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
39023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
39123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
39223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
39323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
39423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
39523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
39623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        mMainStack.mWaitingActivityVisible.add(outResult);
39723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
39823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
39923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
40023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
40123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
40223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
40323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
40423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
40523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
40623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
40723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
40823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
40923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
41023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
41123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
41223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
41323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
41423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
41523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
41623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
41723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
41823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
41923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
42023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
42123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
42223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
42323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
42423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityRecord[] outActivity = new ActivityRecord[1];
42523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
42623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
42723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
42823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
42923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
43023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
43123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
43223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
43323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
43423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
43523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
43623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
43723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
43823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
43923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
44023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
44123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
44223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
44323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
44423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
44523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
44623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
44723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
44823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
44923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
45123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
45323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
45423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
45623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
45723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
45823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
45923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
46023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
46123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
46223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
46323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
46423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
46523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
46623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
46723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
46823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
46923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
47023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
47123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
47223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
47323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
47423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    int res = mMainStack.startActivityLocked(caller, intent, resolvedTypes[i],
47523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
47623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
47723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
47823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
47923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
48023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
48223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
48323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
48423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
48523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
48623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
48723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
48923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
49023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
4918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
4928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
4938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
4948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
4958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
4968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null && stack.mPausingActivity.app == app) {
4978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (DEBUG_PAUSE || DEBUG_CLEANUP) Slog.v(TAG,
4988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        "App died while pausing: " + stack.mPausingActivity);
4998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.mPausingActivity = null;
5008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mLastPausedActivity != null && stack.mLastPausedActivity.app == app) {
5028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.mLastPausedActivity = null;
5038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            // Remove this application's activities from active lists.
5068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean hasVisibleActivities = stack.removeHistoryRecordsForAppLocked(app);
5078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (!restarting) {
5098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (!stack.resumeTopActivityLocked(null)) {
5108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // If there was nothing to resume, and we are not already
5118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // restarting this process, but there is a visible activity that
5128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // is hosted by the process...  then make sure all visible
5138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // activities are running, taking care of restarting this
5148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // process.
5158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (hasVisibleActivities) {
5168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        stack.ensureActivitiesVisibleLocked(null, 0);
5178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
5188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
5198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
5248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
5258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
5268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
5278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
5288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
5328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
5338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
5348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
5358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
5368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
5378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
5388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
5398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
5408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
5418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
5448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void resumeTopActivityLocked() {
5478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int start, end;
54820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        if (isHomeStackMain()) {
5498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            start = 0;
5508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            end = 1;
5518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } else {
5528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            start = 1;
5538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            end = mStacks.size();
5548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = start; stackNdx < end; ++stackNdx) {
5568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).resumeTopActivityLocked(null);
5578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
5618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
5628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
5638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
5648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
5658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleIdleLocked() {
5698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
5708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).scheduleIdleLocked();
5718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
5758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
5768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
5778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
5788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private ActivityStack getStack(int stackId) {
5838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
5848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
5858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
5868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
5878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
5898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
5908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
5928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int createStack(int relativeStackId, int position, float weight) {
5938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        synchronized (this) {
5948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            while (true) {
5958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (++mLastStackId <= HOME_STACK_ID) {
5968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    mLastStackId = HOME_STACK_ID + 1;
5978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
5988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (getStack(mLastStackId) == null) {
5998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    break;
6008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
6018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
6028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId, this));
6038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return mLastStackId;
6048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
6088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
6098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
6108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
6118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
6128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        stack.moveTask(taskId, toTop);
6148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
6178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
6188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).stopIfSleepingLocked();
6198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
6238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
6248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
6268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
6278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mResumedActivity != null) {
6288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.stopIfSleepingLocked();
6298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                final long endTime = System.currentTimeMillis() + timeout;
6308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                while (stack.mResumedActivity != null || stack.mPausingActivity != null) {
6318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    long delay = endTime - System.currentTimeMillis();
6328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (delay <= 0) {
6338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        Slog.w(TAG, "Activity manager shutdown timed out");
6348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        timedout = true;
6358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        break;
6368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
6378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
6388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        mService.wait();
6398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
6408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
6418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
6428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
6438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
6458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
6488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
6508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
6518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.awakeFromSleepingLocked();
6528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.resumeTopActivityLocked(null);
6538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
6578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
6598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
6608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
6618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean updateConfigurationLocked(int changes, ActivityRecord starting) {
6658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean kept = true;
6668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
6688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
6698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (changes != 0 && starting == null) {
6708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // If the configuration changed, and the caller is not already
6718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // in the process of starting an activity, then find the top
6728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // activity to check if its configuration needs to change.
6738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                starting = stack.topRunningActivityLocked(null);
6748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
6758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (starting != null) {
6778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (!stack.ensureActivityConfigurationLocked(starting, changes)) {
6788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    kept = false;
6798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
6808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // And we need to make sure at this point that all other activities
6818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // are made visible with the correct configuration.
6828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.ensureActivitiesVisibleLocked(starting, changes);
6838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
6848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return kept;
6868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
6898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
6918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
6928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
6938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
6948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
6968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
6978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean haveActivities = false;
6988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
6998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
7008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
7018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            haveActivities |= stack.switchUserLocked(userId, uss);
7028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
7038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
7042219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
7052219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
706270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
707270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
708270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
709270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
7108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
71120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
71220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack.getDumpActivitiesLocked(name);
71320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
71420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
7158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
7168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
7178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
7188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
7198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
7208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":");
7218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage);
7228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
7238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  Running activities (most recent first):");
7248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            dumpHistoryList(fd, pw, stack.mLRUActivities, "  ", "Run", false, !dumpAll, false,
7258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    dumpPackage);
7268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mWaitingVisibleActivities.size() > 0) {
7278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
7288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting for another to become visible:");
7298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mWaitingVisibleActivities, "  ", "Wait", false,
7308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
7318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mStoppingActivities.size() > 0) {
7338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
7348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to stop:");
7358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mStoppingActivities, "  ", "Stop", false,
7368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
7378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mGoingToSleepActivities.size() > 0) {
7398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
7408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to sleep:");
7418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, "  ", "Sleep", false,
7428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
7438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mFinishingActivities.size() > 0) {
7458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
7468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to finish:");
7478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mFinishingActivities, "  ", "Fin", false,
7488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
7498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
7518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
7528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
7538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
7548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.println(mStacks.indexOf(stack));
7558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null) {
7568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mPausingActivity: " + stack.mPausingActivity);
7578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mResumedActivity: " + stack.mResumedActivity);
7598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
7608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mLastPausedActivity: " + stack.mLastPausedActivity);
7618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mSleepTimeout: " + stack.mSleepTimeout);
7628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
7648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
7658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (dumpAll) {
7668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
7678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mCurTaskId: " + mCurTaskId);
7688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
7698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return true;
7708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
7718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
7728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
7738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
7748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String dumpPackage) {
7758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
7768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean needNL = false;
7778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String innerPrefix = prefix + "      ";
7788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String[] args = new String[0];
7798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
7808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
7818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
7828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
7838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
7858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
7868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
7878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
7888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
7898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
7908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
7918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
7928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
7938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
7948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
7958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
7968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
7978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
7988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
7998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
8008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
8018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
8028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
8038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
8048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
8058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
8068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
8078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
8088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
8098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
8108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
8118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
8128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
8138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
8148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
8158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
8168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
8178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
8188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
8198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
8208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
8218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
8228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
8238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
8248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
8258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
8268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
8278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
8288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
8298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
8308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
8318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
8328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
8338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
8348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
8358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
8368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
8378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
8388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
8398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
840270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
841