ActivityStackSupervisor.java revision d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37e
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;
258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
292420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
3123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
3323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
3420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
3523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
3620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
382420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
402219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
422219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
4323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
442219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
4523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
522219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
532420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
576170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
582420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
6123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
626170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
632420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
6423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
67270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
682219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
70270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
71270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor {
722420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_ADD_REMOVE = false;
732420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_APP = false;
742420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_SAVED_STATE = false;
752420ead0326bfd2587da6231be419e758dba1930Craig Mautner    static final boolean DEBUG_STATES = false;
762420ead0326bfd2587da6231be419e758dba1930Craig Mautner
772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
78270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
79270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
802219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
812219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
82270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
83270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
84270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
85270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
87d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
932420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
942420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
952420ead0326bfd2587da6231be419e758dba1930Craig Mautner
968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
9820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
9920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    /** The stack currently receiving input or launching the next activity */
1002219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mMainStack;
1018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1032219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1042219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1052219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
1062219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
107270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
1082219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
1092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
1102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1112219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1122420ead0326bfd2587da6231be419e758dba1930Craig Mautner    void init(int userId) {
1132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this, userId);
1142219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        setMainStack(mHomeStack);
1158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
116270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
117270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
118270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
119270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
120270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
121270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mService.mWindowManager.dismissKeyguard();
122270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
123270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
124270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
12520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean isHomeStackMain() {
12620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mHomeStack == mMainStack;
12720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
12820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1292219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    boolean isMainStack(ActivityStack stack) {
1302219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        return stack == mMainStack;
1312219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1322219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
13320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityStack getMainStack() {
13420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack;
13520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
13620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
1372219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void setMainStack(ActivityStack stack) {
1382219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mMainStack = stack;
1392219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1402219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
141270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
142270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
143270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
144270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
1468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
1488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
1498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
1508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
1518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
1548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
1576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
1596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
1606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
1616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
1626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
1636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
1646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
1656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
1678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
1688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
1698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
1708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
1718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
1728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
1738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
1748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
17720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
17820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
17920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
18220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
18320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
18420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
18520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
18620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
18720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
18820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
1892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
19020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
19120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
19220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
19320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
19420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
19520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
19620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
19720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                } else {
19820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.ensureActivitiesVisibleLocked(hr, null, processName, 0);
19920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
20020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
20120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
20220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
20320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
20420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
20520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
20620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
207dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            final ActivityRecord resumedActivity = mStacks.get(stackNdx).mResumedActivity;
208dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
20920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
21020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
21120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
21220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
21320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
21420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
21520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
21620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
21720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
21820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final int numStacks = mStacks.size();
21920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
22020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
22220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
22320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (isMainStack(stack)) {
22420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
22520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
22620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
22720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
22820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
22920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
23023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
23123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
23223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
23323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
23423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
23523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
23623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
23723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
23823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
23923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
24023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
24123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
24223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
24323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
24423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
24523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
24623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
24723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
24823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
24923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
25023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
25123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
25223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
25323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
25423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
25523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
25623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
25723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
25823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
25923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
26023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
26123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
26223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
26323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
26423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
26523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
26623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
26723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
26823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
26923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
27023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
27123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
27223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
27323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
27423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
27523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
27623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
2772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
2786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
2792219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
2808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
28223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
28323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
28423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
28523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
28623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
28723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
28823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
28923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
29023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
29123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
29223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
29323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
29423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
29523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
29623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
29723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
29823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
29923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
30023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
30123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
30223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
30323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
30423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
30523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
30623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
30723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
30823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
30923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
31023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            mMainStack.mConfigWillChange = config != null
31223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
31323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
31423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    "Starting activity when config will change = " + mMainStack.mConfigWillChange);
31523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
31723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
31823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
31923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
32023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
32123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
32223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
32323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
32423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
32523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
32623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingPid = callingPid;
32723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
32823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
32923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
33023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
33123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingPid = callerApp.pid;
33223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
33323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
33423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
33523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + " (pid=" + realCallingPid + ") when starting: "
33623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
33723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
33823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
33923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
34023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
34123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
34223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
34323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
34423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
34523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
34623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
34723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
34823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
34923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
35023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
35123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
35223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
35323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
35423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
35523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
35623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
35723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
35823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
35923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
36023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
36123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
36223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
36323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
36423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
36523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
36623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
36723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
36823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
36923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
37023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
37123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
37223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
37323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
37423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
37523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
37623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
37723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
37823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
37923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
38023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
38123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
38223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
38323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
38423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
38523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
38623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
38723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
3886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
38923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
39023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
39123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
39223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (mMainStack.mConfigWillChange) {
39323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
39423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
39523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
39623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
39723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
39823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
39923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mMainStack.mConfigWillChange = false;
40023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
40123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
40223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
40323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
40423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
40523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
40623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
40723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
40823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
40923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
41023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mMainStack.mWaitingActivityLaunched.add(outResult);
41123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
41223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
41323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
41423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
41523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
41623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
41723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
41823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityRecord r = mMainStack.topRunningActivityLocked(null);
41923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
42023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
42123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
42223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
42323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
42423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
42523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
42623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        mMainStack.mWaitingActivityVisible.add(outResult);
42723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
42823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
42923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
43023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
43123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
43223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
43323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
43423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
43523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
43623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
43723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
43823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
43923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
44023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
44123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
44223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
44323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
44423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
44523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
44623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
44723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
44823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
44923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
45023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
45123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
45223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
45323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityRecord[] outActivity = new ActivityRecord[1];
45523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
45623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
45723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
45823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
45923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
46023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
46123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
46223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
46323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
46423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
46523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
46623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
46723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
46823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
46923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
47023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
47123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
47223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
47323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
47423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
47523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
47623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
47723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
47823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
47923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
48123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
48323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
48423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
48523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
48623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
48723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
48823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
48923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
49023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
49123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
49223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
49323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
49423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
49523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
49623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
49723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
49823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
49923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
50023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
50123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
50223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
50323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
5046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
50523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
50623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
50723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
50823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
50923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
51023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
51223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
51323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
51423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
51523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
51623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
51723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
51923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
52023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
5212420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
5222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
5232420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
5242420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
5262420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.mWindowManager.setAppVisibility(r.appToken, true);
5272420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5282420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
5292420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
5302420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5312420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
5322420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
5332420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
5342420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
5352420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
5362420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
5372420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
5382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Configuration config = mService.mWindowManager.updateOrientationFromAppTokens(
5392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
5402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
5412420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
5422420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
5432420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5442420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
5452420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
5462420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
5472420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
5482420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5492420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
5502420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5512420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
5522420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
5532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
5542420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
5552420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.updateLruProcessLocked(app, true);
5562420ead0326bfd2587da6231be419e758dba1930Craig Mautner
5572420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
5582420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
5592420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
5602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
5612420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
5632420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
5642420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
5652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
5662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
5672420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5682420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
5692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
5702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
5712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
5722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
5732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
5742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
5752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
5762420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5772420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.isHomeActivity) {
5782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.mHomeProcess = app;
5792420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5802420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
5812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
5822420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
5832420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
5842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
5852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
5862420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
5872420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
5882420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
5892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
5902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
5912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
5922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
5932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
5942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
5952420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
5962420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
5972420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
5982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
5992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
6002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
6012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
6022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
6032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
6042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
6052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
6062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
6072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
6082420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
6092420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
6102420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6112420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
6122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
6132420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    new Configuration(mService.mConfiguration),
6142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.compat, r.icicle, results, newIntents, !andResume,
6152420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
6162420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
6172420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
6192420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
6202420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
6212420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
6222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
6232420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
6242420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
6252420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
6262420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
6272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
6282420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
6292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
6302420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
6312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
6322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
6332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
6342420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
6352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
6362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6372420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6382420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
6392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
6402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
6412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
6422420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
6432420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
6442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
6452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
6462420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
6472420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
6482420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
6492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
6502420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
6522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
6532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
6542420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
6552420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6562420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6572420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
6582420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
6592420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
6602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
6612420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6622420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6632420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
6642420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
6652420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
6662420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
6672420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
6682420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
6692420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
6702420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
6712420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
6722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
6732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
6742420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
6752420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
6762420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6772420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6782420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
6792420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
6802420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
6812420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
6822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (isMainStack(stack)) {
6832420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
6842420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
6852420ead0326bfd2587da6231be419e758dba1930Craig Mautner
6862420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
6872420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
6882420ead0326bfd2587da6231be419e758dba1930Craig Mautner
689e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
690e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
691e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
692e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
693e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                r.info.applicationInfo.uid);
694e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
695e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
696e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
697e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
698e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
699e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                app.addPackage(r.info.packageName);
700e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
701e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
702e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
703e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
704e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
705e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
706e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
707e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
708e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
709e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
710e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
711e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
712e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                "activity", r.intent.getComponent(), false, false);
713e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
714e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
7156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
7166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
7176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
7186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
7196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
7206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
7216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
7236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
7246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
7256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
7266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
7276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
7286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
7296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
7306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
7316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
7326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
7336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
7376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
7386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
7396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
7406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
7436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
7446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
7456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
7466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
7476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
7486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
7496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
7506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
7516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
7526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
7556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
7576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
7596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
7606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
7616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
7626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
7636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
7646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
7656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
7676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
7686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
7696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
7706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
7716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
7726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
7736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
7776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
7786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
7796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
7806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
7836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
7846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
7856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
7866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
7896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
7906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
7916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
7926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
7936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
7946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
7956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
7966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
7976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
7986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
7996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
8006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
8016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
8026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
8036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
8046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
8056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
8066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
8076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
8086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
8106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
8116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
8126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
8136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
8146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
8156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
8166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
8176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
8186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
8196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
8206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
8216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
8236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
8246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8266617c3c6d3d50559779fc7694a82f920b70ce4ffBen Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent,
8276617c3c6d3d50559779fc7694a82f920b70ce4ffBen Gruver                callerApp==null?null:callerApp.info, callingPackage, callingUid, callingPid,
8285e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resolvedType, aInfo);
8295e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
8306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
8316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
8326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
8336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
8346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
8355e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
8366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
8376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
8386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
8396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8405e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
8416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8425e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
8435e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
8445e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
8456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
8466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8475e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
8485e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
8495e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
8505e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
8515e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
8526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
8556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
8566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified);
8576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
8586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
8596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mMainStack.mResumedActivity == null
8626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                || mMainStack.mResumedActivity.info.applicationInfo.uid != callingUid) {
8636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
8646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
8656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, mMainStack);
8666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
8676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
8686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
8696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
8706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
8716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
8746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
8756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
8766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
8776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
8786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
8796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
8806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
8816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
8826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
8856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
8876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mMainStack.mPausingActivity == null) {
8886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Someone asked to have the keyguard dismissed on the next
8896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
8906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
8916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
8926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
8936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
8946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
8956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
8966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
8978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
8988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
8998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
9008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
9018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
9028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
9048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final ActivityStack stack = mMainStack;
9068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack targetStack = mMainStack;
9078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
9098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
9108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
9118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG,
9128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                "startActivity() => mUserLeaving=" + targetStack.mUserLeaving);
9138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
9158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
9168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
9178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
9188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
9198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
9208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
9228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
9248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
9258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
9268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
9278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
9288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
9298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
9308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                checkedCaller = targetStack.topRunningNonDelayedActivityLocked(notTop);
9318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
9328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
9338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
9348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
9358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
9368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
9378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
9398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
9408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
9418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
9428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
9438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                      + intent);
9448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
9458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
9468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
9478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
9488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
9498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
9508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
9518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
9528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
9538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
9548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
9558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
9568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
9578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
9598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
9608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
9618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
9628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
9638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
9648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
9658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
9668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
9678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
9688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
9698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
9708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
9718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
9728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
9738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
9748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
9758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
9768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
9778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
9788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
9798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
9808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
9818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
9828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
9838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
9848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
9858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
9868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
9878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ? findTaskLocked(intent, r.info)
9888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
9898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
9908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
9918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
9928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
9938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
9948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
9958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
9968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
9978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
9988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
9998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
10008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
10018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
10028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
10038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
10048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityRecord curTop = targetStack.topRunningNonDelayedActivityLocked(notTop);
10058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (curTop != null && curTop.task != intentActivity.task) {
10068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
10078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        boolean callerAtFront = sourceRecord == null
10088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || curTop.task == sourceRecord.task;
10098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (callerAtFront) {
10108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
10118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
10128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
10138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveHomeToFrontFromLaunchLocked(launchFlags);
10148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
10158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
10168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
10178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
10188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
10198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
10208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
10218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
10228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
10238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
10248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
10258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
10268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
10278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
10288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
10298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.resumeTopActivityLocked(null, options);
10308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
10318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
10328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
10338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
10348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
10358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
10368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
10378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
10388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
10398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
10408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
10418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
10428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
10438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
10448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
10458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
10468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
10478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
10488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
10498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
10508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
10518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
10528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
10538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
10548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
10558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
10568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
10578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
10588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
10598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
10608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
10618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
10628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
10638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
10648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
10658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
10668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
10678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
10688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
10698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
10708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
10718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
10728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
10738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
10748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
10758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
10768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
10778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
10788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
10798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
10808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
10818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
10828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
10838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
10848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
10858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
10868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
10878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
10888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
10898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
10908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
10918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
10928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
10938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
10948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
10958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
10968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
10978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
10988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
10998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
11008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
11018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
11028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
11038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
11048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
11058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
11068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
11078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
11088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
11098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
11108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
11118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
11128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
11138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
11148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
11158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
11168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
11178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
11188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
11198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
11208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
11218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            stack.resumeTopActivityLocked(null, options);
11228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
11238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
11248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
11258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
11268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
11278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
11288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
11298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
11308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
11328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
11338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
11348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
11358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
11368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
11388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
11398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
11408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
11418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord top = targetStack.topRunningNonDelayedActivityLocked(notTop);
11428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
11438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
11448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
11458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
11468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
11478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
11488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
11498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
11508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
11518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
11528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
11538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                targetStack.resumeTopActivityLocked(null);
11548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
11558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
11568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
11578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
11588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
11598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
11608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
11618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
11628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
11638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
11648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
11658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
11668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
11678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
11688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
11708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
11718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1,
11728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.resultTo, r.resultWho, r.requestCode,
11738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    Activity.RESULT_CANCELED, null);
11748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
11758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
11768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
11778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
11788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
11808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
11818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
11838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
11848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
11858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
11868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                stack.setTask(r, targetStack.createTaskRecord(getNextTaskId(), r.info, intent,
11878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        true), null, true);
11888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
11898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        + " in new task " + r.task);
11908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
11918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                stack.setTask(r, reuseTask, reuseTask, true);
11928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
11938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
11948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
11958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                stack.moveHomeToFrontFromLaunchLocked(launchFlags);
11968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
11978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
11988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
11998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
12008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
12018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
12028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
12038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
12048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord top = sourceRecord.task.performClearTaskLocked(r, launchFlags);
12058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
12068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
12078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
12088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
12098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
12108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
12118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
12128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
12138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
12148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
12158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
12168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
12178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
12188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
12198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
12208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
12218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
12228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                final ActivityRecord top =
12238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.findActivityInHistoryLocked(r, sourceRecord.task);
12248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
12258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack.moveActivityToFrontLocked(top);
12268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
12278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
12288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
12298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
12308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
12318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
12328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
12338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
12348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
12368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
12378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
12388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            stack.setTask(r, sourceRecord.task, sourceRecord.thumbHolder, false);
12398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
12408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in existing task " + r.task);
12418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
12438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
12448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
12458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
12468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord prev = stack.topActivity();
12478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            stack.setTask(r, prev != null
12488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ? prev.task
12498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    : stack.createTaskRecord(getNextTaskId(), r.info, intent, true), null, true);
12508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
12518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
12528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
12558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
12568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
12588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
12598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
12618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
12628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
12638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
12648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
12668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
12678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
12688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
1269e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
12708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
12718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
12728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
12738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
12748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
12758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
12768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
12778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
12788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
12798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
12808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
12818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
12828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
12838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
12848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
12858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
12868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
12878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
12888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
12898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
12908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
12918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
12928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
12938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
12948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
12958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
12968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void resumeTopActivityLocked() {
1297dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
12988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).resumeTopActivityLocked(null);
12998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
13038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
13048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
13058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
13068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
13078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleIdleLocked() {
13118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).scheduleIdleLocked();
13138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
13178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
13198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
13208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
13218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private ActivityStack getStack(int stackId) {
13258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
13278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
13288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
13298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
13308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
13328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int createStack(int relativeStackId, int position, float weight) {
13358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        synchronized (this) {
13368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            while (true) {
13378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (++mLastStackId <= HOME_STACK_ID) {
13388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    mLastStackId = HOME_STACK_ID + 1;
13398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
13408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (getStack(mLastStackId) == null) {
13418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    break;
13428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
13438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
13442420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId, this,
13452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mCurrentUser));
13468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return mLastStackId;
13478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
13518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
13528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
13538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
13548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
13558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        stack.moveTask(taskId, toTop);
13578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findTaskLocked(intent, info);
13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
13638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
13648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
13808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
13818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).stopIfSleepingLocked();
13828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
13838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
13848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
13858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
13868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
13878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
13888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
13898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
13908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mResumedActivity != null) {
13918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.stopIfSleepingLocked();
13928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                final long endTime = System.currentTimeMillis() + timeout;
13938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                while (stack.mResumedActivity != null || stack.mPausingActivity != null) {
13948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    long delay = endTime - System.currentTimeMillis();
13958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (delay <= 0) {
13968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        Slog.w(TAG, "Activity manager shutdown timed out");
13978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        timedout = true;
13988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        break;
13998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
14008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
14018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        mService.wait();
14028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
14038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
14048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
14058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
14068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
14088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
14098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
14118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.awakeFromSleepingLocked();
14158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.resumeTopActivityLocked(null);
14168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
14188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
14208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
14248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
14268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean updateConfigurationLocked(int changes, ActivityRecord starting) {
14288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean kept = true;
14298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (changes != 0 && starting == null) {
14338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // If the configuration changed, and the caller is not already
14348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // in the process of starting an activity, then find the top
14358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // activity to check if its configuration needs to change.
14368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                starting = stack.topRunningActivityLocked(null);
14378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
14388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (starting != null) {
14408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (!stack.ensureActivityConfigurationLocked(starting, changes)) {
14418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    kept = false;
14428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
14438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // And we need to make sure at this point that all other activities
14448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // are made visible with the correct configuration.
14458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.ensureActivitiesVisibleLocked(starting, changes);
14468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
14478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return kept;
14498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
14508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
14528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
14568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
14588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
14598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
14602420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
14618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean haveActivities = false;
14628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            haveActivities |= stack.switchUserLocked(userId, uss);
14668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
14678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
14682219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
14692219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1470270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
1471270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
1472270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
1473270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
14748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
147520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
147620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return mMainStack.getDumpActivitiesLocked(name);
147720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
147820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
14798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
14808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
14818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
14828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
14838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
14848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":");
14858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage);
14868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
14878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  Running activities (most recent first):");
14888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            dumpHistoryList(fd, pw, stack.mLRUActivities, "  ", "Run", false, !dumpAll, false,
14898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    dumpPackage);
14908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mWaitingVisibleActivities.size() > 0) {
14918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
14928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting for another to become visible:");
14938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mWaitingVisibleActivities, "  ", "Wait", false,
14948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
14958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
14968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mStoppingActivities.size() > 0) {
14978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
14988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to stop:");
14998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mStoppingActivities, "  ", "Stop", false,
15008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
15018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mGoingToSleepActivities.size() > 0) {
15038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
15048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to sleep:");
15058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, "  ", "Sleep", false,
15068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
15078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mFinishingActivities.size() > 0) {
15098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
15108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to finish:");
15118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mFinishingActivities, "  ", "Fin", false,
15128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
15138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
15158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
15168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
15178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
15188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.println(mStacks.indexOf(stack));
15198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null) {
15208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mPausingActivity: " + stack.mPausingActivity);
15218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mResumedActivity: " + stack.mResumedActivity);
15238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
15248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mLastPausedActivity: " + stack.mLastPausedActivity);
15258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mSleepTimeout: " + stack.mSleepTimeout);
15268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
15288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
15298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (dumpAll) {
15308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
15318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mCurTaskId: " + mCurTaskId);
15328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
15338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return true;
15348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
15358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
15368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
15378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
15388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String dumpPackage) {
15398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
15408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean needNL = false;
15418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String innerPrefix = prefix + "      ";
15428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String[] args = new String[0];
15438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
15448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
15458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
15468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
15478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
15498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
15508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
15518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
15528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
15548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
15558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
15568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
15578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
15588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
15598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
15608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
15618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
15628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
15638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
15648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
15658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
15668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
15678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
15698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
15708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
15718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
15728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
15738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
15748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
15758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
15768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
15778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
15788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
15798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
15808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
15818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
15828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
15838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
15848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
15858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
15868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
15878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
15888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
15898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
15908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
15918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
15928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
15938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
15948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
15958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
15968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
15978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
15988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
15998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
16008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
16018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
16028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
16038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
1604270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
1605