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