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