ActivityStackSupervisor.java revision 6170f73ed5464491b91685b57e116db033e98d5a
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
196170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.Manifest.permission.START_ANY_ACTIVITY;
206170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.content.pm.PackageManager.PERMISSION_GRANTED;
212420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.localLOGV;
2223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION;
236170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS;
242420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH;
258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
272420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
2823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
2923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
3123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
3220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
3323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
3420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
3523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
362420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
382219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
402219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
422219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
4323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
4523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
502219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
512420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
556170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
562420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
582219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
5923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
606170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
612420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
65270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
662219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
68270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
69270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor {
702420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_ADD_REMOVE = false;
712420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_APP = false;
722420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_SAVED_STATE = false;
732420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_STATES = false;
742420ead0326bfd2587da6231be419e758dba1930Craig Mautner
752219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
76270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
77270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
782219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
792219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
80270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
81270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
82270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
83270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mLastStackId = 0;
868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
912420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
922420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
932420ead0326bfd2587da6231be419e758dba1930Craig Mautner
948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
952219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
9620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
9720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    /** The stack currently receiving input or launching the next activity */
982219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mMainStack;
998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1012219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1022219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1032219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
1042219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
105270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
1062219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
1072219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
1082219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1102420ead0326bfd2587da6231be419e758dba1930Craig Mautner    void init(int userId) {
1112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this, userId);
1122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        setMainStack(mHomeStack);
1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
114270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
115270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
116270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
117270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
118270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
119270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mService.mWindowManager.dismissKeyguard();
120270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
121270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
122270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
12320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean isHomeStackMain() {
12420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mHomeStack == mMainStack;
12520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
12620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    boolean isMainStack(ActivityStack stack) {
1282219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        return stack == mMainStack;
1292219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1302219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
13120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityStack getMainStack() {
13220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack;
13320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
13420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1352219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void setMainStack(ActivityStack stack) {
1362219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mMainStack = stack;
1372219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1382219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
139270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
140270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
141270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
142270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
1448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
1468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
1478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
1488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
1498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
1528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
1556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
1576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
1586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
1596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
1606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
1616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
1626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
1636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
1658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
1668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
1678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
1688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
1698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
1718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
1728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
17520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
17620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
17720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
17820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
17920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
18020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
18120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
18220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
18320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
18420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
18520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
18620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
1872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
18820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
18920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
19020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
19120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
19220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
19320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
19420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
19520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                } else {
19620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.ensureActivitiesVisibleLocked(hr, null, processName, 0);
19720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
19820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
19920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
20020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
20120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
20220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
20320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
20420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
205dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            final ActivityRecord resumedActivity = mStacks.get(stackNdx).mResumedActivity;
206dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
20720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
20820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
20920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
21020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
21120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
21220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
21320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
21420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
21520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
21620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final int numStacks = mStacks.size();
21720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
21920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
22020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
22120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (isMainStack(stack)) {
22220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
22320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
22420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
22520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
22620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
22720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
22823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
22923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
23023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
23123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
23223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
23323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
23423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
23523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
23623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
23723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
23823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
23923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
24023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
24123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
24223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
24323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
24423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
24523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
24623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
24723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
24823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
24923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
25023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
25123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
25223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
25323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
25423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
25523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
25623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
25723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
25823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
25923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
26023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
26123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
26223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
26323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
26423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
26523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
26623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
26723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
26823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
26923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
27023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
27123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
27223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
27323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
27423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
2752219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
2766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
2772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
2788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
28023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
28123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
28223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
28323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
28423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
28523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
28623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
28723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
28823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
28923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
29023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
29123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
29223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
29323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
29423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
29523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
29623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
29723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
29823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
29923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
30023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
30123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
30223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
30323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
30423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
30523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
30623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
30723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
30823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
30923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            mMainStack.mConfigWillChange = config != null
31023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
31123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
31223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    "Starting activity when config will change = " + mMainStack.mConfigWillChange);
31323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
31523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
31723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
31823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
31923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
32023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
32123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
32223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
32323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
32423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingPid = callingPid;
32523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
32623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
32723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
32823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
32923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingPid = callerApp.pid;
33023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
33123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
33223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
33323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + " (pid=" + realCallingPid + ") when starting: "
33423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
33523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
33623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
33723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
33823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
33923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
34023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
34123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
34223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
34323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
34423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
34523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
34623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
34723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
34823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
34923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
35023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
35123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
35223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
35323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
35423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
35523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
35623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
35723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
35823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
35923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
36023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
36123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
36223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
36323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
36423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
36523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
36623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
36723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
36823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
36923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
37023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
37123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
37223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
37323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
37423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
37523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
37623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
37723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
37823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
37923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
38023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
38123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
38223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
38323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
38423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
38523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
3866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
38723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
38823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
38923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
39023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (mMainStack.mConfigWillChange) {
39123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
39223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
39323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
39423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
39523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
39623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
39723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mMainStack.mConfigWillChange = false;
39823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
39923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
40023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
40123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
40223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
40323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
40423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
40523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
40623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
40723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
40823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mMainStack.mWaitingActivityLaunched.add(outResult);
40923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
41023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
41123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
41223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
41323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
41423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
41523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
41623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityRecord r = mMainStack.topRunningActivityLocked(null);
41723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
41823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
41923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
42023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
42123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
42223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
42323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
42423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        mMainStack.mWaitingActivityVisible.add(outResult);
42523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
42623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
42723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
42823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
42923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
43023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
43123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
43223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
43323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
43423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
43523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
43623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
43723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
43823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
43923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
44023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
44123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
44223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
44323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
44423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
44523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
44623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
44723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
44823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
44923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
45023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
45123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityRecord[] outActivity = new ActivityRecord[1];
45323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
45523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
45623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
45723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
45823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
45923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
46023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
46123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
46223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
46323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
46423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
46523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
46623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
46723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
46823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
46923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
47023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
47123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
47223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
47323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
47423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
47523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
47623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
47723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
47823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
47923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
48123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
48223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
48423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
48523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
48623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
48723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
48823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
49023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
49123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
49223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
49323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
49423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
49523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
49623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
49723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
49823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
49923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
50023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
50123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
5026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
50323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
50423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
50523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
50623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
50723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
50823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
50923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
51023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
51123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
51223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
51323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
51423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
51523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
51723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
51823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
5192420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
5202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
5212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
5222420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
5242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.mWindowManager.setAppVisibility(r.appToken, true);
5252420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5262420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
5272420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
5282420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5292420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
5302420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
5312420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
5322420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
5332420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
5342420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
5352420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
5362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
5372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
5382420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
5392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
5402420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
5412420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5422420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
5432420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
5442420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
5452420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
5462420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5472420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
5482420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5492420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
5502420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
5512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
5522420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
5532420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.updateLruProcessLocked(app, true);
5542420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5552420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
5562420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
5572420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
5582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
5592420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5602420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
5612420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
5622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
5632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
5642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
5652420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5662420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
5672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
5682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
5692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
5702420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
5712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
5722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
5732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
5742420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5752420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.isHomeActivity) {
5762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.mHomeProcess = app;
5772420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5782420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
5792420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
5802420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
5812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
5822420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
5832420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
5842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
5852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
5862420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
5872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
5882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
5892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
5902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
5912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
5922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
5932420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5942420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
5952420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
5962420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
5972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
5982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
5992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
6002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
6012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
6022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
6032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
6042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
6052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
6062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
6072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
6082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6092420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
6102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
6112420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    new Configuration(mService.mConfiguration),
6122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.compat, r.icicle, results, newIntents, !andResume,
6132420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
6142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
6152420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
6172420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
6182420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
6192420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
6202420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
6212420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
6222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
6232420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
6242420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
6252420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
6262420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
6272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
6282420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
6292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
6302420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
6312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
6322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
6332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
6342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6352420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6362420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
6372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
6382420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
6392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
6402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
6412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
6422420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
6432420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
6442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
6452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
6462420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
6472420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6482420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
6502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
6512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
6522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
6532420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6542420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6552420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
6562420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
6572420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
6582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
6592420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6602420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6612420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
6622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
6632420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
6642420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
6652420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
6662420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
6672420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
6682420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
6692420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
6702420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
6712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
6722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
6732420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
6742420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6752420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6762420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
6772420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
6782420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
6792420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
6802420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (isMainStack(stack)) {
6812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
6822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6832420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6842420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
6852420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
6862420ead0326bfd2587da6231be419e758dba1930Craig Mautner
687e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
688e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
689e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
690e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
691e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                r.info.applicationInfo.uid);
692e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
693e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
694e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
695e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
696e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
697e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                app.addPackage(r.info.packageName);
698e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
699e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
700e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
701e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
702e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
703e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
704e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
705e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
706e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
707e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
708e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
709e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
710e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                "activity", r.intent.getComponent(), false, false);
711e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
712e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
7136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
7146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
7156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
7166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
7176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
7186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
7196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
7216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
7226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
7236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
7246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
7256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
7266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
7276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
7286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
7296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
7306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
7316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
7356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
7366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
7376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
7386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
7416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
7426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
7436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
7446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
7456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
7466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
7476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
7486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
7496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
7506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
7536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
7556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
7576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
7586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
7596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
7606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
7616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
7626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
7636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
7656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
7666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
7676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
7686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
7696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
7706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
7716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
7756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
7766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
7776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
7786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
7816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
7826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
7836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
7846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
7876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
7886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
7896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
7906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
7916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
7936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
7946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
7956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
7986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
7996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
8006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
8016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
8026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
8036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
8046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
8056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
8066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
8086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
8096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
8106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
8116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
8126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
8136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
8146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
8156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
8166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
8176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
8186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
8196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
8216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
8226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
8256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean abort = false;
8266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
8276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
8286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
8296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
8306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                abort = !mService.mController.activityStarting(watchIntent,
8316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
8326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
8336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
8346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (abort) {
8376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (resultRecord != null) {
8386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
8396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
8406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
8416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // We pretend to the caller that it was really started, but
8426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // they will just get a cancel result.
8436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
8446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
8456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SUCCESS;
8466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
8506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
8516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified);
8526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
8536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
8546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mMainStack.mResumedActivity == null
8576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                || mMainStack.mResumedActivity.info.applicationInfo.uid != callingUid) {
8586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
8596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
8606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, mMainStack);
8616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
8626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
8636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
8646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
8656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
8696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
8706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
8716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
8726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
8736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
8746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
8756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
8766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
8776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
8806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        err = mMainStack.startActivityUncheckedLocked(r, sourceRecord,
8826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                startFlags, true, options);
8836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mMainStack.mPausingActivity == null) {
8846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Someone asked to have the keyguard dismissed on the next
8856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
8866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
8876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
8886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
8896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
8916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
8926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
8948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
8958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
8968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
897e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
8988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
8998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
9028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
9038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
9048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
9058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
9068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
9108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
9118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
9128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
9138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
9148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
9158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
9168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
9178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
9188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
9198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
9208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
9228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void resumeTopActivityLocked() {
925dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
9268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).resumeTopActivityLocked(null);
9278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
9318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
9328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
9338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
9348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
9358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleIdleLocked() {
9398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
9408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).scheduleIdleLocked();
9418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
9458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
9468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
9478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
9488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
9498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private ActivityStack getStack(int stackId) {
9538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
9548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
9558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
9568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
9578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
9588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
9608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int createStack(int relativeStackId, int position, float weight) {
9638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        synchronized (this) {
9648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            while (true) {
9658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (++mLastStackId <= HOME_STACK_ID) {
9668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    mLastStackId = HOME_STACK_ID + 1;
9678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
9688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (getStack(mLastStackId) == null) {
9698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    break;
9708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
9718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId, this,
9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mCurrentUser));
9748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return mLastStackId;
9758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
9798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
9808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
9818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
9828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
9838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        stack.moveTask(taskId, toTop);
9858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
9888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
9898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).stopIfSleepingLocked();
9908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
9918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
9928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
9938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
9948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
9958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
9968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
9978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
9988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mResumedActivity != null) {
9998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.stopIfSleepingLocked();
10008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                final long endTime = System.currentTimeMillis() + timeout;
10018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                while (stack.mResumedActivity != null || stack.mPausingActivity != null) {
10028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    long delay = endTime - System.currentTimeMillis();
10038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (delay <= 0) {
10048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        Slog.w(TAG, "Activity manager shutdown timed out");
10058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        timedout = true;
10068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        break;
10078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
10088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
10098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        mService.wait();
10108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
10118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
10128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
10138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
10148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
10168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
10178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
10198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.awakeFromSleepingLocked();
10238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.resumeTopActivityLocked(null);
10248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
10268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
10288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
10328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
10348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean updateConfigurationLocked(int changes, ActivityRecord starting) {
10368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean kept = true;
10378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (changes != 0 && starting == null) {
10418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // If the configuration changed, and the caller is not already
10428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // in the process of starting an activity, then find the top
10438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // activity to check if its configuration needs to change.
10448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                starting = stack.topRunningActivityLocked(null);
10458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
10468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (starting != null) {
10488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (!stack.ensureActivityConfigurationLocked(starting, changes)) {
10498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    kept = false;
10508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
10518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // And we need to make sure at this point that all other activities
10528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // are made visible with the correct configuration.
10538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.ensureActivitiesVisibleLocked(starting, changes);
10548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
10558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return kept;
10578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
10588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
10608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
10648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
10668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
10678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
10682420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
10698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean haveActivities = false;
10708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            haveActivities |= stack.switchUserLocked(userId, uss);
10748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
10758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
10762219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
10772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1078270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
1079270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
1080270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
1081270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
10828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
108320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
108420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack.getDumpActivitiesLocked(name);
108520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
108620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
10878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
10888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
10898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
10908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
10918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
10928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":");
10938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage);
10948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
10958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  Running activities (most recent first):");
10968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            dumpHistoryList(fd, pw, stack.mLRUActivities, "  ", "Run", false, !dumpAll, false,
10978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    dumpPackage);
10988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mWaitingVisibleActivities.size() > 0) {
10998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
11008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting for another to become visible:");
11018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mWaitingVisibleActivities, "  ", "Wait", false,
11028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
11038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mStoppingActivities.size() > 0) {
11058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
11068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to stop:");
11078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mStoppingActivities, "  ", "Stop", false,
11088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
11098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mGoingToSleepActivities.size() > 0) {
11118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
11128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to sleep:");
11138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, "  ", "Sleep", false,
11148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
11158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mFinishingActivities.size() > 0) {
11178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
11188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to finish:");
11198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mFinishingActivities, "  ", "Fin", false,
11208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
11218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
11238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
11248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
11258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
11268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.println(mStacks.indexOf(stack));
11278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null) {
11288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mPausingActivity: " + stack.mPausingActivity);
11298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mResumedActivity: " + stack.mResumedActivity);
11318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
11328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mLastPausedActivity: " + stack.mLastPausedActivity);
11338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mSleepTimeout: " + stack.mSleepTimeout);
11348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
11368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
11378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (dumpAll) {
11388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
11398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mCurTaskId: " + mCurTaskId);
11408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
11418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return true;
11428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
11438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
11448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
11458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
11468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String dumpPackage) {
11478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
11488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean needNL = false;
11498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String innerPrefix = prefix + "      ";
11508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String[] args = new String[0];
11518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
11528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
11538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
11548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
11558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
11578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
11588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
11598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
11608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
11628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
11638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
11648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
11658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
11668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
11678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
11688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
11698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
11708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
11718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
11728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
11738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
11748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
11758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
11778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
11788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
11798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
11808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
11818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
11828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
11838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
11848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
11858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
11868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
11878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
11888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
11898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
11908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
11918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
11928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
11938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
11948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
11958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
11968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
11978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
11988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
11998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
12008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
12018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
12028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
12038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
12048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
12058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
12068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
12078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
12088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
12098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
12108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
12118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1212270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
1213