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