1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.wm;
18 
19 import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND;
20 import static android.app.Activity.RESULT_CANCELED;
21 import static android.app.ActivityManager.START_ABORTED;
22 import static android.app.ActivityManager.START_CANCELED;
23 import static android.app.ActivityManager.START_CLASS_NOT_FOUND;
24 import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
25 import static android.app.ActivityManager.START_FLAG_ONLY_IF_NEEDED;
26 import static android.app.ActivityManager.START_RETURN_INTENT_TO_CALLER;
27 import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
28 import static android.app.ActivityManager.START_SUCCESS;
29 import static android.app.ActivityManager.START_TASK_TO_FRONT;
30 import static android.app.ActivityTaskManager.INVALID_TASK_ID;
31 import static android.app.WaitResult.LAUNCH_STATE_COLD;
32 import static android.app.WaitResult.LAUNCH_STATE_HOT;
33 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
34 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
35 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
36 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
37 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
38 import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
39 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
40 import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
41 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
42 import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
43 import static android.content.Intent.FLAG_ACTIVITY_NO_USER_ACTION;
44 import static android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP;
45 import static android.content.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT;
46 import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
47 import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
48 import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
49 import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
50 import static android.content.pm.ActivityInfo.DOCUMENT_LAUNCH_ALWAYS;
51 import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
52 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
53 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
54 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
55 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
56 import static android.os.Process.INVALID_UID;
57 import static android.view.Display.DEFAULT_DISPLAY;
58 
59 import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
60 import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
61 import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
62 import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS;
63 import static com.android.server.wm.ActivityStackSupervisor.TAG_TASKS;
64 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ACTIVITY_STARTS;
65 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
66 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
67 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_RESULTS;
68 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
69 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_USER_LEAVING;
70 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION;
71 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS;
72 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_RESULTS;
73 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_USER_LEAVING;
74 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
75 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
76 import static com.android.server.wm.ActivityTaskManagerService.ANIMATE;
77 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_BOUNDS;
78 import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_DISPLAY;
79 import static com.android.server.wm.Task.REPARENT_MOVE_STACK_TO_FRONT;
80 import static com.android.server.wm.WindowContainer.POSITION_TOP;
81 
82 import android.annotation.NonNull;
83 import android.annotation.Nullable;
84 import android.app.ActivityManager;
85 import android.app.ActivityOptions;
86 import android.app.IApplicationThread;
87 import android.app.PendingIntent;
88 import android.app.ProfilerInfo;
89 import android.app.WaitResult;
90 import android.content.IIntentSender;
91 import android.content.Intent;
92 import android.content.IntentSender;
93 import android.content.pm.ActivityInfo;
94 import android.content.pm.ApplicationInfo;
95 import android.content.pm.AuxiliaryResolveInfo;
96 import android.content.pm.PackageManager;
97 import android.content.pm.PackageManagerInternal;
98 import android.content.pm.ResolveInfo;
99 import android.content.pm.UserInfo;
100 import android.content.res.Configuration;
101 import android.os.Binder;
102 import android.os.Bundle;
103 import android.os.IBinder;
104 import android.os.Process;
105 import android.os.RemoteException;
106 import android.os.Trace;
107 import android.os.UserHandle;
108 import android.os.UserManager;
109 import android.service.voice.IVoiceInteractionSession;
110 import android.text.TextUtils;
111 import android.util.ArraySet;
112 import android.util.DebugUtils;
113 import android.util.Pools.SynchronizedPool;
114 import android.util.Slog;
115 
116 import com.android.internal.annotations.VisibleForTesting;
117 import com.android.internal.app.HeavyWeightSwitcherActivity;
118 import com.android.internal.app.IVoiceInteractor;
119 import com.android.server.am.PendingIntentRecord;
120 import com.android.server.pm.InstantAppResolver;
121 import com.android.server.uri.NeededUriGrants;
122 import com.android.server.wm.ActivityMetricsLogger.LaunchingState;
123 import com.android.server.wm.ActivityStackSupervisor.PendingActivityLaunch;
124 import com.android.server.wm.LaunchParamsController.LaunchParams;
125 
126 import java.io.PrintWriter;
127 import java.text.DateFormat;
128 import java.util.Date;
129 
130 /**
131  * Controller for interpreting how and then launching an activity.
132  *
133  * This class collects all the logic for determining how an intent and flags should be turned into
134  * an activity and associated task and stack.
135  */
136 class ActivityStarter {
137     private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStarter" : TAG_ATM;
138     private static final String TAG_RESULTS = TAG + POSTFIX_RESULTS;
139     private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
140     private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
141     private static final String TAG_USER_LEAVING = TAG + POSTFIX_USER_LEAVING;
142     private static final int INVALID_LAUNCH_MODE = -1;
143 
144     private final ActivityTaskManagerService mService;
145     private final RootWindowContainer mRootWindowContainer;
146     private final ActivityStackSupervisor mSupervisor;
147     private final ActivityStartInterceptor mInterceptor;
148     private final ActivityStartController mController;
149 
150     // Share state variable among methods when starting an activity.
151     @VisibleForTesting
152     ActivityRecord mStartActivity;
153     private Intent mIntent;
154     private int mCallingUid;
155     private ActivityOptions mOptions;
156 
157     // If it is true, background activity can only be started in an existing task that contains
158     // an activity with same uid, or if activity starts are enabled in developer options.
159     private boolean mRestrictedBgActivity;
160 
161     private int mLaunchMode;
162     private boolean mLaunchTaskBehind;
163     private int mLaunchFlags;
164 
165     private LaunchParams mLaunchParams = new LaunchParams();
166 
167     private ActivityRecord mNotTop;
168     private boolean mDoResume;
169     private int mStartFlags;
170     private ActivityRecord mSourceRecord;
171 
172     // The task display area to launch the activity onto, barring any strong reason to do otherwise.
173     private TaskDisplayArea mPreferredTaskDisplayArea;
174     private int mPreferredWindowingMode;
175 
176     private Task mInTask;
177     @VisibleForTesting
178     boolean mAddingToTask;
179     private Task mReuseTask;
180 
181     private ActivityInfo mNewTaskInfo;
182     private Intent mNewTaskIntent;
183     private ActivityStack mSourceStack;
184     private ActivityStack mTargetStack;
185     // The task that the last activity was started into. We currently reset the actual start
186     // activity's task and as a result may not have a reference to the task in all cases
187     private Task mTargetTask;
188     private boolean mMovedToFront;
189     private boolean mNoAnimation;
190     private boolean mKeepCurTransition;
191     private boolean mAvoidMoveToFront;
192     private boolean mFrozeTaskList;
193 
194     // We must track when we deliver the new intent since multiple code paths invoke
195     // {@link #deliverNewIntent}. This is due to early returns in the code path. This flag is used
196     // inside {@link #deliverNewIntent} to suppress duplicate requests and ensure the intent is
197     // delivered at most once.
198     private boolean mIntentDelivered;
199 
200     private IVoiceInteractionSession mVoiceSession;
201     private IVoiceInteractor mVoiceInteractor;
202 
203     // Last activity record we attempted to start
204     private ActivityRecord mLastStartActivityRecord;
205     // The result of the last activity we attempted to start.
206     private int mLastStartActivityResult;
207     // Time in milli seconds we attempted to start the last activity.
208     private long mLastStartActivityTimeMs;
209     // The reason we were trying to start the last activity
210     private String mLastStartReason;
211 
212     /*
213      * Request details provided through setter methods. Should be reset after {@link #execute()}
214      * to avoid unnecessarily retaining parameters. Note that the request is ignored when
215      * {@link #startResolvedActivity} is invoked directly.
216      */
217     @VisibleForTesting
218     Request mRequest = new Request();
219 
220     /**
221      * An interface that to provide {@link ActivityStarter} instances to the controller. This is
222      * used by tests to inject their own starter implementations for verification purposes.
223      */
224     @VisibleForTesting
225     interface Factory {
226         /**
227          * Sets the {@link ActivityStartController} to be passed to {@link ActivityStarter}.
228          */
setController(ActivityStartController controller)229         void setController(ActivityStartController controller);
230 
231         /**
232          * Generates an {@link ActivityStarter} that is ready to handle a new start request.
233          * @param controller The {@link ActivityStartController} which the starter who will own
234          *                   this instance.
235          * @return an {@link ActivityStarter}
236          */
obtain()237         ActivityStarter obtain();
238 
239         /**
240          * Recycles a starter for reuse.
241          */
recycle(ActivityStarter starter)242         void recycle(ActivityStarter starter);
243     }
244 
245     /**
246      * Default implementation of {@link StarterFactory}.
247      */
248     static class DefaultFactory implements Factory {
249         /**
250          * The maximum count of starters that should be active at one time:
251          * 1. last ran starter (for logging and post activity processing)
252          * 2. current running starter
253          * 3. starter from re-entry in (2)
254          */
255         private final int MAX_STARTER_COUNT = 3;
256 
257         private ActivityStartController mController;
258         private ActivityTaskManagerService mService;
259         private ActivityStackSupervisor mSupervisor;
260         private ActivityStartInterceptor mInterceptor;
261 
262         private SynchronizedPool<ActivityStarter> mStarterPool =
263                 new SynchronizedPool<>(MAX_STARTER_COUNT);
264 
DefaultFactory(ActivityTaskManagerService service, ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor)265         DefaultFactory(ActivityTaskManagerService service,
266                 ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
267             mService = service;
268             mSupervisor = supervisor;
269             mInterceptor = interceptor;
270         }
271 
272         @Override
setController(ActivityStartController controller)273         public void setController(ActivityStartController controller) {
274             mController = controller;
275         }
276 
277         @Override
obtain()278         public ActivityStarter obtain() {
279             ActivityStarter starter = mStarterPool.acquire();
280 
281             if (starter == null) {
282                 starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
283             }
284 
285             return starter;
286         }
287 
288         @Override
recycle(ActivityStarter starter)289         public void recycle(ActivityStarter starter) {
290             starter.reset(true /* clearRequest*/);
291             mStarterPool.release(starter);
292         }
293     }
294 
295     /**
296      * Container for capturing initial start request details. This information is NOT reset until
297      * the {@link ActivityStarter} is recycled, allowing for multiple invocations with the same
298      * parameters.
299      *
300      * TODO(b/64750076): Investigate consolidating member variables of {@link ActivityStarter} with
301      * the request object. Note that some member variables are referenced in
302      * {@link #dump(PrintWriter, String)} and therefore cannot be cleared immediately after
303      * execution.
304      */
305     @VisibleForTesting
306     static class Request {
307         private static final int DEFAULT_CALLING_UID = -1;
308         private static final int DEFAULT_CALLING_PID = 0;
309         static final int DEFAULT_REAL_CALLING_UID = -1;
310         static final int DEFAULT_REAL_CALLING_PID = 0;
311 
312         IApplicationThread caller;
313         Intent intent;
314         NeededUriGrants intentGrants;
315         // A copy of the original requested intent, in case for ephemeral app launch.
316         Intent ephemeralIntent;
317         String resolvedType;
318         ActivityInfo activityInfo;
319         ResolveInfo resolveInfo;
320         IVoiceInteractionSession voiceSession;
321         IVoiceInteractor voiceInteractor;
322         IBinder resultTo;
323         String resultWho;
324         int requestCode;
325         int callingPid = DEFAULT_CALLING_PID;
326         int callingUid = DEFAULT_CALLING_UID;
327         String callingPackage;
328         @Nullable String callingFeatureId;
329         int realCallingPid = DEFAULT_REAL_CALLING_PID;
330         int realCallingUid = DEFAULT_REAL_CALLING_UID;
331         int startFlags;
332         SafeActivityOptions activityOptions;
333         boolean ignoreTargetSecurity;
334         boolean componentSpecified;
335         boolean avoidMoveToFront;
336         ActivityRecord[] outActivity;
337         Task inTask;
338         String reason;
339         ProfilerInfo profilerInfo;
340         Configuration globalConfig;
341         int userId;
342         WaitResult waitResult;
343         int filterCallingUid;
344         PendingIntentRecord originatingPendingIntent;
345         boolean allowBackgroundActivityStart;
346 
347         /**
348          * If set to {@code true}, allows this activity start to look into
349          * {@link PendingRemoteAnimationRegistry}
350          */
351         boolean allowPendingRemoteAnimationRegistryLookup;
352 
353         /**
354          * Ensure constructed request matches reset instance.
355          */
Request()356         Request() {
357             reset();
358         }
359 
360         /**
361          * Sets values back to the initial state, clearing any held references.
362          */
reset()363         void reset() {
364             caller = null;
365             intent = null;
366             intentGrants = null;
367             ephemeralIntent = null;
368             resolvedType = null;
369             activityInfo = null;
370             resolveInfo = null;
371             voiceSession = null;
372             voiceInteractor = null;
373             resultTo = null;
374             resultWho = null;
375             requestCode = 0;
376             callingPid = DEFAULT_CALLING_PID;
377             callingUid = DEFAULT_CALLING_UID;
378             callingPackage = null;
379             callingFeatureId = null;
380             realCallingPid = DEFAULT_REAL_CALLING_PID;
381             realCallingUid = DEFAULT_REAL_CALLING_UID;
382             startFlags = 0;
383             activityOptions = null;
384             ignoreTargetSecurity = false;
385             componentSpecified = false;
386             outActivity = null;
387             inTask = null;
388             reason = null;
389             profilerInfo = null;
390             globalConfig = null;
391             userId = 0;
392             waitResult = null;
393             avoidMoveToFront = false;
394             allowPendingRemoteAnimationRegistryLookup = true;
395             filterCallingUid = UserHandle.USER_NULL;
396             originatingPendingIntent = null;
397             allowBackgroundActivityStart = false;
398         }
399 
400         /**
401          * Adopts all values from passed in request.
402          */
set(Request request)403         void set(Request request) {
404             caller = request.caller;
405             intent = request.intent;
406             intentGrants = request.intentGrants;
407             ephemeralIntent = request.ephemeralIntent;
408             resolvedType = request.resolvedType;
409             activityInfo = request.activityInfo;
410             resolveInfo = request.resolveInfo;
411             voiceSession = request.voiceSession;
412             voiceInteractor = request.voiceInteractor;
413             resultTo = request.resultTo;
414             resultWho = request.resultWho;
415             requestCode = request.requestCode;
416             callingPid = request.callingPid;
417             callingUid = request.callingUid;
418             callingPackage = request.callingPackage;
419             callingFeatureId = request.callingFeatureId;
420             realCallingPid = request.realCallingPid;
421             realCallingUid = request.realCallingUid;
422             startFlags = request.startFlags;
423             activityOptions = request.activityOptions;
424             ignoreTargetSecurity = request.ignoreTargetSecurity;
425             componentSpecified = request.componentSpecified;
426             outActivity = request.outActivity;
427             inTask = request.inTask;
428             reason = request.reason;
429             profilerInfo = request.profilerInfo;
430             globalConfig = request.globalConfig;
431             userId = request.userId;
432             waitResult = request.waitResult;
433             avoidMoveToFront = request.avoidMoveToFront;
434             allowPendingRemoteAnimationRegistryLookup
435                     = request.allowPendingRemoteAnimationRegistryLookup;
436             filterCallingUid = request.filterCallingUid;
437             originatingPendingIntent = request.originatingPendingIntent;
438             allowBackgroundActivityStart = request.allowBackgroundActivityStart;
439         }
440 
441         /**
442          * Resolve activity from the given intent for this launch.
443          */
resolveActivity(ActivityStackSupervisor supervisor)444         void resolveActivity(ActivityStackSupervisor supervisor) {
445             if (realCallingPid == Request.DEFAULT_REAL_CALLING_PID) {
446                 realCallingPid = Binder.getCallingPid();
447             }
448             if (realCallingUid == Request.DEFAULT_REAL_CALLING_UID) {
449                 realCallingUid = Binder.getCallingUid();
450             }
451 
452             if (callingUid >= 0) {
453                 callingPid = -1;
454             } else if (caller == null) {
455                 callingPid = realCallingPid;
456                 callingUid = realCallingUid;
457             } else {
458                 callingPid = callingUid = -1;
459             }
460 
461             // To determine the set of needed Uri permission grants, we need the
462             // "resolved" calling UID, where we try our best to identify the
463             // actual caller that is starting this activity
464             int resolvedCallingUid = callingUid;
465             if (caller != null) {
466                 synchronized (supervisor.mService.mGlobalLock) {
467                     final WindowProcessController callerApp = supervisor.mService
468                             .getProcessController(caller);
469                     if (callerApp != null) {
470                         resolvedCallingUid = callerApp.mInfo.uid;
471                     }
472                 }
473             }
474 
475             // Save a copy in case ephemeral needs it
476             ephemeralIntent = new Intent(intent);
477             // Don't modify the client's object!
478             intent = new Intent(intent);
479             if (intent.getComponent() != null
480                     && !(Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() == null)
481                     && !Intent.ACTION_INSTALL_INSTANT_APP_PACKAGE.equals(intent.getAction())
482                     && !Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE.equals(intent.getAction())
483                     && supervisor.mService.getPackageManagerInternalLocked()
484                             .isInstantAppInstallerComponent(intent.getComponent())) {
485                 // Intercept intents targeted directly to the ephemeral installer the ephemeral
486                 // installer should never be started with a raw Intent; instead adjust the intent
487                 // so it looks like a "normal" instant app launch.
488                 intent.setComponent(null /* component */);
489             }
490 
491             resolveInfo = supervisor.resolveIntent(intent, resolvedType, userId,
492                     0 /* matchFlags */,
493                     computeResolveFilterUid(callingUid, realCallingUid, filterCallingUid));
494             if (resolveInfo == null) {
495                 final UserInfo userInfo = supervisor.getUserInfo(userId);
496                 if (userInfo != null && userInfo.isManagedProfile()) {
497                     // Special case for managed profiles, if attempting to launch non-cryto aware
498                     // app in a locked managed profile from an unlocked parent allow it to resolve
499                     // as user will be sent via confirm credentials to unlock the profile.
500                     final UserManager userManager = UserManager.get(supervisor.mService.mContext);
501                     boolean profileLockedAndParentUnlockingOrUnlocked = false;
502                     final long token = Binder.clearCallingIdentity();
503                     try {
504                         final UserInfo parent = userManager.getProfileParent(userId);
505                         profileLockedAndParentUnlockingOrUnlocked = (parent != null)
506                                 && userManager.isUserUnlockingOrUnlocked(parent.id)
507                                 && !userManager.isUserUnlockingOrUnlocked(userId);
508                     } finally {
509                         Binder.restoreCallingIdentity(token);
510                     }
511                     if (profileLockedAndParentUnlockingOrUnlocked) {
512                         resolveInfo = supervisor.resolveIntent(intent, resolvedType, userId,
513                                 PackageManager.MATCH_DIRECT_BOOT_AWARE
514                                         | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
515                                 computeResolveFilterUid(callingUid, realCallingUid,
516                                         filterCallingUid));
517                     }
518                 }
519             }
520 
521             // Collect information about the target of the Intent.
522             activityInfo = supervisor.resolveActivity(intent, resolveInfo, startFlags,
523                     profilerInfo);
524 
525             // Carefully collect grants without holding lock
526             if (activityInfo != null) {
527                 intentGrants = supervisor.mService.mUgmInternal.checkGrantUriPermissionFromIntent(
528                         intent, resolvedCallingUid, activityInfo.applicationInfo.packageName,
529                         UserHandle.getUserId(activityInfo.applicationInfo.uid));
530             }
531         }
532     }
533 
ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service, ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor)534     ActivityStarter(ActivityStartController controller, ActivityTaskManagerService service,
535             ActivityStackSupervisor supervisor, ActivityStartInterceptor interceptor) {
536         mController = controller;
537         mService = service;
538         mRootWindowContainer = service.mRootWindowContainer;
539         mSupervisor = supervisor;
540         mInterceptor = interceptor;
541         reset(true);
542     }
543 
544     /**
545      * Effectively duplicates the starter passed in. All state and request values will be
546      * mirrored.
547      * @param starter
548      */
set(ActivityStarter starter)549     void set(ActivityStarter starter) {
550         mStartActivity = starter.mStartActivity;
551         mIntent = starter.mIntent;
552         mCallingUid = starter.mCallingUid;
553         mOptions = starter.mOptions;
554         mRestrictedBgActivity = starter.mRestrictedBgActivity;
555 
556         mLaunchTaskBehind = starter.mLaunchTaskBehind;
557         mLaunchFlags = starter.mLaunchFlags;
558         mLaunchMode = starter.mLaunchMode;
559 
560         mLaunchParams.set(starter.mLaunchParams);
561 
562         mNotTop = starter.mNotTop;
563         mDoResume = starter.mDoResume;
564         mStartFlags = starter.mStartFlags;
565         mSourceRecord = starter.mSourceRecord;
566         mPreferredTaskDisplayArea = starter.mPreferredTaskDisplayArea;
567         mPreferredWindowingMode = starter.mPreferredWindowingMode;
568 
569         mInTask = starter.mInTask;
570         mAddingToTask = starter.mAddingToTask;
571         mReuseTask = starter.mReuseTask;
572 
573         mNewTaskInfo = starter.mNewTaskInfo;
574         mNewTaskIntent = starter.mNewTaskIntent;
575         mSourceStack = starter.mSourceStack;
576 
577         mTargetTask = starter.mTargetTask;
578         mTargetStack = starter.mTargetStack;
579         mMovedToFront = starter.mMovedToFront;
580         mNoAnimation = starter.mNoAnimation;
581         mKeepCurTransition = starter.mKeepCurTransition;
582         mAvoidMoveToFront = starter.mAvoidMoveToFront;
583         mFrozeTaskList = starter.mFrozeTaskList;
584 
585         mVoiceSession = starter.mVoiceSession;
586         mVoiceInteractor = starter.mVoiceInteractor;
587 
588         mIntentDelivered = starter.mIntentDelivered;
589 
590         mRequest.set(starter.mRequest);
591     }
592 
relatedToPackage(String packageName)593     boolean relatedToPackage(String packageName) {
594         return (mLastStartActivityRecord != null
595                 && packageName.equals(mLastStartActivityRecord.packageName))
596                 || (mStartActivity != null && packageName.equals(mStartActivity.packageName));
597     }
598 
599     /**
600      * Starts an activity based on the provided {@link ActivityRecord} and environment parameters.
601      * Note that this method is called internally as well as part of {@link #executeRequest}.
602      */
startResolvedActivity(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, NeededUriGrants intentGrants)603     void startResolvedActivity(final ActivityRecord r, ActivityRecord sourceRecord,
604             IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
605             int startFlags, boolean doResume, ActivityOptions options, Task inTask,
606             NeededUriGrants intentGrants) {
607         try {
608             final LaunchingState launchingState = mSupervisor.getActivityMetricsLogger()
609                     .notifyActivityLaunching(r.intent, r.resultTo);
610             mLastStartReason = "startResolvedActivity";
611             mLastStartActivityTimeMs = System.currentTimeMillis();
612             mLastStartActivityRecord = r;
613             mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
614                     voiceInteractor, startFlags, doResume, options, inTask,
615                     false /* restrictedBgActivity */, intentGrants);
616             mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState,
617                     mLastStartActivityResult, mLastStartActivityRecord);
618         } finally {
619             onExecutionComplete();
620         }
621     }
622 
623     /**
624      * Resolve necessary information according the request parameters provided earlier, and execute
625      * the request which begin the journey of starting an activity.
626      * @return The starter result.
627      */
execute()628     int execute() {
629         try {
630             // Refuse possible leaked file descriptors
631             if (mRequest.intent != null && mRequest.intent.hasFileDescriptors()) {
632                 throw new IllegalArgumentException("File descriptors passed in Intent");
633             }
634 
635             final LaunchingState launchingState;
636             synchronized (mService.mGlobalLock) {
637                 final ActivityRecord caller = ActivityRecord.forTokenLocked(mRequest.resultTo);
638                 launchingState = mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(
639                         mRequest.intent, caller);
640             }
641 
642             // If the caller hasn't already resolved the activity, we're willing
643             // to do so here. If the caller is already holding the WM lock here,
644             // and we need to check dynamic Uri permissions, then we're forced
645             // to assume those permissions are denied to avoid deadlocking.
646             if (mRequest.activityInfo == null) {
647                 mRequest.resolveActivity(mSupervisor);
648             }
649 
650             int res;
651             synchronized (mService.mGlobalLock) {
652                 final boolean globalConfigWillChange = mRequest.globalConfig != null
653                         && mService.getGlobalConfiguration().diff(mRequest.globalConfig) != 0;
654                 final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
655                 if (stack != null) {
656                     stack.mConfigWillChange = globalConfigWillChange;
657                 }
658                 if (DEBUG_CONFIGURATION) {
659                     Slog.v(TAG_CONFIGURATION, "Starting activity when config will change = "
660                             + globalConfigWillChange);
661                 }
662 
663                 final long origId = Binder.clearCallingIdentity();
664 
665                 res = resolveToHeavyWeightSwitcherIfNeeded();
666                 if (res != START_SUCCESS) {
667                     return res;
668                 }
669                 res = executeRequest(mRequest);
670 
671                 Binder.restoreCallingIdentity(origId);
672 
673                 if (globalConfigWillChange) {
674                     // If the caller also wants to switch to a new configuration, do so now.
675                     // This allows a clean switch, as we are waiting for the current activity
676                     // to pause (so we will not destroy it), and have not yet started the
677                     // next activity.
678                     mService.mAmInternal.enforceCallingPermission(
679                             android.Manifest.permission.CHANGE_CONFIGURATION,
680                             "updateConfiguration()");
681                     if (stack != null) {
682                         stack.mConfigWillChange = false;
683                     }
684                     if (DEBUG_CONFIGURATION) {
685                         Slog.v(TAG_CONFIGURATION,
686                                 "Updating to new configuration after starting activity.");
687                     }
688                     mService.updateConfigurationLocked(mRequest.globalConfig, null, false);
689                 }
690 
691                 // Notify ActivityMetricsLogger that the activity has launched.
692                 // ActivityMetricsLogger will then wait for the windows to be drawn and populate
693                 // WaitResult.
694                 mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(launchingState, res,
695                         mLastStartActivityRecord);
696                 return getExternalResult(mRequest.waitResult == null ? res
697                         : waitForResult(res, mLastStartActivityRecord));
698             }
699         } finally {
700             onExecutionComplete();
701         }
702     }
703 
704     /**
705      * Updates the request to heavy-weight switch if this is a heavy-weight process while there
706      * already have another, different heavy-weight process running.
707      */
resolveToHeavyWeightSwitcherIfNeeded()708     private int resolveToHeavyWeightSwitcherIfNeeded() {
709         if (mRequest.activityInfo == null || !mService.mHasHeavyWeightFeature
710                 || (mRequest.activityInfo.applicationInfo.privateFlags
711                         & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) == 0) {
712             return START_SUCCESS;
713         }
714 
715         if (!mRequest.activityInfo.processName.equals(
716                 mRequest.activityInfo.applicationInfo.packageName)) {
717             return START_SUCCESS;
718         }
719 
720         final WindowProcessController heavy = mService.mHeavyWeightProcess;
721         if (heavy == null || (heavy.mInfo.uid == mRequest.activityInfo.applicationInfo.uid
722                 && heavy.mName.equals(mRequest.activityInfo.processName))) {
723             return START_SUCCESS;
724         }
725 
726         int appCallingUid = mRequest.callingUid;
727         if (mRequest.caller != null) {
728             WindowProcessController callerApp = mService.getProcessController(mRequest.caller);
729             if (callerApp != null) {
730                 appCallingUid = callerApp.mInfo.uid;
731             } else {
732                 Slog.w(TAG, "Unable to find app for caller " + mRequest.caller + " (pid="
733                         + mRequest.callingPid + ") when starting: " + mRequest.intent.toString());
734                 SafeActivityOptions.abort(mRequest.activityOptions);
735                 return ActivityManager.START_PERMISSION_DENIED;
736             }
737         }
738 
739         final IIntentSender target = mService.getIntentSenderLocked(
740                 ActivityManager.INTENT_SENDER_ACTIVITY, "android" /* packageName */,
741                 null /* featureId */, appCallingUid, mRequest.userId, null /* token */,
742                 null /* resultWho*/, 0 /* requestCode*/, new Intent[]{mRequest.intent},
743                 new String[]{mRequest.resolvedType},
744                 PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT,
745                 null /* bOptions */);
746 
747         final Intent newIntent = new Intent();
748         if (mRequest.requestCode >= 0) {
749             // Caller is requesting a result.
750             newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
751         }
752         newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, new IntentSender(target));
753         heavy.updateIntentForHeavyWeightActivity(newIntent);
754         newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
755                 mRequest.activityInfo.packageName);
756         newIntent.setFlags(mRequest.intent.getFlags());
757         newIntent.setClassName("android" /* packageName */,
758                 HeavyWeightSwitcherActivity.class.getName());
759         mRequest.intent = newIntent;
760         mRequest.resolvedType = null;
761         mRequest.caller = null;
762         mRequest.callingUid = Binder.getCallingUid();
763         mRequest.callingPid = Binder.getCallingPid();
764         mRequest.componentSpecified = true;
765         mRequest.resolveInfo = mSupervisor.resolveIntent(mRequest.intent, null /* resolvedType */,
766                 mRequest.userId, 0 /* matchFlags */,
767                 computeResolveFilterUid(mRequest.callingUid, mRequest.realCallingUid,
768                         mRequest.filterCallingUid));
769         mRequest.activityInfo =
770                 mRequest.resolveInfo != null ? mRequest.resolveInfo.activityInfo : null;
771         if (mRequest.activityInfo != null) {
772             mRequest.activityInfo = mService.mAmInternal.getActivityInfoForUser(
773                     mRequest.activityInfo, mRequest.userId);
774         }
775 
776         return START_SUCCESS;
777     }
778 
779     /**
780      * Wait for activity launch completes.
781      */
waitForResult(int res, ActivityRecord r)782     private int waitForResult(int res, ActivityRecord r) {
783         mRequest.waitResult.result = res;
784         switch(res) {
785             case START_SUCCESS: {
786                 mSupervisor.mWaitingActivityLaunched.add(mRequest.waitResult);
787                 do {
788                     try {
789                         mService.mGlobalLock.wait();
790                     } catch (InterruptedException e) {
791                     }
792                 } while (mRequest.waitResult.result != START_TASK_TO_FRONT
793                         && !mRequest.waitResult.timeout && mRequest.waitResult.who == null);
794                 if (mRequest.waitResult.result == START_TASK_TO_FRONT) {
795                     res = START_TASK_TO_FRONT;
796                 }
797                 break;
798             }
799             case START_DELIVERED_TO_TOP: {
800                 mRequest.waitResult.timeout = false;
801                 mRequest.waitResult.who = r.mActivityComponent;
802                 mRequest.waitResult.totalTime = 0;
803                 break;
804             }
805             case START_TASK_TO_FRONT: {
806                 mRequest.waitResult.launchState =
807                         r.attachedToProcess() ? LAUNCH_STATE_HOT : LAUNCH_STATE_COLD;
808                 // ActivityRecord may represent a different activity, but it should not be
809                 // in the resumed state.
810                 if (r.nowVisible && r.isState(RESUMED)) {
811                     mRequest.waitResult.timeout = false;
812                     mRequest.waitResult.who = r.mActivityComponent;
813                     mRequest.waitResult.totalTime = 0;
814                 } else {
815                     mSupervisor.waitActivityVisible(r.mActivityComponent, mRequest.waitResult);
816                     // Note: the timeout variable is not currently not ever set.
817                     do {
818                         try {
819                             mService.mGlobalLock.wait();
820                         } catch (InterruptedException e) {
821                         }
822                     } while (!mRequest.waitResult.timeout && mRequest.waitResult.who == null);
823                 }
824                 break;
825             }
826         }
827         return res;
828     }
829 
830     /**
831      * Executing activity start request and starts the journey of starting an activity. Here
832      * begins with performing several preliminary checks. The normally activity launch flow will
833      * go through {@link #startActivityUnchecked} to {@link #startActivityInner}.
834      */
executeRequest(Request request)835     private int executeRequest(Request request) {
836         if (TextUtils.isEmpty(request.reason)) {
837             throw new IllegalArgumentException("Need to specify a reason.");
838         }
839         mLastStartReason = request.reason;
840         mLastStartActivityTimeMs = System.currentTimeMillis();
841         mLastStartActivityRecord = null;
842 
843         final IApplicationThread caller = request.caller;
844         Intent intent = request.intent;
845         NeededUriGrants intentGrants = request.intentGrants;
846         String resolvedType = request.resolvedType;
847         ActivityInfo aInfo = request.activityInfo;
848         ResolveInfo rInfo = request.resolveInfo;
849         final IVoiceInteractionSession voiceSession = request.voiceSession;
850         final IBinder resultTo = request.resultTo;
851         String resultWho = request.resultWho;
852         int requestCode = request.requestCode;
853         int callingPid = request.callingPid;
854         int callingUid = request.callingUid;
855         String callingPackage = request.callingPackage;
856         String callingFeatureId = request.callingFeatureId;
857         final int realCallingPid = request.realCallingPid;
858         final int realCallingUid = request.realCallingUid;
859         final int startFlags = request.startFlags;
860         final SafeActivityOptions options = request.activityOptions;
861         Task inTask = request.inTask;
862 
863         int err = ActivityManager.START_SUCCESS;
864         // Pull the optional Ephemeral Installer-only bundle out of the options early.
865         final Bundle verificationBundle =
866                 options != null ? options.popAppVerificationBundle() : null;
867 
868         WindowProcessController callerApp = null;
869         if (caller != null) {
870             callerApp = mService.getProcessController(caller);
871             if (callerApp != null) {
872                 callingPid = callerApp.getPid();
873                 callingUid = callerApp.mInfo.uid;
874             } else {
875                 Slog.w(TAG, "Unable to find app for caller " + caller + " (pid=" + callingPid
876                         + ") when starting: " + intent.toString());
877                 err = ActivityManager.START_PERMISSION_DENIED;
878             }
879         }
880 
881         final int userId = aInfo != null && aInfo.applicationInfo != null
882                 ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
883         if (err == ActivityManager.START_SUCCESS) {
884             Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
885                     + "} from uid " + callingUid);
886         }
887 
888         ActivityRecord sourceRecord = null;
889         ActivityRecord resultRecord = null;
890         if (resultTo != null) {
891             sourceRecord = mRootWindowContainer.isInAnyStack(resultTo);
892             if (DEBUG_RESULTS) {
893                 Slog.v(TAG_RESULTS, "Will send result to " + resultTo + " " + sourceRecord);
894             }
895             if (sourceRecord != null) {
896                 if (requestCode >= 0 && !sourceRecord.finishing) {
897                     resultRecord = sourceRecord;
898                 }
899             }
900         }
901 
902         final int launchFlags = intent.getFlags();
903         if ((launchFlags & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
904             // Transfer the result target from the source activity to the new one being started,
905             // including any failures.
906             if (requestCode >= 0) {
907                 SafeActivityOptions.abort(options);
908                 return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
909             }
910             resultRecord = sourceRecord.resultTo;
911             if (resultRecord != null && !resultRecord.isInStackLocked()) {
912                 resultRecord = null;
913             }
914             resultWho = sourceRecord.resultWho;
915             requestCode = sourceRecord.requestCode;
916             sourceRecord.resultTo = null;
917             if (resultRecord != null) {
918                 resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode);
919             }
920             if (sourceRecord.launchedFromUid == callingUid) {
921                 // The new activity is being launched from the same uid as the previous activity
922                 // in the flow, and asking to forward its result back to the previous.  In this
923                 // case the activity is serving as a trampoline between the two, so we also want
924                 // to update its launchedFromPackage to be the same as the previous activity.
925                 // Note that this is safe, since we know these two packages come from the same
926                 // uid; the caller could just as well have supplied that same package name itself
927                 // . This specifially deals with the case of an intent picker/chooser being
928                 // launched in the app flow to redirect to an activity picked by the user, where
929                 // we want the final activity to consider it to have been launched by the
930                 // previous app activity.
931                 callingPackage = sourceRecord.launchedFromPackage;
932                 callingFeatureId = sourceRecord.launchedFromFeatureId;
933             }
934         }
935 
936         if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
937             // We couldn't find a class that can handle the given Intent.
938             // That's the end of that!
939             err = ActivityManager.START_INTENT_NOT_RESOLVED;
940         }
941 
942         if (err == ActivityManager.START_SUCCESS && aInfo == null) {
943             // We couldn't find the specific class specified in the Intent.
944             // Also the end of the line.
945             err = ActivityManager.START_CLASS_NOT_FOUND;
946         }
947 
948         if (err == ActivityManager.START_SUCCESS && sourceRecord != null
949                 && sourceRecord.getTask().voiceSession != null) {
950             // If this activity is being launched as part of a voice session, we need to ensure
951             // that it is safe to do so.  If the upcoming activity will also be part of the voice
952             // session, we can only launch it if it has explicitly said it supports the VOICE
953             // category, or it is a part of the calling app.
954             if ((launchFlags & FLAG_ACTIVITY_NEW_TASK) == 0
955                     && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
956                 try {
957                     intent.addCategory(Intent.CATEGORY_VOICE);
958                     if (!mService.getPackageManager().activitySupportsIntent(
959                             intent.getComponent(), intent, resolvedType)) {
960                         Slog.w(TAG, "Activity being started in current voice task does not support "
961                                 + "voice: " + intent);
962                         err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
963                     }
964                 } catch (RemoteException e) {
965                     Slog.w(TAG, "Failure checking voice capabilities", e);
966                     err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
967                 }
968             }
969         }
970 
971         if (err == ActivityManager.START_SUCCESS && voiceSession != null) {
972             // If the caller is starting a new voice session, just make sure the target
973             // is actually allowing it to run this way.
974             try {
975                 if (!mService.getPackageManager().activitySupportsIntent(intent.getComponent(),
976                         intent, resolvedType)) {
977                     Slog.w(TAG,
978                             "Activity being started in new voice task does not support: " + intent);
979                     err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
980                 }
981             } catch (RemoteException e) {
982                 Slog.w(TAG, "Failure checking voice capabilities", e);
983                 err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
984             }
985         }
986 
987         final ActivityStack resultStack = resultRecord == null
988                 ? null : resultRecord.getRootTask();
989 
990         if (err != START_SUCCESS) {
991             if (resultRecord != null) {
992                 resultRecord.sendResult(INVALID_UID, resultWho, requestCode, RESULT_CANCELED,
993                         null /* data */, null /* dataGrants */);
994             }
995             SafeActivityOptions.abort(options);
996             return err;
997         }
998 
999         boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho,
1000                 requestCode, callingPid, callingUid, callingPackage, callingFeatureId,
1001                 request.ignoreTargetSecurity, inTask != null, callerApp, resultRecord, resultStack);
1002         abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1003                 callingPid, resolvedType, aInfo.applicationInfo);
1004         abort |= !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid,
1005                 callingPackage);
1006 
1007         boolean restrictedBgActivity = false;
1008         if (!abort) {
1009             try {
1010                 Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
1011                         "shouldAbortBackgroundActivityStart");
1012                 restrictedBgActivity = shouldAbortBackgroundActivityStart(callingUid,
1013                         callingPid, callingPackage, realCallingUid, realCallingPid, callerApp,
1014                         request.originatingPendingIntent, request.allowBackgroundActivityStart,
1015                         intent);
1016             } finally {
1017                 Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
1018             }
1019         }
1020 
1021         // Merge the two options bundles, while realCallerOptions takes precedence.
1022         ActivityOptions checkedOptions = options != null
1023                 ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null;
1024         if (request.allowPendingRemoteAnimationRegistryLookup) {
1025             checkedOptions = mService.getActivityStartController()
1026                     .getPendingRemoteAnimationRegistry()
1027                     .overrideOptionsIfNeeded(callingPackage, checkedOptions);
1028         }
1029         if (mService.mController != null) {
1030             try {
1031                 // The Intent we give to the watcher has the extra data stripped off, since it
1032                 // can contain private information.
1033                 Intent watchIntent = intent.cloneFilter();
1034                 abort |= !mService.mController.activityStarting(watchIntent,
1035                         aInfo.applicationInfo.packageName);
1036             } catch (RemoteException e) {
1037                 mService.mController = null;
1038             }
1039         }
1040 
1041         mInterceptor.setStates(userId, realCallingPid, realCallingUid, startFlags, callingPackage,
1042                 callingFeatureId);
1043         if (mInterceptor.intercept(intent, rInfo, aInfo, resolvedType, inTask, callingPid,
1044                 callingUid, checkedOptions)) {
1045             // activity start was intercepted, e.g. because the target user is currently in quiet
1046             // mode (turn off work) or the target application is suspended
1047             intent = mInterceptor.mIntent;
1048             rInfo = mInterceptor.mRInfo;
1049             aInfo = mInterceptor.mAInfo;
1050             resolvedType = mInterceptor.mResolvedType;
1051             inTask = mInterceptor.mInTask;
1052             callingPid = mInterceptor.mCallingPid;
1053             callingUid = mInterceptor.mCallingUid;
1054             checkedOptions = mInterceptor.mActivityOptions;
1055 
1056             // The interception target shouldn't get any permission grants
1057             // intended for the original destination
1058             intentGrants = null;
1059         }
1060 
1061         if (abort) {
1062             if (resultRecord != null) {
1063                 resultRecord.sendResult(INVALID_UID, resultWho, requestCode, RESULT_CANCELED,
1064                         null /* data */, null /* dataGrants */);
1065             }
1066             // We pretend to the caller that it was really started, but they will just get a
1067             // cancel result.
1068             ActivityOptions.abort(checkedOptions);
1069             return START_ABORTED;
1070         }
1071 
1072         // If permissions need a review before any of the app components can run, we
1073         // launch the review activity and pass a pending intent to start the activity
1074         // we are to launching now after the review is completed.
1075         if (aInfo != null) {
1076             if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired(
1077                     aInfo.packageName, userId)) {
1078                 final IIntentSender target = mService.getIntentSenderLocked(
1079                         ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, callingFeatureId,
1080                         callingUid, userId, null, null, 0, new Intent[]{intent},
1081                         new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT
1082                                 | PendingIntent.FLAG_ONE_SHOT, null);
1083 
1084                 Intent newIntent = new Intent(Intent.ACTION_REVIEW_PERMISSIONS);
1085 
1086                 int flags = intent.getFlags();
1087                 flags |= Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
1088 
1089                 /*
1090                  * Prevent reuse of review activity: Each app needs their own review activity. By
1091                  * default activities launched with NEW_TASK or NEW_DOCUMENT try to reuse activities
1092                  * with the same launch parameters (extras are ignored). Hence to avoid possible
1093                  * reuse force a new activity via the MULTIPLE_TASK flag.
1094                  *
1095                  * Activities that are not launched with NEW_TASK or NEW_DOCUMENT are not re-used,
1096                  * hence no need to add the flag in this case.
1097                  */
1098                 if ((flags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NEW_DOCUMENT)) != 0) {
1099                     flags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
1100                 }
1101                 newIntent.setFlags(flags);
1102 
1103                 newIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, aInfo.packageName);
1104                 newIntent.putExtra(Intent.EXTRA_INTENT, new IntentSender(target));
1105                 if (resultRecord != null) {
1106                     newIntent.putExtra(Intent.EXTRA_RESULT_NEEDED, true);
1107                 }
1108                 intent = newIntent;
1109 
1110                 // The permissions review target shouldn't get any permission
1111                 // grants intended for the original destination
1112                 intentGrants = null;
1113 
1114                 resolvedType = null;
1115                 callingUid = realCallingUid;
1116                 callingPid = realCallingPid;
1117 
1118                 rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId, 0,
1119                         computeResolveFilterUid(
1120                                 callingUid, realCallingUid, request.filterCallingUid));
1121                 aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags,
1122                         null /*profilerInfo*/);
1123 
1124                 if (DEBUG_PERMISSIONS_REVIEW) {
1125                     final ActivityStack focusedStack =
1126                             mRootWindowContainer.getTopDisplayFocusedStack();
1127                     Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true,
1128                             true, false) + "} from uid " + callingUid + " on display "
1129                             + (focusedStack == null ? DEFAULT_DISPLAY
1130                                     : focusedStack.getDisplayId()));
1131                 }
1132             }
1133         }
1134 
1135         // If we have an ephemeral app, abort the process of launching the resolved intent.
1136         // Instead, launch the ephemeral installer. Once the installer is finished, it
1137         // starts either the intent we resolved here [on install error] or the ephemeral
1138         // app [on install success].
1139         if (rInfo != null && rInfo.auxiliaryInfo != null) {
1140             intent = createLaunchIntent(rInfo.auxiliaryInfo, request.ephemeralIntent,
1141                     callingPackage, callingFeatureId, verificationBundle, resolvedType, userId);
1142             resolvedType = null;
1143             callingUid = realCallingUid;
1144             callingPid = realCallingPid;
1145 
1146             // The ephemeral installer shouldn't get any permission grants
1147             // intended for the original destination
1148             intentGrants = null;
1149 
1150             aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/);
1151         }
1152 
1153         final ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
1154                 callingPackage, callingFeatureId, intent, resolvedType, aInfo,
1155                 mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode,
1156                 request.componentSpecified, voiceSession != null, mSupervisor, checkedOptions,
1157                 sourceRecord);
1158         mLastStartActivityRecord = r;
1159 
1160         if (r.appTimeTracker == null && sourceRecord != null) {
1161             // If the caller didn't specify an explicit time tracker, we want to continue
1162             // tracking under any it has.
1163             r.appTimeTracker = sourceRecord.appTimeTracker;
1164         }
1165 
1166         final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
1167 
1168         // If we are starting an activity that is not from the same uid as the currently resumed
1169         // one, check whether app switches are allowed.
1170         if (voiceSession == null && stack != null && (stack.getResumedActivity() == null
1171                 || stack.getResumedActivity().info.applicationInfo.uid != realCallingUid)) {
1172             if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid,
1173                     realCallingPid, realCallingUid, "Activity start")) {
1174                 if (!(restrictedBgActivity && handleBackgroundActivityAbort(r))) {
1175                     mController.addPendingActivityLaunch(new PendingActivityLaunch(r,
1176                             sourceRecord, startFlags, stack, callerApp, intentGrants));
1177                 }
1178                 ActivityOptions.abort(checkedOptions);
1179                 return ActivityManager.START_SWITCHES_CANCELED;
1180             }
1181         }
1182 
1183         mService.onStartActivitySetDidAppSwitch();
1184         mController.doPendingActivityLaunches(false);
1185 
1186         mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
1187                 request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,
1188                 restrictedBgActivity, intentGrants);
1189 
1190         if (request.outActivity != null) {
1191             request.outActivity[0] = mLastStartActivityRecord;
1192         }
1193 
1194         return mLastStartActivityResult;
1195     }
1196 
1197     /**
1198      * Return true if background activity is really aborted.
1199      *
1200      * TODO(b/131748165): Refactor the logic so we don't need to call this method everywhere.
1201      */
handleBackgroundActivityAbort(ActivityRecord r)1202     private boolean handleBackgroundActivityAbort(ActivityRecord r) {
1203         // TODO(b/131747138): Remove toast and refactor related code in R release.
1204         final boolean abort = !mService.isBackgroundActivityStartsEnabled();
1205         if (!abort) {
1206             return false;
1207         }
1208         final ActivityRecord resultRecord = r.resultTo;
1209         final String resultWho = r.resultWho;
1210         int requestCode = r.requestCode;
1211         if (resultRecord != null) {
1212             resultRecord.sendResult(INVALID_UID, resultWho, requestCode, RESULT_CANCELED,
1213                     null /* data */, null /* dataGrants */);
1214         }
1215         // We pretend to the caller that it was really started to make it backward compatible, but
1216         // they will just get a cancel result.
1217         ActivityOptions.abort(r.pendingOptions);
1218         return true;
1219     }
1220 
getExternalResult(int result)1221     static int getExternalResult(int result) {
1222         // Aborted results are treated as successes externally, but we must track them internally.
1223         return result != START_ABORTED ? result : START_SUCCESS;
1224     }
1225 
1226     /**
1227      * Called when execution is complete. Sets state indicating completion and proceeds with
1228      * recycling if appropriate.
1229      */
onExecutionComplete()1230     private void onExecutionComplete() {
1231         mController.onExecutionComplete(this);
1232     }
1233 
shouldAbortBackgroundActivityStart(int callingUid, int callingPid, final String callingPackage, int realCallingUid, int realCallingPid, WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart, Intent intent)1234     boolean shouldAbortBackgroundActivityStart(int callingUid, int callingPid,
1235             final String callingPackage, int realCallingUid, int realCallingPid,
1236             WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent,
1237             boolean allowBackgroundActivityStart, Intent intent) {
1238         // don't abort for the most important UIDs
1239         final int callingAppId = UserHandle.getAppId(callingUid);
1240         if (callingUid == Process.ROOT_UID || callingAppId == Process.SYSTEM_UID
1241                 || callingAppId == Process.NFC_UID) {
1242             if (DEBUG_ACTIVITY_STARTS) {
1243                 Slog.d(TAG, "Activity start allowed for important callingUid (" + callingUid + ")");
1244             }
1245             return false;
1246         }
1247 
1248         // don't abort if the callingUid has a visible window or is a persistent system process
1249         final int callingUidProcState = mService.getUidState(callingUid);
1250         final boolean callingUidHasAnyVisibleWindow =
1251                 mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(callingUid);
1252         final boolean isCallingUidForeground = callingUidHasAnyVisibleWindow
1253                 || callingUidProcState == ActivityManager.PROCESS_STATE_TOP
1254                 || callingUidProcState == ActivityManager.PROCESS_STATE_BOUND_TOP;
1255         final boolean isCallingUidPersistentSystemProcess =
1256                 callingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;
1257         if (callingUidHasAnyVisibleWindow || isCallingUidPersistentSystemProcess) {
1258             if (DEBUG_ACTIVITY_STARTS) {
1259                 Slog.d(TAG, "Activity start allowed: callingUidHasAnyVisibleWindow = " + callingUid
1260                         + ", isCallingUidPersistentSystemProcess = "
1261                         + isCallingUidPersistentSystemProcess);
1262             }
1263             return false;
1264         }
1265         // take realCallingUid into consideration
1266         final int realCallingUidProcState = (callingUid == realCallingUid)
1267                 ? callingUidProcState
1268                 : mService.getUidState(realCallingUid);
1269         final boolean realCallingUidHasAnyVisibleWindow = (callingUid == realCallingUid)
1270                 ? callingUidHasAnyVisibleWindow
1271                 : mService.mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(realCallingUid);
1272         final boolean isRealCallingUidForeground = (callingUid == realCallingUid)
1273                 ? isCallingUidForeground
1274                 : realCallingUidHasAnyVisibleWindow
1275                         || realCallingUidProcState == ActivityManager.PROCESS_STATE_TOP;
1276         final int realCallingAppId = UserHandle.getAppId(realCallingUid);
1277         final boolean isRealCallingUidPersistentSystemProcess = (callingUid == realCallingUid)
1278                 ? isCallingUidPersistentSystemProcess
1279                 : (realCallingAppId == Process.SYSTEM_UID)
1280                         || realCallingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI;
1281         if (realCallingUid != callingUid) {
1282             // don't abort if the realCallingUid has a visible window
1283             if (realCallingUidHasAnyVisibleWindow) {
1284                 if (DEBUG_ACTIVITY_STARTS) {
1285                     Slog.d(TAG, "Activity start allowed: realCallingUid (" + realCallingUid
1286                             + ") has visible (non-toast) window");
1287                 }
1288                 return false;
1289             }
1290             // if the realCallingUid is a persistent system process, abort if the IntentSender
1291             // wasn't whitelisted to start an activity
1292             if (isRealCallingUidPersistentSystemProcess && allowBackgroundActivityStart) {
1293                 if (DEBUG_ACTIVITY_STARTS) {
1294                     Slog.d(TAG, "Activity start allowed: realCallingUid (" + realCallingUid
1295                             + ") is persistent system process AND intent sender whitelisted "
1296                             + "(allowBackgroundActivityStart = true)");
1297                 }
1298                 return false;
1299             }
1300             // don't abort if the realCallingUid is an associated companion app
1301             if (mService.isAssociatedCompanionApp(UserHandle.getUserId(realCallingUid),
1302                     realCallingUid)) {
1303                 if (DEBUG_ACTIVITY_STARTS) {
1304                     Slog.d(TAG, "Activity start allowed: realCallingUid (" + realCallingUid
1305                             + ") is companion app");
1306                 }
1307                 return false;
1308             }
1309         }
1310         // don't abort if the callingUid has START_ACTIVITIES_FROM_BACKGROUND permission
1311         if (mService.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)
1312                 == PERMISSION_GRANTED) {
1313             if (DEBUG_ACTIVITY_STARTS) {
1314                 Slog.d(TAG,
1315                         "Background activity start allowed: START_ACTIVITIES_FROM_BACKGROUND "
1316                                 + "permission granted for uid "
1317                                 + callingUid);
1318             }
1319             return false;
1320         }
1321         // don't abort if the caller has the same uid as the recents component
1322         if (mSupervisor.mRecentTasks.isCallerRecents(callingUid)) {
1323             if (DEBUG_ACTIVITY_STARTS) {
1324                 Slog.d(TAG, "Background activity start allowed: callingUid (" + callingUid
1325                         + ") is recents");
1326             }
1327             return false;
1328         }
1329         // don't abort if the callingUid is the device owner
1330         if (mService.isDeviceOwner(callingUid)) {
1331             if (DEBUG_ACTIVITY_STARTS) {
1332                 Slog.d(TAG, "Background activity start allowed: callingUid (" + callingUid
1333                         + ") is device owner");
1334             }
1335             return false;
1336         }
1337         // don't abort if the callingUid has companion device
1338         final int callingUserId = UserHandle.getUserId(callingUid);
1339         if (mService.isAssociatedCompanionApp(callingUserId, callingUid)) {
1340             if (DEBUG_ACTIVITY_STARTS) {
1341                 Slog.d(TAG, "Background activity start allowed: callingUid (" + callingUid
1342                         + ") is companion app");
1343             }
1344             return false;
1345         }
1346         // If we don't have callerApp at this point, no caller was provided to startActivity().
1347         // That's the case for PendingIntent-based starts, since the creator's process might not be
1348         // up and alive. If that's the case, we retrieve the WindowProcessController for the send()
1349         // caller, so that we can make the decision based on its foreground/whitelisted state.
1350         int callerAppUid = callingUid;
1351         if (callerApp == null) {
1352             callerApp = mService.getProcessController(realCallingPid, realCallingUid);
1353             callerAppUid = realCallingUid;
1354         }
1355         // don't abort if the callerApp or other processes of that uid are whitelisted in any way
1356         if (callerApp != null) {
1357             // first check the original calling process
1358             if (callerApp.areBackgroundActivityStartsAllowed()) {
1359                 if (DEBUG_ACTIVITY_STARTS) {
1360                     Slog.d(TAG, "Background activity start allowed: callerApp process (pid = "
1361                             + callerApp.getPid() + ", uid = " + callerAppUid + ") is whitelisted");
1362                 }
1363                 return false;
1364             }
1365             // only if that one wasn't whitelisted, check the other ones
1366             final ArraySet<WindowProcessController> uidProcesses =
1367                     mService.mProcessMap.getProcesses(callerAppUid);
1368             if (uidProcesses != null) {
1369                 for (int i = uidProcesses.size() - 1; i >= 0; i--) {
1370                     final WindowProcessController proc = uidProcesses.valueAt(i);
1371                     if (proc != callerApp && proc.areBackgroundActivityStartsAllowed()) {
1372                         if (DEBUG_ACTIVITY_STARTS) {
1373                             Slog.d(TAG,
1374                                     "Background activity start allowed: process " + proc.getPid()
1375                                             + " from uid " + callerAppUid + " is whitelisted");
1376                         }
1377                         return false;
1378                     }
1379                 }
1380             }
1381         }
1382         // don't abort if the callingUid has SYSTEM_ALERT_WINDOW permission
1383         if (mService.hasSystemAlertWindowPermission(callingUid, callingPid, callingPackage)) {
1384             Slog.w(TAG, "Background activity start for " + callingPackage
1385                     + " allowed because SYSTEM_ALERT_WINDOW permission is granted.");
1386             return false;
1387         }
1388         // anything that has fallen through would currently be aborted
1389         Slog.w(TAG, "Background activity start [callingPackage: " + callingPackage
1390                 + "; callingUid: " + callingUid
1391                 + "; isCallingUidForeground: " + isCallingUidForeground
1392                 + "; callingUidHasAnyVisibleWindow: " + callingUidHasAnyVisibleWindow
1393                 + "; callingUidProcState: " + DebugUtils.valueToString(ActivityManager.class,
1394                 "PROCESS_STATE_", callingUidProcState)
1395                 + "; isCallingUidPersistentSystemProcess: " + isCallingUidPersistentSystemProcess
1396                 + "; realCallingUid: " + realCallingUid
1397                 + "; isRealCallingUidForeground: " + isRealCallingUidForeground
1398                 + "; realCallingUidHasAnyVisibleWindow: " + realCallingUidHasAnyVisibleWindow
1399                 + "; realCallingUidProcState: " + DebugUtils.valueToString(ActivityManager.class,
1400                 "PROCESS_STATE_", realCallingUidProcState)
1401                 + "; isRealCallingUidPersistentSystemProcess: "
1402                 + isRealCallingUidPersistentSystemProcess
1403                 + "; originatingPendingIntent: " + originatingPendingIntent
1404                 + "; isBgStartWhitelisted: " + allowBackgroundActivityStart
1405                 + "; intent: " + intent
1406                 + "; callerApp: " + callerApp
1407                 + "]");
1408         // log aborted activity start to TRON
1409         if (mService.isActivityStartsLoggingEnabled()) {
1410             mSupervisor.getActivityMetricsLogger().logAbortedBgActivityStart(intent, callerApp,
1411                     callingUid, callingPackage, callingUidProcState, callingUidHasAnyVisibleWindow,
1412                     realCallingUid, realCallingUidProcState, realCallingUidHasAnyVisibleWindow,
1413                     (originatingPendingIntent != null));
1414         }
1415         return true;
1416     }
1417 
1418     /**
1419      * Creates a launch intent for the given auxiliary resolution data.
1420      */
createLaunchIntent(@ullable AuxiliaryResolveInfo auxiliaryResponse, Intent originalIntent, String callingPackage, @Nullable String callingFeatureId, Bundle verificationBundle, String resolvedType, int userId)1421     private @NonNull Intent createLaunchIntent(@Nullable AuxiliaryResolveInfo auxiliaryResponse,
1422             Intent originalIntent, String callingPackage, @Nullable String callingFeatureId,
1423             Bundle verificationBundle, String resolvedType, int userId) {
1424         if (auxiliaryResponse != null && auxiliaryResponse.needsPhaseTwo) {
1425             // request phase two resolution
1426             PackageManagerInternal packageManager = mService.getPackageManagerInternalLocked();
1427             boolean isRequesterInstantApp = packageManager.isInstantApp(callingPackage, userId);
1428             packageManager.requestInstantAppResolutionPhaseTwo(
1429                     auxiliaryResponse, originalIntent, resolvedType, callingPackage,
1430                     callingFeatureId, isRequesterInstantApp, verificationBundle, userId);
1431         }
1432         return InstantAppResolver.buildEphemeralInstallerIntent(
1433                 originalIntent,
1434                 InstantAppResolver.sanitizeIntent(originalIntent),
1435                 auxiliaryResponse == null ? null : auxiliaryResponse.failureIntent,
1436                 callingPackage,
1437                 callingFeatureId,
1438                 verificationBundle,
1439                 resolvedType,
1440                 userId,
1441                 auxiliaryResponse == null ? null : auxiliaryResponse.installFailureActivity,
1442                 auxiliaryResponse == null ? null : auxiliaryResponse.token,
1443                 auxiliaryResponse != null && auxiliaryResponse.needsPhaseTwo,
1444                 auxiliaryResponse == null ? null : auxiliaryResponse.filters);
1445     }
1446 
postStartActivityProcessing(ActivityRecord r, int result, ActivityStack startedActivityStack)1447     void postStartActivityProcessing(ActivityRecord r, int result,
1448             ActivityStack startedActivityStack) {
1449         if (!ActivityManager.isStartResultSuccessful(result)) {
1450             if (mFrozeTaskList) {
1451                 // If we specifically froze the task list as part of starting an activity, then
1452                 // reset the frozen list state if it failed to start. This is normally otherwise
1453                 // called when the freeze-timeout has elapsed.
1454                 mSupervisor.mRecentTasks.resetFreezeTaskListReorderingOnTimeout();
1455             }
1456         }
1457         if (ActivityManager.isStartResultFatalError(result)) {
1458             return;
1459         }
1460 
1461         // We're waiting for an activity launch to finish, but that activity simply
1462         // brought another activity to front. We must also handle the case where the task is already
1463         // in the front as a result of the trampoline activity being in the same task (it will be
1464         // considered focused as the trampoline will be finished). Let them know about this, so
1465         // it waits for the new activity to become visible instead, {@link #waitResultIfNeeded}.
1466         mSupervisor.reportWaitingActivityLaunchedIfNeeded(r, result);
1467 
1468         final Task targetTask = r.getTask() != null
1469                 ? r.getTask()
1470                 : mTargetTask;
1471         if (startedActivityStack == null || targetTask == null) {
1472             return;
1473         }
1474 
1475         final int clearTaskFlags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK;
1476         boolean clearedTask = (mLaunchFlags & clearTaskFlags) == clearTaskFlags
1477                 && mReuseTask != null;
1478         if (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP || clearedTask) {
1479             // The activity was already running so it wasn't started, but either brought to the
1480             // front or the new intent was delivered to it since it was already in front. Notify
1481             // anyone interested in this piece of information.
1482             final ActivityStack homeStack = targetTask.getDisplayArea().getRootHomeTask();
1483             final boolean homeTaskVisible = homeStack != null && homeStack.shouldBeVisible(null);
1484             mService.getTaskChangeNotificationController().notifyActivityRestartAttempt(
1485                     targetTask.getTaskInfo(), homeTaskVisible, clearedTask,
1486                     targetTask.getTopNonFinishingActivity().isVisible());
1487         }
1488     }
1489 
1490     /**
1491      * Compute the logical UID based on which the package manager would filter
1492      * app components i.e. based on which the instant app policy would be applied
1493      * because it is the logical calling UID.
1494      *
1495      * @param customCallingUid The UID on whose behalf to make the call.
1496      * @param actualCallingUid The UID actually making the call.
1497      * @param filterCallingUid The UID to be used to filter for instant apps.
1498      * @return The logical UID making the call.
1499      */
computeResolveFilterUid(int customCallingUid, int actualCallingUid, int filterCallingUid)1500     static int computeResolveFilterUid(int customCallingUid, int actualCallingUid,
1501             int filterCallingUid) {
1502         return filterCallingUid != UserHandle.USER_NULL
1503                 ? filterCallingUid
1504                 : (customCallingUid >= 0 ? customCallingUid : actualCallingUid);
1505     }
1506 
1507     /**
1508      * Start an activity while most of preliminary checks has been done and caller has been
1509      * confirmed that holds necessary permissions to do so.
1510      * Here also ensures that the starting activity is removed if the start wasn't successful.
1511      */
startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, boolean restrictedBgActivity, NeededUriGrants intentGrants)1512     private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
1513                 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
1514                 int startFlags, boolean doResume, ActivityOptions options, Task inTask,
1515                 boolean restrictedBgActivity, NeededUriGrants intentGrants) {
1516         int result = START_CANCELED;
1517         final ActivityStack startedActivityStack;
1518         try {
1519             mService.deferWindowLayout();
1520             Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner");
1521             result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,
1522                     startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);
1523         } finally {
1524             Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
1525             startedActivityStack = handleStartResult(r, result);
1526             mService.continueWindowLayout();
1527         }
1528 
1529         postStartActivityProcessing(r, result, startedActivityStack);
1530 
1531         return result;
1532     }
1533 
1534     /**
1535      * If the start result is success, ensure that the configuration of the started activity matches
1536      * the current display. Otherwise clean up unassociated containers to avoid leakage.
1537      *
1538      * @return the stack where the successful started activity resides.
1539      */
handleStartResult(@onNull ActivityRecord started, int result)1540     private @Nullable ActivityStack handleStartResult(@NonNull ActivityRecord started, int result) {
1541         final ActivityStack currentStack = started.getRootTask();
1542         ActivityStack startedActivityStack = currentStack != null ? currentStack : mTargetStack;
1543 
1544         if (ActivityManager.isStartResultSuccessful(result)) {
1545             if (startedActivityStack != null) {
1546                 // If there is no state change (e.g. a resumed activity is reparented to top of
1547                 // another display) to trigger a visibility/configuration checking, we have to
1548                 // update the configuration for changing to different display.
1549                 final ActivityRecord currentTop = startedActivityStack.topRunningActivity();
1550                 if (currentTop != null && currentTop.shouldUpdateConfigForDisplayChanged()) {
1551                     mRootWindowContainer.ensureVisibilityAndConfig(
1552                             currentTop, currentTop.getDisplayId(),
1553                             true /* markFrozenIfConfigChanged */, false /* deferResume */);
1554                 }
1555             }
1556             return startedActivityStack;
1557         }
1558 
1559         // If we are not able to proceed, disassociate the activity from the task. Leaving an
1560         // activity in an incomplete state can lead to issues, such as performing operations
1561         // without a window container.
1562         final ActivityStack stack = mStartActivity.getRootTask();
1563         if (stack != null) {
1564             mStartActivity.finishIfPossible("startActivity", true /* oomAdj */);
1565         }
1566 
1567         // Stack should also be detached from display and be removed if it's empty.
1568         if (startedActivityStack != null && startedActivityStack.isAttached()
1569                 && !startedActivityStack.hasActivity()
1570                 && !startedActivityStack.isActivityTypeHome()) {
1571             startedActivityStack.removeIfPossible();
1572             startedActivityStack = null;
1573         }
1574         return startedActivityStack;
1575     }
1576 
1577     /**
1578      * Start an activity and determine if the activity should be adding to the top of an existing
1579      * task or delivered new intent to an existing activity. Also manipulating the activity task
1580      * onto requested or valid stack/display.
1581      *
1582      * Note: This method should only be called from {@link #startActivityUnchecked}.
1583      */
1584 
1585     // TODO(b/152429287): Make it easier to exercise code paths through startActivityInner
1586     @VisibleForTesting
startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, boolean restrictedBgActivity, NeededUriGrants intentGrants)1587     int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,
1588             IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
1589             int startFlags, boolean doResume, ActivityOptions options, Task inTask,
1590             boolean restrictedBgActivity, NeededUriGrants intentGrants) {
1591         setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession,
1592                 voiceInteractor, restrictedBgActivity);
1593 
1594         computeLaunchingTaskFlags();
1595 
1596         computeSourceStack();
1597 
1598         mIntent.setFlags(mLaunchFlags);
1599 
1600         final Task reusedTask = getReusableTask();
1601 
1602         // If requested, freeze the task list
1603         if (mOptions != null && mOptions.freezeRecentTasksReordering()
1604                 && mSupervisor.mRecentTasks.isCallerRecents(r.launchedFromUid)
1605                 && !mSupervisor.mRecentTasks.isFreezeTaskListReorderingSet()) {
1606             mFrozeTaskList = true;
1607             mSupervisor.mRecentTasks.setFreezeTaskListReordering();
1608         }
1609 
1610         // Compute if there is an existing task that should be used for.
1611         final Task targetTask = reusedTask != null ? reusedTask : computeTargetTask();
1612         final boolean newTask = targetTask == null;
1613         mTargetTask = targetTask;
1614 
1615         computeLaunchParams(r, sourceRecord, targetTask);
1616 
1617         // Check if starting activity on given task or on a new task is allowed.
1618         int startResult = isAllowedToStart(r, newTask, targetTask);
1619         if (startResult != START_SUCCESS) {
1620             return startResult;
1621         }
1622 
1623         final ActivityRecord targetTaskTop = newTask
1624                 ? null : targetTask.getTopNonFinishingActivity();
1625         if (targetTaskTop != null) {
1626             // Recycle the target task for this launch.
1627             startResult = recycleTask(targetTask, targetTaskTop, reusedTask, intentGrants);
1628             if (startResult != START_SUCCESS) {
1629                 return startResult;
1630             }
1631         } else {
1632             mAddingToTask = true;
1633         }
1634 
1635         // If the activity being launched is the same as the one currently at the top, then
1636         // we need to check if it should only be launched once.
1637         final ActivityStack topStack = mRootWindowContainer.getTopDisplayFocusedStack();
1638         if (topStack != null) {
1639             startResult = deliverToCurrentTopIfNeeded(topStack, intentGrants);
1640             if (startResult != START_SUCCESS) {
1641                 return startResult;
1642             }
1643         }
1644 
1645         if (mTargetStack == null) {
1646             mTargetStack = getLaunchStack(mStartActivity, mLaunchFlags, targetTask, mOptions);
1647         }
1648         if (newTask) {
1649             final Task taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
1650                     ? mSourceRecord.getTask() : null;
1651             setNewTask(taskToAffiliate);
1652             if (mService.getLockTaskController().isLockTaskModeViolation(
1653                     mStartActivity.getTask())) {
1654                 Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
1655                 return START_RETURN_LOCK_TASK_MODE_VIOLATION;
1656             }
1657         } else if (mAddingToTask) {
1658             addOrReparentStartingActivity(targetTask, "adding to task");
1659         }
1660 
1661         if (!mAvoidMoveToFront && mDoResume) {
1662             mTargetStack.getStack().moveToFront("reuseOrNewTask", targetTask);
1663             if (mOptions != null) {
1664                 if (mOptions.getTaskAlwaysOnTop()) {
1665                     mTargetStack.setAlwaysOnTop(true);
1666                 }
1667             }
1668             if (!mTargetStack.isTopStackInDisplayArea() && mService.mInternal.isDreaming()) {
1669                 // Launching underneath dream activity (fullscreen, always-on-top). Run the launch-
1670                 // -behind transition so the Activity gets created and starts in visible state.
1671                 mLaunchTaskBehind = true;
1672                 r.mLaunchTaskBehind = true;
1673             }
1674         }
1675 
1676         mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(intentGrants,
1677                 mStartActivity.getUriPermissionsLocked());
1678         if (mStartActivity.resultTo != null && mStartActivity.resultTo.info != null) {
1679             // we need to resolve resultTo to a uid as grantImplicitAccess deals explicitly in UIDs
1680             final PackageManagerInternal pmInternal =
1681                     mService.getPackageManagerInternalLocked();
1682             final int resultToUid = pmInternal.getPackageUidInternal(
1683                             mStartActivity.resultTo.info.packageName, 0, mStartActivity.mUserId);
1684             pmInternal.grantImplicitAccess(mStartActivity.mUserId, mIntent,
1685                     UserHandle.getAppId(mStartActivity.info.applicationInfo.uid) /*recipient*/,
1686                     resultToUid /*visible*/, true /*direct*/);
1687         }
1688         if (newTask) {
1689             EventLogTags.writeWmCreateTask(mStartActivity.mUserId,
1690                     mStartActivity.getTask().mTaskId);
1691         }
1692         mStartActivity.logStartActivity(
1693                 EventLogTags.WM_CREATE_ACTIVITY, mStartActivity.getTask());
1694 
1695         mTargetStack.mLastPausedActivity = null;
1696 
1697         mRootWindowContainer.sendPowerHintForLaunchStartIfNeeded(
1698                 false /* forceSend */, mStartActivity);
1699 
1700         mTargetStack.startActivityLocked(mStartActivity, topStack.getTopNonFinishingActivity(),
1701                 newTask, mKeepCurTransition, mOptions);
1702         if (mDoResume) {
1703             final ActivityRecord topTaskActivity =
1704                     mStartActivity.getTask().topRunningActivityLocked();
1705             if (!mTargetStack.isTopActivityFocusable()
1706                     || (topTaskActivity != null && topTaskActivity.isTaskOverlay()
1707                     && mStartActivity != topTaskActivity)) {
1708                 // If the activity is not focusable, we can't resume it, but still would like to
1709                 // make sure it becomes visible as it starts (this will also trigger entry
1710                 // animation). An example of this are PIP activities.
1711                 // Also, we don't want to resume activities in a task that currently has an overlay
1712                 // as the starting activity just needs to be in the visible paused state until the
1713                 // over is removed.
1714                 // Passing {@code null} as the start parameter ensures all activities are made
1715                 // visible.
1716                 mTargetStack.ensureActivitiesVisible(null /* starting */,
1717                         0 /* configChanges */, !PRESERVE_WINDOWS);
1718                 // Go ahead and tell window manager to execute app transition for this activity
1719                 // since the app transition will not be triggered through the resume channel.
1720                 mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
1721             } else {
1722                 // If the target stack was not previously focusable (previous top running activity
1723                 // on that stack was not visible) then any prior calls to move the stack to the
1724                 // will not update the focused stack.  If starting the new activity now allows the
1725                 // task stack to be focusable, then ensure that we now update the focused stack
1726                 // accordingly.
1727                 if (mTargetStack.isTopActivityFocusable()
1728                         && !mRootWindowContainer.isTopDisplayFocusedStack(mTargetStack)) {
1729                     mTargetStack.moveToFront("startActivityInner");
1730                 }
1731                 mRootWindowContainer.resumeFocusedStacksTopActivities(
1732                         mTargetStack, mStartActivity, mOptions);
1733             }
1734         }
1735         mRootWindowContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
1736 
1737         // Update the recent tasks list immediately when the activity starts
1738         mSupervisor.mRecentTasks.add(mStartActivity.getTask());
1739         mSupervisor.handleNonResizableTaskIfNeeded(mStartActivity.getTask(),
1740                 mPreferredWindowingMode, mPreferredTaskDisplayArea, mTargetStack);
1741 
1742         return START_SUCCESS;
1743     }
1744 
computeTargetTask()1745     private Task computeTargetTask() {
1746         if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
1747                 && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
1748             // A new task should be created instead of using existing one.
1749             return null;
1750         } else if (mSourceRecord != null) {
1751             return mSourceRecord.getTask();
1752         } else if (mInTask != null) {
1753             return mInTask;
1754         } else {
1755             final ActivityStack stack = getLaunchStack(mStartActivity, mLaunchFlags,
1756                     null /* task */, mOptions);
1757             final ActivityRecord top = stack.getTopNonFinishingActivity();
1758             if (top != null) {
1759                 return top.getTask();
1760             } else {
1761                 // Remove the stack if no activity in the stack.
1762                 stack.removeIfPossible();
1763             }
1764         }
1765         return null;
1766     }
1767 
computeLaunchParams(ActivityRecord r, ActivityRecord sourceRecord, Task targetTask)1768     private void computeLaunchParams(ActivityRecord r, ActivityRecord sourceRecord,
1769             Task targetTask) {
1770         final ActivityStack sourceStack = mSourceStack != null ? mSourceStack
1771                 : mRootWindowContainer.getTopDisplayFocusedStack();
1772         if (sourceStack != null && sourceStack.inSplitScreenWindowingMode()
1773                 && (mOptions == null
1774                         || mOptions.getLaunchWindowingMode() == WINDOWING_MODE_UNDEFINED)) {
1775             int windowingMode =
1776                     targetTask != null ? targetTask.getWindowingMode() : WINDOWING_MODE_UNDEFINED;
1777             if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
1778                 if (sourceStack.inSplitScreenPrimaryWindowingMode()) {
1779                     windowingMode = WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
1780                 } else if (sourceStack.inSplitScreenSecondaryWindowingMode()) {
1781                     windowingMode = WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
1782                 }
1783             }
1784 
1785             if (mOptions == null) {
1786                 mOptions = ActivityOptions.makeBasic();
1787             }
1788             mOptions.setLaunchWindowingMode(windowingMode);
1789         }
1790 
1791         mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r,
1792                 sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams);
1793         mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
1794                 ? mLaunchParams.mPreferredTaskDisplayArea
1795                 : mRootWindowContainer.getDefaultTaskDisplayArea();
1796         mPreferredWindowingMode = mLaunchParams.mWindowingMode;
1797     }
1798 
isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask)1799     private int isAllowedToStart(ActivityRecord r, boolean newTask, Task targetTask) {
1800         if (mStartActivity.packageName == null) {
1801             if (mStartActivity.resultTo != null) {
1802                 mStartActivity.resultTo.sendResult(INVALID_UID, mStartActivity.resultWho,
1803                         mStartActivity.requestCode, RESULT_CANCELED,
1804                         null /* data */, null /* dataGrants */);
1805             }
1806             ActivityOptions.abort(mOptions);
1807             return START_CLASS_NOT_FOUND;
1808         }
1809 
1810         // Do not start home activity if it cannot be launched on preferred display. We are not
1811         // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might
1812         // fallback to launch on other displays.
1813         if (r.isActivityTypeHome()) {
1814             if (!mRootWindowContainer.canStartHomeOnDisplayArea(r.info, mPreferredTaskDisplayArea,
1815                     true /* allowInstrumenting */)) {
1816                 Slog.w(TAG, "Cannot launch home on display area " + mPreferredTaskDisplayArea);
1817                 return START_CANCELED;
1818             }
1819         }
1820 
1821         if (mRestrictedBgActivity && (newTask || !targetTask.isUidPresent(mCallingUid))
1822                 && handleBackgroundActivityAbort(mStartActivity)) {
1823             Slog.e(TAG, "Abort background activity starts from " + mCallingUid);
1824             return START_ABORTED;
1825         }
1826 
1827         // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused but still
1828         // needs to be a lock task mode violation since the task gets cleared out and the device
1829         // would otherwise leave the locked task.
1830         final boolean isNewClearTask =
1831                 (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
1832                         == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
1833         if (!newTask && mService.getLockTaskController().isLockTaskModeViolation(targetTask,
1834                 isNewClearTask)) {
1835             Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
1836             return START_RETURN_LOCK_TASK_MODE_VIOLATION;
1837         }
1838 
1839         return START_SUCCESS;
1840     }
1841 
1842     /**
1843      * Prepare the target task to be reused for this launch, which including:
1844      * - Position the target task on valid stack on preferred display.
1845      * - Comply to the specified activity launch flags
1846      * - Determine whether need to add a new activity on top or just brought the task to front.
1847      */
1848     @VisibleForTesting
recycleTask(Task targetTask, ActivityRecord targetTaskTop, Task reusedTask, NeededUriGrants intentGrants)1849     int recycleTask(Task targetTask, ActivityRecord targetTaskTop, Task reusedTask,
1850             NeededUriGrants intentGrants) {
1851         // Should not recycle task which is from a different user, just adding the starting
1852         // activity to the task.
1853         if (targetTask.mUserId != mStartActivity.mUserId) {
1854             mTargetStack = targetTask.getStack();
1855             mAddingToTask = true;
1856             return START_SUCCESS;
1857         }
1858 
1859         boolean clearTaskForReuse = false;
1860         if (reusedTask != null) {
1861             if (mStartActivity.getTask() == null) {
1862                 mStartActivity.setTaskForReuse(reusedTask);
1863                 clearTaskForReuse = true;
1864             }
1865 
1866             if (targetTask.intent == null) {
1867                 // This task was started because of movement of the activity based on
1868                 // affinity...
1869                 // Now that we are actually launching it, we can assign the base intent.
1870                 targetTask.setIntent(mStartActivity);
1871             } else {
1872                 final boolean taskOnHome =
1873                         (mStartActivity.intent.getFlags() & FLAG_ACTIVITY_TASK_ON_HOME) != 0;
1874                 if (taskOnHome) {
1875                     targetTask.intent.addFlags(FLAG_ACTIVITY_TASK_ON_HOME);
1876                 } else {
1877                     targetTask.intent.removeFlags(FLAG_ACTIVITY_TASK_ON_HOME);
1878                 }
1879             }
1880         }
1881 
1882         mRootWindowContainer.sendPowerHintForLaunchStartIfNeeded(false /* forceSend */,
1883                 targetTaskTop);
1884 
1885         setTargetStackIfNeeded(targetTaskTop);
1886 
1887         // When there is a reused activity and the current result is a trampoline activity,
1888         // set the reused activity as the result.
1889         if (mLastStartActivityRecord != null
1890                 && (mLastStartActivityRecord.finishing || mLastStartActivityRecord.noDisplay)) {
1891             mLastStartActivityRecord = targetTaskTop;
1892         }
1893 
1894         if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
1895             // We don't need to start a new activity, and the client said not to do anything
1896             // if that is the case, so this is it!  And for paranoia, make sure we have
1897             // correctly resumed the top activity.
1898             if (!mMovedToFront && mDoResume) {
1899                 if (DEBUG_TASKS) {
1900                     Slog.d(TAG_TASKS, "Bring to front target: " + mTargetStack
1901                             + " from " + targetTaskTop);
1902                 }
1903                 mTargetStack.moveToFront("intentActivityFound");
1904             }
1905             resumeTargetStackIfNeeded();
1906             return START_RETURN_INTENT_TO_CALLER;
1907         }
1908 
1909         complyActivityFlags(targetTask,
1910                 reusedTask != null ? reusedTask.getTopNonFinishingActivity() : null, intentGrants);
1911 
1912         if (clearTaskForReuse) {
1913             // Clear task for re-use so later code to methods
1914             // {@link #setTaskFromReuseOrCreateNewTask}, {@link #setTaskFromSourceRecord}, or
1915             // {@link #setTaskFromInTask} can parent it to the task.
1916             mStartActivity.setTaskForReuse(null);
1917         }
1918 
1919         if (mAddingToTask) {
1920             return START_SUCCESS;
1921         }
1922 
1923         // At this point we are certain we want the task moved to the front. If we need to dismiss
1924         // any other always-on-top stacks, now is the time to do it.
1925         if (targetTaskTop.canTurnScreenOn() && mService.mInternal.isDreaming()) {
1926             targetTaskTop.mStackSupervisor.wakeUp("recycleTask#turnScreenOnFlag");
1927         }
1928 
1929         if (mMovedToFront) {
1930             // We moved the task to front, use starting window to hide initial drawn delay.
1931             targetTaskTop.showStartingWindow(null /* prev */, false /* newTask */,
1932                     true /* taskSwitch */);
1933         } else if (mDoResume) {
1934             // Make sure the stack and its belonging display are moved to topmost.
1935             mTargetStack.moveToFront("intentActivityFound");
1936         }
1937         // We didn't do anything...  but it was needed (a.k.a., client don't use that intent!)
1938         // And for paranoia, make sure we have correctly resumed the top activity.
1939         resumeTargetStackIfNeeded();
1940         // The reusedActivity could be finishing, for example of starting an activity with
1941         // FLAG_ACTIVITY_CLEAR_TOP flag. In that case, return the top running activity in the
1942         // task instead.
1943         mLastStartActivityRecord =
1944                 targetTaskTop.finishing ? targetTask.getTopNonFinishingActivity() : targetTaskTop;
1945         return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
1946     }
1947 
1948     /**
1949      * Check if the activity being launched is the same as the one currently at the top and it
1950      * should only be launched once.
1951      */
deliverToCurrentTopIfNeeded(ActivityStack topStack, NeededUriGrants intentGrants)1952     private int deliverToCurrentTopIfNeeded(ActivityStack topStack, NeededUriGrants intentGrants) {
1953         final ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(mNotTop);
1954         final boolean dontStart = top != null && mStartActivity.resultTo == null
1955                 && top.mActivityComponent.equals(mStartActivity.mActivityComponent)
1956                 && top.mUserId == mStartActivity.mUserId
1957                 && top.attachedToProcess()
1958                 && ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
1959                 || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK))
1960                 // This allows home activity to automatically launch on secondary task display area
1961                 // when it was added, if home was the top activity on default task display area,
1962                 // instead of sending new intent to the home activity on default display area.
1963                 && (!top.isActivityTypeHome() || top.getDisplayArea() == mPreferredTaskDisplayArea);
1964         if (!dontStart) {
1965             return START_SUCCESS;
1966         }
1967 
1968         // For paranoia, make sure we have correctly resumed the top activity.
1969         topStack.mLastPausedActivity = null;
1970         if (mDoResume) {
1971             mRootWindowContainer.resumeFocusedStacksTopActivities();
1972         }
1973         ActivityOptions.abort(mOptions);
1974         if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
1975             // We don't need to start a new activity, and the client said not to do anything if
1976             // that is the case, so this is it!
1977             return START_RETURN_INTENT_TO_CALLER;
1978         }
1979 
1980         deliverNewIntent(top, intentGrants);
1981 
1982         // Don't use mStartActivity.task to show the toast. We're not starting a new activity but
1983         // reusing 'top'. Fields in mStartActivity may not be fully initialized.
1984         mSupervisor.handleNonResizableTaskIfNeeded(top.getTask(),
1985                 mLaunchParams.mWindowingMode, mPreferredTaskDisplayArea, topStack);
1986 
1987         return START_DELIVERED_TO_TOP;
1988     }
1989 
1990     /**
1991      * Applying the launching flags to the task, which might clear few or all the activities in the
1992      * task.
1993      */
complyActivityFlags(Task targetTask, ActivityRecord reusedActivity, NeededUriGrants intentGrants)1994     private void complyActivityFlags(Task targetTask, ActivityRecord reusedActivity,
1995             NeededUriGrants intentGrants) {
1996         ActivityRecord targetTaskTop = targetTask.getTopNonFinishingActivity();
1997         final boolean resetTask =
1998                 reusedActivity != null && (mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0;
1999         if (resetTask) {
2000             targetTaskTop = mTargetStack.resetTaskIfNeeded(targetTaskTop, mStartActivity);
2001         }
2002 
2003         if ((mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
2004                 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) {
2005             // The caller has requested to completely replace any existing task with its new
2006             // activity. Well that should not be too hard...
2007             // Note: we must persist the {@link Task} first as intentActivity could be
2008             // removed from calling performClearTaskLocked (For example, if it is being brought out
2009             // of history or if it is finished immediately), thus disassociating the task. Also note
2010             // that mReuseTask is reset as a result of {@link Task#performClearTaskLocked}
2011             // launching another activity.
2012             // TODO(b/36119896):  We shouldn't trigger activity launches in this path since we are
2013             // already launching one.
2014             targetTask.performClearTaskLocked();
2015             targetTask.setIntent(mStartActivity);
2016             mAddingToTask = true;
2017         } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
2018                 || isDocumentLaunchesIntoExisting(mLaunchFlags)
2019                 || isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
2020             // In this situation we want to remove all activities from the task up to the one
2021             // being started. In most cases this means we are resetting the task to its initial
2022             // state.
2023             final ActivityRecord top = targetTask.performClearTaskForReuseLocked(mStartActivity,
2024                     mLaunchFlags);
2025 
2026             // The above code can remove {@code reusedActivity} from the task, leading to the
2027             // {@code ActivityRecord} removing its reference to the {@code Task}. The task
2028             // reference is needed in the call below to {@link setTargetStackAndMoveToFrontIfNeeded}
2029             if (targetTaskTop.getTask() == null) {
2030                 targetTask.addChild(targetTaskTop);
2031             }
2032 
2033             if (top != null) {
2034                 if (top.isRootOfTask()) {
2035                     // Activity aliases may mean we use different intents for the top activity,
2036                     // so make sure the task now has the identity of the new intent.
2037                     top.getTask().setIntent(mStartActivity);
2038                 }
2039                 deliverNewIntent(top, intentGrants);
2040             } else {
2041                 // A special case: we need to start the activity because it is not currently
2042                 // running, and the caller has asked to clear the current task to have this
2043                 // activity at the top.
2044                 mAddingToTask = true;
2045                 if (targetTask.getStack() == null) {
2046                     // Target stack got cleared when we all activities were removed above.
2047                     // Go ahead and reset it.
2048                     mTargetStack =
2049                             getLaunchStack(mStartActivity, mLaunchFlags, null /* task */, mOptions);
2050                     mTargetStack.addChild(targetTask, !mLaunchTaskBehind /* toTop */,
2051                             (mStartActivity.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);
2052                 }
2053             }
2054         } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) == 0 && !mAddingToTask
2055                 && (mLaunchFlags & FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
2056             // In this case, we are launching an activity in our own task that may
2057             // already be running somewhere in the history, and we want to shuffle it to
2058             // the front of the stack if so.
2059             final ActivityRecord act =
2060                     targetTask.findActivityInHistory(mStartActivity.mActivityComponent);
2061             if (act != null) {
2062                 final Task task = act.getTask();
2063                 task.moveActivityToFrontLocked(act);
2064                 act.updateOptionsLocked(mOptions);
2065                 deliverNewIntent(act, intentGrants);
2066                 mTargetStack.mLastPausedActivity = null;
2067             } else {
2068                 mAddingToTask = true;
2069             }
2070         } else if (mStartActivity.mActivityComponent.equals(targetTask.realActivity)) {
2071             if (targetTask == mInTask) {
2072                 // In this case we are bringing up an existing activity from a recent task. We
2073                 // don't need to add a new activity instance on top.
2074             } else if (((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
2075                             || LAUNCH_SINGLE_TOP == mLaunchMode)
2076                     && targetTaskTop.mActivityComponent.equals(mStartActivity.mActivityComponent)
2077                     && mStartActivity.resultTo == null) {
2078                 // In this case the top activity on the task is the same as the one being launched,
2079                 // so we take that as a request to bring the task to the foreground. If the top
2080                 // activity in the task is the root activity, deliver this new intent to it if it
2081                 // desires.
2082                 if (targetTaskTop.isRootOfTask()) {
2083                     targetTaskTop.getTask().setIntent(mStartActivity);
2084                 }
2085                 deliverNewIntent(targetTaskTop, intentGrants);
2086             } else if (!targetTask.isSameIntentFilter(mStartActivity)) {
2087                 // In this case we are launching the root activity of the task, but with a
2088                 // different intent. We should start a new instance on top.
2089                 mAddingToTask = true;
2090             } else if (reusedActivity == null) {
2091                 mAddingToTask = true;
2092             }
2093         } else if (!resetTask) {
2094             // In this case an activity is being launched in to an existing task, without
2095             // resetting that task. This is typically the situation of launching an activity
2096             // from a notification or shortcut. We want to place the new activity on top of the
2097             // current task.
2098             mAddingToTask = true;
2099         } else if (!targetTask.rootWasReset) {
2100             // In this case we are launching into an existing task that has not yet been started
2101             // from its front door. The current task has been brought to the front. Ideally,
2102             // we'd probably like to place this new task at the bottom of its stack, but that's
2103             // a little hard to do with the current organization of the code so for now we'll
2104             // just drop it.
2105             targetTask.setIntent(mStartActivity);
2106         }
2107     }
2108 
2109     /**
2110      * Resets the {@link ActivityStarter} state.
2111      * @param clearRequest whether the request should be reset to default values.
2112      */
reset(boolean clearRequest)2113     void reset(boolean clearRequest) {
2114         mStartActivity = null;
2115         mIntent = null;
2116         mCallingUid = -1;
2117         mOptions = null;
2118         mRestrictedBgActivity = false;
2119 
2120         mLaunchTaskBehind = false;
2121         mLaunchFlags = 0;
2122         mLaunchMode = INVALID_LAUNCH_MODE;
2123 
2124         mLaunchParams.reset();
2125 
2126         mNotTop = null;
2127         mDoResume = false;
2128         mStartFlags = 0;
2129         mSourceRecord = null;
2130         mPreferredTaskDisplayArea = null;
2131         mPreferredWindowingMode = WINDOWING_MODE_UNDEFINED;
2132 
2133         mInTask = null;
2134         mAddingToTask = false;
2135         mReuseTask = null;
2136 
2137         mNewTaskInfo = null;
2138         mNewTaskIntent = null;
2139         mSourceStack = null;
2140 
2141         mTargetStack = null;
2142         mTargetTask = null;
2143         mMovedToFront = false;
2144         mNoAnimation = false;
2145         mKeepCurTransition = false;
2146         mAvoidMoveToFront = false;
2147         mFrozeTaskList = false;
2148 
2149         mVoiceSession = null;
2150         mVoiceInteractor = null;
2151 
2152         mIntentDelivered = false;
2153 
2154         if (clearRequest) {
2155             mRequest.reset();
2156         }
2157     }
2158 
setInitialState(ActivityRecord r, ActivityOptions options, Task inTask, boolean doResume, int startFlags, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, boolean restrictedBgActivity)2159     private void setInitialState(ActivityRecord r, ActivityOptions options, Task inTask,
2160             boolean doResume, int startFlags, ActivityRecord sourceRecord,
2161             IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
2162             boolean restrictedBgActivity) {
2163         reset(false /* clearRequest */);
2164 
2165         mStartActivity = r;
2166         mIntent = r.intent;
2167         mOptions = options;
2168         mCallingUid = r.launchedFromUid;
2169         mSourceRecord = sourceRecord;
2170         mVoiceSession = voiceSession;
2171         mVoiceInteractor = voiceInteractor;
2172         mRestrictedBgActivity = restrictedBgActivity;
2173 
2174         mLaunchParams.reset();
2175 
2176         // Preferred display id is the only state we need for now and it could be updated again
2177         // after we located a reusable task (which might be resided in another display).
2178         mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r,
2179                 sourceRecord, options, PHASE_DISPLAY, mLaunchParams);
2180         mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
2181                 ? mLaunchParams.mPreferredTaskDisplayArea
2182                 : mRootWindowContainer.getDefaultTaskDisplayArea();
2183         mPreferredWindowingMode = mLaunchParams.mWindowingMode;
2184 
2185         mLaunchMode = r.launchMode;
2186 
2187         mLaunchFlags = adjustLaunchFlagsToDocumentMode(
2188                 r, LAUNCH_SINGLE_INSTANCE == mLaunchMode,
2189                 LAUNCH_SINGLE_TASK == mLaunchMode, mIntent.getFlags());
2190         mLaunchTaskBehind = r.mLaunchTaskBehind
2191                 && !isLaunchModeOneOf(LAUNCH_SINGLE_TASK, LAUNCH_SINGLE_INSTANCE)
2192                 && (mLaunchFlags & FLAG_ACTIVITY_NEW_DOCUMENT) != 0;
2193 
2194         sendNewTaskResultRequestIfNeeded();
2195 
2196         if ((mLaunchFlags & FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) {
2197             mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
2198         }
2199 
2200         // If we are actually going to launch in to a new task, there are some cases where
2201         // we further want to do multiple task.
2202         if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
2203             if (mLaunchTaskBehind
2204                     || r.info.documentLaunchMode == DOCUMENT_LAUNCH_ALWAYS) {
2205                 mLaunchFlags |= FLAG_ACTIVITY_MULTIPLE_TASK;
2206             }
2207         }
2208 
2209         // We'll invoke onUserLeaving before onPause only if the launching
2210         // activity did not explicitly state that this is an automated launch.
2211         mSupervisor.mUserLeaving = (mLaunchFlags & FLAG_ACTIVITY_NO_USER_ACTION) == 0;
2212         if (DEBUG_USER_LEAVING) Slog.v(TAG_USER_LEAVING,
2213                 "startActivity() => mUserLeaving=" + mSupervisor.mUserLeaving);
2214 
2215         // If the caller has asked not to resume at this point, we make note
2216         // of this in the record so that we can skip it when trying to find
2217         // the top running activity.
2218         mDoResume = doResume;
2219         if (!doResume || !r.okToShowLocked() || mLaunchTaskBehind) {
2220             r.delayedResume = true;
2221             mDoResume = false;
2222         }
2223 
2224         if (mOptions != null) {
2225             if (mOptions.getLaunchTaskId() != INVALID_TASK_ID && mOptions.getTaskOverlay()) {
2226                 r.setTaskOverlay(true);
2227                 if (!mOptions.canTaskOverlayResume()) {
2228                     final Task task = mRootWindowContainer.anyTaskForId(
2229                             mOptions.getLaunchTaskId());
2230                     final ActivityRecord top = task != null
2231                             ? task.getTopNonFinishingActivity() : null;
2232                     if (top != null && !top.isState(RESUMED)) {
2233 
2234                         // The caller specifies that we'd like to be avoided to be moved to the
2235                         // front, so be it!
2236                         mDoResume = false;
2237                         mAvoidMoveToFront = true;
2238                     }
2239                 }
2240             } else if (mOptions.getAvoidMoveToFront()) {
2241                 mDoResume = false;
2242                 mAvoidMoveToFront = true;
2243             }
2244         }
2245 
2246         mNotTop = (mLaunchFlags & FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? sourceRecord : null;
2247 
2248         mInTask = inTask;
2249         // In some flows in to this function, we retrieve the task record and hold on to it
2250         // without a lock before calling back in to here...  so the task at this point may
2251         // not actually be in recents.  Check for that, and if it isn't in recents just
2252         // consider it invalid.
2253         if (inTask != null && !inTask.inRecents) {
2254             Slog.w(TAG, "Starting activity in task not in recents: " + inTask);
2255             mInTask = null;
2256         }
2257 
2258         mStartFlags = startFlags;
2259         // If the onlyIfNeeded flag is set, then we can do this if the activity being launched
2260         // is the same as the one making the call...  or, as a special case, if we do not know
2261         // the caller then we count the current top activity as the caller.
2262         if ((startFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
2263             ActivityRecord checkedCaller = sourceRecord;
2264             if (checkedCaller == null) {
2265                 ActivityStack topFocusedStack = mRootWindowContainer.getTopDisplayFocusedStack();
2266                 if (topFocusedStack != null) {
2267                     checkedCaller = topFocusedStack.topRunningNonDelayedActivityLocked(mNotTop);
2268                 }
2269             }
2270             if (checkedCaller == null
2271                     || !checkedCaller.mActivityComponent.equals(r.mActivityComponent)) {
2272                 // Caller is not the same as launcher, so always needed.
2273                 mStartFlags &= ~START_FLAG_ONLY_IF_NEEDED;
2274             }
2275         }
2276 
2277         mNoAnimation = (mLaunchFlags & FLAG_ACTIVITY_NO_ANIMATION) != 0;
2278 
2279         if (mRestrictedBgActivity && !mService.isBackgroundActivityStartsEnabled()) {
2280             mAvoidMoveToFront = true;
2281             mDoResume = false;
2282         }
2283     }
2284 
sendNewTaskResultRequestIfNeeded()2285     private void sendNewTaskResultRequestIfNeeded() {
2286         if (mStartActivity.resultTo != null && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
2287             // For whatever reason this activity is being launched into a new task...
2288             // yet the caller has requested a result back.  Well, that is pretty messed up,
2289             // so instead immediately send back a cancel and let the new task continue launched
2290             // as normal without a dependency on its originator.
2291             Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
2292             mStartActivity.resultTo.sendResult(INVALID_UID, mStartActivity.resultWho,
2293                     mStartActivity.requestCode, RESULT_CANCELED,
2294                     null /* data */, null /* dataGrants */);
2295             mStartActivity.resultTo = null;
2296         }
2297     }
2298 
computeLaunchingTaskFlags()2299     private void computeLaunchingTaskFlags() {
2300         // If the caller is not coming from another activity, but has given us an explicit task into
2301         // which they would like us to launch the new activity, then let's see about doing that.
2302         if (mSourceRecord == null && mInTask != null && mInTask.getStack() != null) {
2303             final Intent baseIntent = mInTask.getBaseIntent();
2304             final ActivityRecord root = mInTask.getRootActivity();
2305             if (baseIntent == null) {
2306                 ActivityOptions.abort(mOptions);
2307                 throw new IllegalArgumentException("Launching into task without base intent: "
2308                         + mInTask);
2309             }
2310 
2311             // If this task is empty, then we are adding the first activity -- it
2312             // determines the root, and must be launching as a NEW_TASK.
2313             if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
2314                 if (!baseIntent.getComponent().equals(mStartActivity.intent.getComponent())) {
2315                     ActivityOptions.abort(mOptions);
2316                     throw new IllegalArgumentException("Trying to launch singleInstance/Task "
2317                             + mStartActivity + " into different task " + mInTask);
2318                 }
2319                 if (root != null) {
2320                     ActivityOptions.abort(mOptions);
2321                     throw new IllegalArgumentException("Caller with mInTask " + mInTask
2322                             + " has root " + root + " but target is singleInstance/Task");
2323                 }
2324             }
2325 
2326             // If task is empty, then adopt the interesting intent launch flags in to the
2327             // activity being started.
2328             if (root == null) {
2329                 final int flagsOfInterest = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK
2330                         | FLAG_ACTIVITY_NEW_DOCUMENT | FLAG_ACTIVITY_RETAIN_IN_RECENTS;
2331                 mLaunchFlags = (mLaunchFlags & ~flagsOfInterest)
2332                         | (baseIntent.getFlags() & flagsOfInterest);
2333                 mIntent.setFlags(mLaunchFlags);
2334                 mInTask.setIntent(mStartActivity);
2335                 mAddingToTask = true;
2336 
2337                 // If the task is not empty and the caller is asking to start it as the root of
2338                 // a new task, then we don't actually want to start this on the task. We will
2339                 // bring the task to the front, and possibly give it a new intent.
2340             } else if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
2341                 mAddingToTask = false;
2342 
2343             } else {
2344                 mAddingToTask = true;
2345             }
2346 
2347             mReuseTask = mInTask;
2348         } else {
2349             mInTask = null;
2350             // Launch ResolverActivity in the source task, so that it stays in the task bounds
2351             // when in freeform workspace.
2352             // Also put noDisplay activities in the source task. These by itself can be placed
2353             // in any task/stack, however it could launch other activities like ResolverActivity,
2354             // and we want those to stay in the original task.
2355             if ((mStartActivity.isResolverOrDelegateActivity() || mStartActivity.noDisplay)
2356                     && mSourceRecord != null && mSourceRecord.inFreeformWindowingMode()) {
2357                 mAddingToTask = true;
2358             }
2359         }
2360 
2361         if (mInTask == null) {
2362             if (mSourceRecord == null) {
2363                 // This activity is not being started from another...  in this
2364                 // case we -always- start a new task.
2365                 if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0 && mInTask == null) {
2366                     Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
2367                             "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent);
2368                     mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
2369                 }
2370             } else if (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) {
2371                 // The original activity who is starting us is running as a single
2372                 // instance...  this new activity it is starting must go on its
2373                 // own task.
2374                 mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
2375             } else if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
2376                 // The activity being started is a single instance...  it always
2377                 // gets launched into its own task.
2378                 mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
2379             }
2380         }
2381     }
2382 
computeSourceStack()2383     private void computeSourceStack() {
2384         if (mSourceRecord == null) {
2385             mSourceStack = null;
2386             return;
2387         }
2388         if (!mSourceRecord.finishing) {
2389             mSourceStack = mSourceRecord.getRootTask();
2390             return;
2391         }
2392 
2393         // If the source is finishing, we can't further count it as our source. This is because the
2394         // task it is associated with may now be empty and on its way out, so we don't want to
2395         // blindly throw it in to that task.  Instead we will take the NEW_TASK flow and try to find
2396         // a task for it. But save the task information so it can be used when creating the new task.
2397         if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0) {
2398             Slog.w(TAG, "startActivity called from finishing " + mSourceRecord
2399                     + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent);
2400             mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
2401             mNewTaskInfo = mSourceRecord.info;
2402 
2403             // It is not guaranteed that the source record will have a task associated with it. For,
2404             // example, if this method is being called for processing a pending activity launch, it
2405             // is possible that the activity has been removed from the task after the launch was
2406             // enqueued.
2407             final Task sourceTask = mSourceRecord.getTask();
2408             mNewTaskIntent = sourceTask != null ? sourceTask.intent : null;
2409         }
2410         mSourceRecord = null;
2411         mSourceStack = null;
2412     }
2413 
2414     /**
2415      * Decide whether the new activity should be inserted into an existing task. Returns null
2416      * if not or an ActivityRecord with the task into which the new activity should be added.
2417      */
getReusableTask()2418     private Task getReusableTask() {
2419         // If a target task is specified, try to reuse that one
2420         if (mOptions != null && mOptions.getLaunchTaskId() != INVALID_TASK_ID) {
2421             Task launchTask = mRootWindowContainer.anyTaskForId(mOptions.getLaunchTaskId());
2422             if (launchTask != null) {
2423                 return launchTask;
2424             }
2425             return null;
2426         }
2427 
2428         // We may want to try to place the new activity in to an existing task.  We always
2429         // do this if the target activity is singleTask or singleInstance; we will also do
2430         // this if NEW_TASK has been requested, and there is not an additional qualifier telling
2431         // us to still place it in a new task: multi task, always doc mode, or being asked to
2432         // launch this as a new task behind the current one.
2433         boolean putIntoExistingTask = ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0 &&
2434                 (mLaunchFlags & FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
2435                 || isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK);
2436         // If bring to front is requested, and no result is requested and we have not been given
2437         // an explicit task to launch in to, and we can find a task that was started with this
2438         // same component, then instead of launching bring that one to the front.
2439         putIntoExistingTask &= mInTask == null && mStartActivity.resultTo == null;
2440         ActivityRecord intentActivity = null;
2441         if (putIntoExistingTask) {
2442             if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) {
2443                 // There can be one and only one instance of single instance activity in the
2444                 // history, and it is always in its own unique task, so we do a special search.
2445                 intentActivity = mRootWindowContainer.findActivity(mIntent, mStartActivity.info,
2446                        mStartActivity.isActivityTypeHome());
2447             } else if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
2448                 // For the launch adjacent case we only want to put the activity in an existing
2449                 // task if the activity already exists in the history.
2450                 intentActivity = mRootWindowContainer.findActivity(mIntent, mStartActivity.info,
2451                         !(LAUNCH_SINGLE_TASK == mLaunchMode));
2452             } else {
2453                 // Otherwise find the best task to put the activity in.
2454                 intentActivity =
2455                         mRootWindowContainer.findTask(mStartActivity, mPreferredTaskDisplayArea);
2456             }
2457         }
2458 
2459         if (intentActivity != null
2460                 && (mStartActivity.isActivityTypeHome() || intentActivity.isActivityTypeHome())
2461                 && intentActivity.getDisplayArea() != mPreferredTaskDisplayArea) {
2462             // Do not reuse home activity on other display areas.
2463             intentActivity = null;
2464         }
2465 
2466         return intentActivity != null ? intentActivity.getTask() : null;
2467     }
2468 
2469     /**
2470      * Figure out which task and activity to bring to front when we have found an existing matching
2471      * activity record in history. May also clear the task if needed.
2472      * @param intentActivity Existing matching activity.
2473      * @return {@link ActivityRecord} brought to front.
2474      */
setTargetStackIfNeeded(ActivityRecord intentActivity)2475     private void setTargetStackIfNeeded(ActivityRecord intentActivity) {
2476         mTargetStack = intentActivity.getRootTask();
2477         mTargetStack.mLastPausedActivity = null;
2478         Task intentTask = intentActivity.getTask();
2479         // If the target task is not in the front, then we need to bring it to the front...
2480         // except...  well, with SINGLE_TASK_LAUNCH it's not entirely clear. We'd like to have
2481         // the same behavior as if a new instance was being started, which means not bringing it
2482         // to the front if the caller is not itself in the front.
2483         final boolean differentTopTask;
2484         if (mTargetStack.getDisplayArea() == mPreferredTaskDisplayArea) {
2485             final ActivityStack focusStack = mTargetStack.getDisplay().getFocusedStack();
2486             final ActivityRecord curTop = (focusStack == null)
2487                     ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
2488             final Task topTask = curTop != null ? curTop.getTask() : null;
2489             differentTopTask = topTask != intentTask
2490                     || (focusStack != null && topTask != focusStack.getTopMostTask());
2491         } else {
2492             // The existing task should always be different from those in other displays.
2493             differentTopTask = true;
2494         }
2495 
2496         if (differentTopTask && !mAvoidMoveToFront) {
2497             mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
2498             if (mSourceRecord == null || (mSourceStack.getTopNonFinishingActivity() != null &&
2499                     mSourceStack.getTopNonFinishingActivity().getTask()
2500                             == mSourceRecord.getTask())) {
2501                 // We really do want to push this one into the user's face, right now.
2502                 if (mLaunchTaskBehind && mSourceRecord != null) {
2503                     intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask());
2504                 }
2505 
2506                 final ActivityStack launchStack =
2507                         getLaunchStack(mStartActivity, mLaunchFlags, intentTask, mOptions);
2508                 if (launchStack == null || launchStack == mTargetStack) {
2509                     // Do not set mMovedToFront to true below for split-screen-top stack, or
2510                     // START_TASK_TO_FRONT will be returned and trigger unexpected animations when a
2511                     // new intent has delivered.
2512                     final boolean isSplitScreenTopStack = mTargetStack.isTopSplitScreenStack();
2513 
2514                     // TODO(b/151572268): Figure out a better way to move tasks in above 2-levels
2515                     //  tasks hierarchies.
2516                     if (mTargetStack != intentTask
2517                             && mTargetStack != intentTask.getParent().asTask()) {
2518                         intentTask.getParent().positionChildAt(POSITION_TOP, intentTask,
2519                                 false /* includingParents */);
2520                         intentTask = intentTask.getParent().asTask();
2521                     }
2522                     // We only want to move to the front, if we aren't going to launch on a
2523                     // different stack. If we launch on a different stack, we will put the
2524                     // task on top there.
2525                     // Defer resuming the top activity while moving task to top, since the
2526                     // current task-top activity may not be the activity that should be resumed.
2527                     mTargetStack.moveTaskToFront(intentTask, mNoAnimation, mOptions,
2528                             mStartActivity.appTimeTracker, DEFER_RESUME,
2529                             "bringingFoundTaskToFront");
2530                     mMovedToFront = !isSplitScreenTopStack;
2531                 } else {
2532                     intentTask.reparent(launchStack, ON_TOP, REPARENT_MOVE_STACK_TO_FRONT, ANIMATE,
2533                             DEFER_RESUME, "reparentToTargetStack");
2534                     mMovedToFront = true;
2535                 }
2536                 mOptions = null;
2537             }
2538         }
2539         // Need to update mTargetStack because if task was moved out of it, the original stack may
2540         // be destroyed.
2541         mTargetStack = intentActivity.getRootTask();
2542         mSupervisor.handleNonResizableTaskIfNeeded(intentTask, WINDOWING_MODE_UNDEFINED,
2543                 mRootWindowContainer.getDefaultTaskDisplayArea(), mTargetStack);
2544     }
2545 
resumeTargetStackIfNeeded()2546     private void resumeTargetStackIfNeeded() {
2547         if (mDoResume) {
2548             mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, null, mOptions);
2549         } else {
2550             ActivityOptions.abort(mOptions);
2551         }
2552         mRootWindowContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
2553     }
2554 
setNewTask(Task taskToAffiliate)2555     private void setNewTask(Task taskToAffiliate) {
2556         final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
2557         final Task task = mTargetStack.reuseOrCreateTask(
2558                 mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
2559                 mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
2560                 mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);
2561         addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask");
2562 
2563         if (DEBUG_TASKS) {
2564             Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
2565                     + " in new task " + mStartActivity.getTask());
2566         }
2567 
2568         if (taskToAffiliate != null) {
2569             mStartActivity.setTaskToAffiliateWith(taskToAffiliate);
2570         }
2571     }
2572 
deliverNewIntent(ActivityRecord activity, NeededUriGrants intentGrants)2573     private void deliverNewIntent(ActivityRecord activity, NeededUriGrants intentGrants) {
2574         if (mIntentDelivered) {
2575             return;
2576         }
2577 
2578         activity.logStartActivity(EventLogTags.WM_NEW_INTENT, activity.getTask());
2579         activity.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, intentGrants,
2580                 mStartActivity.launchedFromPackage);
2581         mIntentDelivered = true;
2582     }
2583 
addOrReparentStartingActivity(Task parent, String reason)2584     private void addOrReparentStartingActivity(Task parent, String reason) {
2585         if (mStartActivity.getTask() == null || mStartActivity.getTask() == parent) {
2586             parent.addChild(mStartActivity);
2587         } else {
2588             mStartActivity.reparent(parent, parent.getChildCount() /* top */, reason);
2589         }
2590     }
2591 
adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean launchSingleInstance, boolean launchSingleTask, int launchFlags)2592     private int adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean launchSingleInstance,
2593             boolean launchSingleTask, int launchFlags) {
2594         if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
2595                 (launchSingleInstance || launchSingleTask)) {
2596             // We have a conflict between the Intent and the Activity manifest, manifest wins.
2597             Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
2598                     "\"singleInstance\" or \"singleTask\"");
2599             launchFlags &=
2600                     ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | FLAG_ACTIVITY_MULTIPLE_TASK);
2601         } else {
2602             switch (r.info.documentLaunchMode) {
2603                 case ActivityInfo.DOCUMENT_LAUNCH_NONE:
2604                     break;
2605                 case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
2606                     launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
2607                     break;
2608                 case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
2609                     launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
2610                     break;
2611                 case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
2612                     launchFlags &= ~FLAG_ACTIVITY_MULTIPLE_TASK;
2613                     break;
2614             }
2615         }
2616         return launchFlags;
2617     }
2618 
getLaunchStack(ActivityRecord r, int launchFlags, Task task, ActivityOptions aOptions)2619     private ActivityStack getLaunchStack(ActivityRecord r, int launchFlags, Task task,
2620             ActivityOptions aOptions) {
2621         // We are reusing a task, keep the stack!
2622         if (mReuseTask != null) {
2623             return mReuseTask.getStack();
2624         }
2625 
2626         final boolean onTop =
2627                 (aOptions == null || !aOptions.getAvoidMoveToFront()) && !mLaunchTaskBehind;
2628         return mRootWindowContainer.getLaunchStack(r, aOptions, task, onTop, mLaunchParams,
2629                 mRequest.realCallingPid, mRequest.realCallingUid);
2630     }
2631 
isLaunchModeOneOf(int mode1, int mode2)2632     private boolean isLaunchModeOneOf(int mode1, int mode2) {
2633         return mode1 == mLaunchMode || mode2 == mLaunchMode;
2634     }
2635 
isDocumentLaunchesIntoExisting(int flags)2636     static boolean isDocumentLaunchesIntoExisting(int flags) {
2637         return (flags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
2638                 (flags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0;
2639     }
2640 
setIntent(Intent intent)2641     ActivityStarter setIntent(Intent intent) {
2642         mRequest.intent = intent;
2643         return this;
2644     }
2645 
getIntent()2646     Intent getIntent() {
2647         return mRequest.intent;
2648     }
2649 
setIntentGrants(NeededUriGrants intentGrants)2650     ActivityStarter setIntentGrants(NeededUriGrants intentGrants) {
2651         mRequest.intentGrants = intentGrants;
2652         return this;
2653     }
2654 
setReason(String reason)2655     ActivityStarter setReason(String reason) {
2656         mRequest.reason = reason;
2657         return this;
2658     }
2659 
setCaller(IApplicationThread caller)2660     ActivityStarter setCaller(IApplicationThread caller) {
2661         mRequest.caller = caller;
2662         return this;
2663     }
2664 
setResolvedType(String type)2665     ActivityStarter setResolvedType(String type) {
2666         mRequest.resolvedType = type;
2667         return this;
2668     }
2669 
setActivityInfo(ActivityInfo info)2670     ActivityStarter setActivityInfo(ActivityInfo info) {
2671         mRequest.activityInfo = info;
2672         return this;
2673     }
2674 
setResolveInfo(ResolveInfo info)2675     ActivityStarter setResolveInfo(ResolveInfo info) {
2676         mRequest.resolveInfo = info;
2677         return this;
2678     }
2679 
setVoiceSession(IVoiceInteractionSession voiceSession)2680     ActivityStarter setVoiceSession(IVoiceInteractionSession voiceSession) {
2681         mRequest.voiceSession = voiceSession;
2682         return this;
2683     }
2684 
setVoiceInteractor(IVoiceInteractor voiceInteractor)2685     ActivityStarter setVoiceInteractor(IVoiceInteractor voiceInteractor) {
2686         mRequest.voiceInteractor = voiceInteractor;
2687         return this;
2688     }
2689 
setResultTo(IBinder resultTo)2690     ActivityStarter setResultTo(IBinder resultTo) {
2691         mRequest.resultTo = resultTo;
2692         return this;
2693     }
2694 
setResultWho(String resultWho)2695     ActivityStarter setResultWho(String resultWho) {
2696         mRequest.resultWho = resultWho;
2697         return this;
2698     }
2699 
setRequestCode(int requestCode)2700     ActivityStarter setRequestCode(int requestCode) {
2701         mRequest.requestCode = requestCode;
2702         return this;
2703     }
2704 
2705     /**
2706      * Sets the pid of the caller who originally started the activity.
2707      *
2708      * Normally, the pid/uid would be the calling pid from the binder call.
2709      * However, in case of a {@link PendingIntent}, the pid/uid pair of the caller is considered
2710      * the original entity that created the pending intent, in contrast to setRealCallingPid/Uid,
2711      * which represents the entity who invoked pending intent via {@link PendingIntent#send}.
2712      */
setCallingPid(int pid)2713     ActivityStarter setCallingPid(int pid) {
2714         mRequest.callingPid = pid;
2715         return this;
2716     }
2717 
2718     /**
2719      * Sets the uid of the caller who originally started the activity.
2720      *
2721      * @see #setCallingPid
2722      */
setCallingUid(int uid)2723     ActivityStarter setCallingUid(int uid) {
2724         mRequest.callingUid = uid;
2725         return this;
2726     }
2727 
setCallingPackage(String callingPackage)2728     ActivityStarter setCallingPackage(String callingPackage) {
2729         mRequest.callingPackage = callingPackage;
2730         return this;
2731     }
2732 
setCallingFeatureId(String callingFeatureId)2733     ActivityStarter setCallingFeatureId(String callingFeatureId) {
2734         mRequest.callingFeatureId = callingFeatureId;
2735         return this;
2736     }
2737 
2738     /**
2739      * Sets the pid of the caller who requested to launch the activity.
2740      *
2741      * The pid/uid represents the caller who launches the activity in this request.
2742      * It will almost same as setCallingPid/Uid except when processing {@link PendingIntent}:
2743      * the pid/uid will be the caller who called {@link PendingIntent#send()}.
2744      *
2745      * @see #setCallingPid
2746      */
setRealCallingPid(int pid)2747     ActivityStarter setRealCallingPid(int pid) {
2748         mRequest.realCallingPid = pid;
2749         return this;
2750     }
2751 
2752     /**
2753      * Sets the uid of the caller who requested to launch the activity.
2754      *
2755      * @see #setRealCallingPid
2756      */
setRealCallingUid(int uid)2757     ActivityStarter setRealCallingUid(int uid) {
2758         mRequest.realCallingUid = uid;
2759         return this;
2760     }
2761 
setStartFlags(int startFlags)2762     ActivityStarter setStartFlags(int startFlags) {
2763         mRequest.startFlags = startFlags;
2764         return this;
2765     }
2766 
setActivityOptions(SafeActivityOptions options)2767     ActivityStarter setActivityOptions(SafeActivityOptions options) {
2768         mRequest.activityOptions = options;
2769         return this;
2770     }
2771 
setActivityOptions(Bundle bOptions)2772     ActivityStarter setActivityOptions(Bundle bOptions) {
2773         return setActivityOptions(SafeActivityOptions.fromBundle(bOptions));
2774     }
2775 
setIgnoreTargetSecurity(boolean ignoreTargetSecurity)2776     ActivityStarter setIgnoreTargetSecurity(boolean ignoreTargetSecurity) {
2777         mRequest.ignoreTargetSecurity = ignoreTargetSecurity;
2778         return this;
2779     }
2780 
setFilterCallingUid(int filterCallingUid)2781     ActivityStarter setFilterCallingUid(int filterCallingUid) {
2782         mRequest.filterCallingUid = filterCallingUid;
2783         return this;
2784     }
2785 
setComponentSpecified(boolean componentSpecified)2786     ActivityStarter setComponentSpecified(boolean componentSpecified) {
2787         mRequest.componentSpecified = componentSpecified;
2788         return this;
2789     }
2790 
setOutActivity(ActivityRecord[] outActivity)2791     ActivityStarter setOutActivity(ActivityRecord[] outActivity) {
2792         mRequest.outActivity = outActivity;
2793         return this;
2794     }
2795 
setInTask(Task inTask)2796     ActivityStarter setInTask(Task inTask) {
2797         mRequest.inTask = inTask;
2798         return this;
2799     }
2800 
setWaitResult(WaitResult result)2801     ActivityStarter setWaitResult(WaitResult result) {
2802         mRequest.waitResult = result;
2803         return this;
2804     }
2805 
setProfilerInfo(ProfilerInfo info)2806     ActivityStarter setProfilerInfo(ProfilerInfo info) {
2807         mRequest.profilerInfo = info;
2808         return this;
2809     }
2810 
setGlobalConfiguration(Configuration config)2811     ActivityStarter setGlobalConfiguration(Configuration config) {
2812         mRequest.globalConfig = config;
2813         return this;
2814     }
2815 
setUserId(int userId)2816     ActivityStarter setUserId(int userId) {
2817         mRequest.userId = userId;
2818         return this;
2819     }
2820 
setAllowPendingRemoteAnimationRegistryLookup(boolean allowLookup)2821     ActivityStarter setAllowPendingRemoteAnimationRegistryLookup(boolean allowLookup) {
2822         mRequest.allowPendingRemoteAnimationRegistryLookup = allowLookup;
2823         return this;
2824     }
2825 
setOriginatingPendingIntent(PendingIntentRecord originatingPendingIntent)2826     ActivityStarter setOriginatingPendingIntent(PendingIntentRecord originatingPendingIntent) {
2827         mRequest.originatingPendingIntent = originatingPendingIntent;
2828         return this;
2829     }
2830 
setAllowBackgroundActivityStart(boolean allowBackgroundActivityStart)2831     ActivityStarter setAllowBackgroundActivityStart(boolean allowBackgroundActivityStart) {
2832         mRequest.allowBackgroundActivityStart = allowBackgroundActivityStart;
2833         return this;
2834     }
2835 
dump(PrintWriter pw, String prefix)2836     void dump(PrintWriter pw, String prefix) {
2837         prefix = prefix + "  ";
2838         pw.print(prefix);
2839         pw.print("mCurrentUser=");
2840         pw.println(mRootWindowContainer.mCurrentUser);
2841         pw.print(prefix);
2842         pw.print("mLastStartReason=");
2843         pw.println(mLastStartReason);
2844         pw.print(prefix);
2845         pw.print("mLastStartActivityTimeMs=");
2846         pw.println(DateFormat.getDateTimeInstance().format(new Date(mLastStartActivityTimeMs)));
2847         pw.print(prefix);
2848         pw.print("mLastStartActivityResult=");
2849         pw.println(mLastStartActivityResult);
2850         if (mLastStartActivityRecord != null) {
2851             pw.print(prefix);
2852             pw.println("mLastStartActivityRecord:");
2853             mLastStartActivityRecord.dump(pw, prefix + "  ", true /* dumpAll */);
2854         }
2855         if (mStartActivity != null) {
2856             pw.print(prefix);
2857             pw.println("mStartActivity:");
2858             mStartActivity.dump(pw, prefix + "  ", true /* dumpAll */);
2859         }
2860         if (mIntent != null) {
2861             pw.print(prefix);
2862             pw.print("mIntent=");
2863             pw.println(mIntent);
2864         }
2865         if (mOptions != null) {
2866             pw.print(prefix);
2867             pw.print("mOptions=");
2868             pw.println(mOptions);
2869         }
2870         pw.print(prefix);
2871         pw.print("mLaunchSingleTop=");
2872         pw.print(LAUNCH_SINGLE_TOP == mLaunchMode);
2873         pw.print(" mLaunchSingleInstance=");
2874         pw.print(LAUNCH_SINGLE_INSTANCE == mLaunchMode);
2875         pw.print(" mLaunchSingleTask=");
2876         pw.println(LAUNCH_SINGLE_TASK == mLaunchMode);
2877         pw.print(prefix);
2878         pw.print("mLaunchFlags=0x");
2879         pw.print(Integer.toHexString(mLaunchFlags));
2880         pw.print(" mDoResume=");
2881         pw.print(mDoResume);
2882         pw.print(" mAddingToTask=");
2883         pw.println(mAddingToTask);
2884     }
2885 }
2886