Loading services/core/java/com/android/server/wm/ActivityClientController.java +6 −7 Original line number Diff line number Diff line Loading @@ -1156,7 +1156,7 @@ class ActivityClientController extends IActivityClientController.Stub { } if (rootTask.inFreeformWindowingMode()) { rootTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_FULLSCREEN); rootTask.setBounds(null); } else if (!r.supportsFreeform()) { throw new IllegalStateException( Loading @@ -1165,9 +1165,9 @@ class ActivityClientController extends IActivityClientController.Stub { // If the window is on a freeform display, set it to undefined. It will be // resolved to freeform and it can adjust windowing mode when the display mode // changes in runtime. rootTask.setWindowingMode(WINDOWING_MODE_UNDEFINED); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_UNDEFINED); } else { rootTask.setWindowingMode(WINDOWING_MODE_FREEFORM); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_FREEFORM); } } } finally { Loading Loading @@ -1278,7 +1278,7 @@ class ActivityClientController extends IActivityClientController.Stub { if (fullscreenRequest == FULLSCREEN_MODE_REQUEST_ENTER) { final int restoreWindowingMode = requester.getRequestedOverrideWindowingMode(); targetWindowingMode = WINDOWING_MODE_FULLSCREEN; requester.setWindowingMode(targetWindowingMode); requester.setRootTaskWindowingMode(targetWindowingMode); // The restore windowing mode must be set after the windowing mode is set since // Task#setWindowingMode resets the restore windowing mode to WINDOWING_MODE_INVALID. requester.mMultiWindowRestoreWindowingMode = restoreWindowingMode; Loading @@ -1297,11 +1297,10 @@ class ActivityClientController extends IActivityClientController.Stub { public void startLockTaskModeByToken(IBinder token) { synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.forTokenLocked(token); if (r != null) { if (r == null) return; mService.startLockTaskMode(r.getTask(), false /* isSystemCaller */); } } } @Override public void stopLockTaskModeByToken(IBinder token) { Loading services/core/java/com/android/server/wm/ActivityRecord.java +25 −21 Original line number Diff line number Diff line Loading @@ -2016,7 +2016,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mIsUserAlwaysVisible = properties != null && properties.getAlwaysVisible(); mShowForAllUsers = (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0 || mIsUserAlwaysVisible; setOrientation(info.screenOrientation); setOverrideOrientation(info.screenOrientation); mRotationAnimationHint = info.rotationAnimation; mShowWhenLocked = (aInfo.flags & ActivityInfo.FLAG_SHOW_WHEN_LOCKED) != 0; Loading Loading @@ -3626,10 +3626,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final WindowContainer<?> trigger = endTask ? task : this; final Transition newTransition = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransition != null) { newTransition.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); final Transition transition = newTransition != null ? newTransition : mTransitionController.getCollectingTransition(); if (transition != null) { transition.collectClose(trigger); } if (isState(RESUMED)) { if (endTask) { Loading Loading @@ -4302,9 +4302,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // closing the task. final WindowContainer trigger = remove && task != null && task.getChildCount() == 1 ? task : this; final Transition newTransit = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransit != null) { newTransit.collectClose(trigger); final Transition tr = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (tr != null) { tr.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } Loading Loading @@ -5320,12 +5320,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A task.lastDescription = description; } void setDeferHidingClient(boolean deferHidingClient) { if (mDeferHidingClient == deferHidingClient) { return; void setDeferHidingClient() { mDeferHidingClient = true; } mDeferHidingClient = deferHidingClient; if (!mDeferHidingClient && !mVisibleRequested) { void clearDeferHidingClient() { if (!mDeferHidingClient) return; mDeferHidingClient = false; if (!mVisibleRequested) { // Hiding the client is no longer deferred and the app isn't visible still, go ahead and // update the visibility. setVisibility(false); Loading Loading @@ -5449,8 +5451,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A boolean isCollecting = false; boolean inFinishingTransition = false; if (mTransitionController.isShellTransitionsEnabled()) { isCollecting = mTransitionController.isCollecting(); if (isCollecting) { if (mTransitionController.isCollecting()) { isCollecting = true; mTransitionController.collect(this); } else { // Failsafe to make sure that we show any activities that were incorrectly hidden Loading Loading @@ -6195,7 +6197,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // stopped or stopping. This gives it a chance to enter Pip in onPause(). final boolean deferHidingClient = canEnterPictureInPicture && !isState(STARTED, STOPPING, STOPPED, PAUSED); setDeferHidingClient(deferHidingClient); if (deferHidingClient) { setDeferHidingClient(); } else { clearDeferHidingClient(); } setVisibility(false); switch (getState()) { Loading Loading @@ -6234,7 +6240,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A Slog.v(TAG_VISIBILITY, "Resume visible activity, " + this); } return getRootTask().resumeTopActivityUncheckedLocked(activeActivity /* prev */, null /* options */); null /* options */, false /* skipPause */); } else if (shouldPauseActivity(activeActivity)) { if (DEBUG_VISIBILITY) { Slog.v(TAG_VISIBILITY, "Pause visible activity, " + this); Loading Loading @@ -6524,9 +6530,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void stopIfPossible() { if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Stopping: " + this); if (finishing) { Slog.e(TAG, "Request to stop a finishing activity: " + this); destroyIfPossible("stopIfPossible-finishing"); return; throw new IllegalStateException("Request to stop a finishing activity: " + this); } if (isNoHistory()) { if (!task.shouldSleepActivities()) { Loading services/core/java/com/android/server/wm/ActivityStartController.java +2 −3 Original line number Diff line number Diff line Loading @@ -612,11 +612,10 @@ public class ActivityStartController { final Task task = r.getTask(); mService.deferWindowLayout(); try { final TransitionController controller = r.mTransitionController; final Transition transition = controller.getCollectingTransition(); final Transition transition = r.mTransitionController.getCollectingTransition(); if (transition != null) { transition.setRemoteAnimationApp(r.app.getThread()); controller.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); transition.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); } task.moveToFront("startExistingRecents"); task.mInResumeTopActivity = true; Loading services/core/java/com/android/server/wm/ActivityStarter.java +42 −33 Original line number Diff line number Diff line Loading @@ -1355,9 +1355,21 @@ class ActivityStarter { mService.resumeAppSwitches(); } // Only do the create here since startActivityInner can abort. If it doesn't abort, // the requestStart will be sent in handleStartRequest. final Transition newTransition = r.mTransitionController.isShellTransitionsEnabled() ? r.mTransitionController.createAndStartCollecting(TRANSIT_OPEN) : null; // Because startActivity must run immediately, it can get combined with another // transition meaning it is no-longer independent. This is NOT desirable, but is the // only option for the time being. final boolean isIndependent = newTransition != null; final Transition transition = isIndependent ? newTransition : mService.getTransitionController().getCollectingTransition(); mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, request.voiceInteractor, startFlags, checkedOptions, inTask, inTaskFragment, balVerdict, intentGrants, realCallingUid); inTask, inTaskFragment, balVerdict, intentGrants, realCallingUid, transition, isIndependent); if (request.outActivity != null) { request.outActivity[0] = mLastStartActivityRecord; Loading Loading @@ -1509,33 +1521,27 @@ class ActivityStarter { int startFlags, ActivityOptions options, Task inTask, TaskFragment inTaskFragment, BalVerdict balVerdict, NeededUriGrants intentGrants, int realCallingUid) { NeededUriGrants intentGrants, int realCallingUid, Transition transition, boolean isIndependentLaunch) { int result = START_CANCELED; final Task startedActivityRootTask; // Create a transition now to record the original intent of actions taken within // startActivityInner. Otherwise, logic in startActivityInner could start a different // transition based on a sub-action. // Only do the create here (and defer requestStart) since startActivityInner might abort. final TransitionController transitionController = r.mTransitionController; Transition newTransition = transitionController.isShellTransitionsEnabled() ? transitionController.createAndStartCollecting(TRANSIT_OPEN) : null; RemoteTransition remoteTransition = r.takeRemoteTransition(); // Create a display snapshot as soon as possible. if (newTransition != null && mRequest.freezeScreen) { if (isIndependentLaunch && mRequest.freezeScreen) { final TaskDisplayArea tda = mLaunchParams.hasPreferredTaskDisplayArea() ? mLaunchParams.mPreferredTaskDisplayArea : mRootWindowContainer.getDefaultTaskDisplayArea(); final DisplayContent dc = mRootWindowContainer.getDisplayContentOrCreate( tda.getDisplayId()); if (dc != null) { transitionController.collect(dc); transitionController.collectVisibleChange(dc); transition.collect(dc); transition.collectVisibleChange(dc); } } try { mService.deferWindowLayout(); transitionController.collect(r); r.mTransitionController.collect(r); try { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner"); result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, Loading @@ -1545,8 +1551,8 @@ class ActivityStarter { Slog.e(TAG, "Exception on startActivityInner", ex); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); startedActivityRootTask = handleStartResult(r, options, result, newTransition, remoteTransition); startedActivityRootTask = handleStartResult(r, options, result, isIndependentLaunch, remoteTransition, transition); } } finally { mService.continueWindowLayout(); Loading @@ -1571,8 +1577,8 @@ class ActivityStarter { * @return the root task where the successful started activity resides. */ private @Nullable Task handleStartResult(@NonNull ActivityRecord started, ActivityOptions options, int result, Transition newTransition, RemoteTransition remoteTransition) { ActivityOptions options, int result, boolean isIndependentLaunch, RemoteTransition remoteTransition, @NonNull Transition transition) { final boolean userLeaving = mSupervisor.mUserLeaving; mSupervisor.mUserLeaving = false; final Task currentRootTask = started.getRootTask(); Loading @@ -1596,8 +1602,9 @@ class ActivityStarter { && !startedActivityRootTask.mCreatedByOrganizer) { startedActivityRootTask.removeIfPossible("handleStartResult"); } if (newTransition != null) { newTransition.abort(); if (isIndependentLaunch && mService.getTransitionController().isShellTransitionsEnabled()) { transition.abort(); } return null; } Loading Loading @@ -1649,44 +1656,46 @@ class ActivityStarter { // The activity is started new rather than just brought forward, so record it as an // existence change. transitionController.collectExistenceChange(started); } else if (result == START_DELIVERED_TO_TOP && newTransition != null } else if (result == START_DELIVERED_TO_TOP && isIndependentLaunch // An activity has changed order/visibility or the task is occluded by a transient // activity, so this isn't just deliver-to-top && mMovedToTopActivity == null && !transitionController.hasOrderChanges() && !transitionController.isTransientHide(startedActivityRootTask) && !newTransition.hasChanged(mLastStartActivityRecord)) { && !transition.hasChanged(mLastStartActivityRecord)) { // We just delivered to top, so there isn't an actual transition here. if (!forceTransientTransition) { newTransition.abort(); newTransition = null; transition.abort(); transition = null; } } if (forceTransientTransition) { transitionController.collect(mLastStartActivityRecord); transitionController.collect(mPriorAboveTask); if (forceTransientTransition && transition != null) { transition.collect(mLastStartActivityRecord); transition.collect(mPriorAboveTask); // If keyguard is active and occluded, the transient target won't be moved to front // to be collected, so set transient again after it is collected. transitionController.setTransientLaunch(mLastStartActivityRecord, mPriorAboveTask); transition.setTransientLaunch(mLastStartActivityRecord, mPriorAboveTask); final DisplayContent dc = mLastStartActivityRecord.getDisplayContent(); // update wallpaper target to TransientHide dc.mWallpaperController.adjustWallpaperWindows(); // execute transition because there is no change transitionController.setReady(dc, true /* ready */); transition.setReady(dc, true /* ready */); } if (!userLeaving) { if (!userLeaving && transition != null) { // no-user-leaving implies not entering PiP. transitionController.setCanPipOnFinish(false /* canPipOnFinish */); transition.setCanPipOnFinish(false /* canPipOnFinish */); } if (newTransition != null) { transitionController.requestStartTransition(newTransition, if (isIndependentLaunch && transition != null) { transitionController.requestStartTransition(transition, mTargetTask == null ? started.getTask() : mTargetTask, remoteTransition, null /* displayChange */); } else if (result == START_SUCCESS && mStartActivity.isState(RESUMED)) { // Do nothing if the activity is started and is resumed directly. } else if (isStarted) { // Make the collecting transition wait until this request is ready. transitionController.setReady(started, false); if (transition != null) { transition.setReady(started, false); } } return startedActivityRootTask; } Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +10 −7 Original line number Diff line number Diff line Loading @@ -2116,17 +2116,20 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Slog.w(TAG, "removeTask: No task remove with id=" + taskId); return false; } removeTask(task); return true; } finally { Binder.restoreCallingIdentity(ident); } } } void removeTask(@NonNull Task task) { if (task.isLeafTask()) { mTaskSupervisor.removeTask(task, true, REMOVE_FROM_RECENTS, "remove-task"); } else { mTaskSupervisor.removeRootTask(task); } return true; } finally { Binder.restoreCallingIdentity(ident); } } } @Override Loading Loading @@ -2938,7 +2941,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } getTransitionController().requestStartTransition(transition, task, null /* remoteTransition */, null /* displayChange */); getTransitionController().collect(task); transition.collect(task); task.resize(bounds, resizeMode, preserveWindow); transition.setReady(task, true); }); Loading Loading
services/core/java/com/android/server/wm/ActivityClientController.java +6 −7 Original line number Diff line number Diff line Loading @@ -1156,7 +1156,7 @@ class ActivityClientController extends IActivityClientController.Stub { } if (rootTask.inFreeformWindowingMode()) { rootTask.setWindowingMode(WINDOWING_MODE_FULLSCREEN); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_FULLSCREEN); rootTask.setBounds(null); } else if (!r.supportsFreeform()) { throw new IllegalStateException( Loading @@ -1165,9 +1165,9 @@ class ActivityClientController extends IActivityClientController.Stub { // If the window is on a freeform display, set it to undefined. It will be // resolved to freeform and it can adjust windowing mode when the display mode // changes in runtime. rootTask.setWindowingMode(WINDOWING_MODE_UNDEFINED); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_UNDEFINED); } else { rootTask.setWindowingMode(WINDOWING_MODE_FREEFORM); rootTask.setRootTaskWindowingMode(WINDOWING_MODE_FREEFORM); } } } finally { Loading Loading @@ -1278,7 +1278,7 @@ class ActivityClientController extends IActivityClientController.Stub { if (fullscreenRequest == FULLSCREEN_MODE_REQUEST_ENTER) { final int restoreWindowingMode = requester.getRequestedOverrideWindowingMode(); targetWindowingMode = WINDOWING_MODE_FULLSCREEN; requester.setWindowingMode(targetWindowingMode); requester.setRootTaskWindowingMode(targetWindowingMode); // The restore windowing mode must be set after the windowing mode is set since // Task#setWindowingMode resets the restore windowing mode to WINDOWING_MODE_INVALID. requester.mMultiWindowRestoreWindowingMode = restoreWindowingMode; Loading @@ -1297,11 +1297,10 @@ class ActivityClientController extends IActivityClientController.Stub { public void startLockTaskModeByToken(IBinder token) { synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.forTokenLocked(token); if (r != null) { if (r == null) return; mService.startLockTaskMode(r.getTask(), false /* isSystemCaller */); } } } @Override public void stopLockTaskModeByToken(IBinder token) { Loading
services/core/java/com/android/server/wm/ActivityRecord.java +25 −21 Original line number Diff line number Diff line Loading @@ -2016,7 +2016,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mIsUserAlwaysVisible = properties != null && properties.getAlwaysVisible(); mShowForAllUsers = (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0 || mIsUserAlwaysVisible; setOrientation(info.screenOrientation); setOverrideOrientation(info.screenOrientation); mRotationAnimationHint = info.rotationAnimation; mShowWhenLocked = (aInfo.flags & ActivityInfo.FLAG_SHOW_WHEN_LOCKED) != 0; Loading Loading @@ -3626,10 +3626,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final WindowContainer<?> trigger = endTask ? task : this; final Transition newTransition = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransition != null) { newTransition.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); final Transition transition = newTransition != null ? newTransition : mTransitionController.getCollectingTransition(); if (transition != null) { transition.collectClose(trigger); } if (isState(RESUMED)) { if (endTask) { Loading Loading @@ -4302,9 +4302,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // closing the task. final WindowContainer trigger = remove && task != null && task.getChildCount() == 1 ? task : this; final Transition newTransit = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (newTransit != null) { newTransit.collectClose(trigger); final Transition tr = mTransitionController.requestCloseTransitionIfNeeded(trigger); if (tr != null) { tr.collectClose(trigger); } else if (mTransitionController.isCollecting()) { mTransitionController.getCollectingTransition().collectClose(trigger); } Loading Loading @@ -5320,12 +5320,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A task.lastDescription = description; } void setDeferHidingClient(boolean deferHidingClient) { if (mDeferHidingClient == deferHidingClient) { return; void setDeferHidingClient() { mDeferHidingClient = true; } mDeferHidingClient = deferHidingClient; if (!mDeferHidingClient && !mVisibleRequested) { void clearDeferHidingClient() { if (!mDeferHidingClient) return; mDeferHidingClient = false; if (!mVisibleRequested) { // Hiding the client is no longer deferred and the app isn't visible still, go ahead and // update the visibility. setVisibility(false); Loading Loading @@ -5449,8 +5451,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A boolean isCollecting = false; boolean inFinishingTransition = false; if (mTransitionController.isShellTransitionsEnabled()) { isCollecting = mTransitionController.isCollecting(); if (isCollecting) { if (mTransitionController.isCollecting()) { isCollecting = true; mTransitionController.collect(this); } else { // Failsafe to make sure that we show any activities that were incorrectly hidden Loading Loading @@ -6195,7 +6197,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // stopped or stopping. This gives it a chance to enter Pip in onPause(). final boolean deferHidingClient = canEnterPictureInPicture && !isState(STARTED, STOPPING, STOPPED, PAUSED); setDeferHidingClient(deferHidingClient); if (deferHidingClient) { setDeferHidingClient(); } else { clearDeferHidingClient(); } setVisibility(false); switch (getState()) { Loading Loading @@ -6234,7 +6240,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A Slog.v(TAG_VISIBILITY, "Resume visible activity, " + this); } return getRootTask().resumeTopActivityUncheckedLocked(activeActivity /* prev */, null /* options */); null /* options */, false /* skipPause */); } else if (shouldPauseActivity(activeActivity)) { if (DEBUG_VISIBILITY) { Slog.v(TAG_VISIBILITY, "Pause visible activity, " + this); Loading Loading @@ -6524,9 +6530,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void stopIfPossible() { if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Stopping: " + this); if (finishing) { Slog.e(TAG, "Request to stop a finishing activity: " + this); destroyIfPossible("stopIfPossible-finishing"); return; throw new IllegalStateException("Request to stop a finishing activity: " + this); } if (isNoHistory()) { if (!task.shouldSleepActivities()) { Loading
services/core/java/com/android/server/wm/ActivityStartController.java +2 −3 Original line number Diff line number Diff line Loading @@ -612,11 +612,10 @@ public class ActivityStartController { final Task task = r.getTask(); mService.deferWindowLayout(); try { final TransitionController controller = r.mTransitionController; final Transition transition = controller.getCollectingTransition(); final Transition transition = r.mTransitionController.getCollectingTransition(); if (transition != null) { transition.setRemoteAnimationApp(r.app.getThread()); controller.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); transition.setTransientLaunch(r, TaskDisplayArea.getRootTaskAbove(rootTask)); } task.moveToFront("startExistingRecents"); task.mInResumeTopActivity = true; Loading
services/core/java/com/android/server/wm/ActivityStarter.java +42 −33 Original line number Diff line number Diff line Loading @@ -1355,9 +1355,21 @@ class ActivityStarter { mService.resumeAppSwitches(); } // Only do the create here since startActivityInner can abort. If it doesn't abort, // the requestStart will be sent in handleStartRequest. final Transition newTransition = r.mTransitionController.isShellTransitionsEnabled() ? r.mTransitionController.createAndStartCollecting(TRANSIT_OPEN) : null; // Because startActivity must run immediately, it can get combined with another // transition meaning it is no-longer independent. This is NOT desirable, but is the // only option for the time being. final boolean isIndependent = newTransition != null; final Transition transition = isIndependent ? newTransition : mService.getTransitionController().getCollectingTransition(); mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, request.voiceInteractor, startFlags, checkedOptions, inTask, inTaskFragment, balVerdict, intentGrants, realCallingUid); inTask, inTaskFragment, balVerdict, intentGrants, realCallingUid, transition, isIndependent); if (request.outActivity != null) { request.outActivity[0] = mLastStartActivityRecord; Loading Loading @@ -1509,33 +1521,27 @@ class ActivityStarter { int startFlags, ActivityOptions options, Task inTask, TaskFragment inTaskFragment, BalVerdict balVerdict, NeededUriGrants intentGrants, int realCallingUid) { NeededUriGrants intentGrants, int realCallingUid, Transition transition, boolean isIndependentLaunch) { int result = START_CANCELED; final Task startedActivityRootTask; // Create a transition now to record the original intent of actions taken within // startActivityInner. Otherwise, logic in startActivityInner could start a different // transition based on a sub-action. // Only do the create here (and defer requestStart) since startActivityInner might abort. final TransitionController transitionController = r.mTransitionController; Transition newTransition = transitionController.isShellTransitionsEnabled() ? transitionController.createAndStartCollecting(TRANSIT_OPEN) : null; RemoteTransition remoteTransition = r.takeRemoteTransition(); // Create a display snapshot as soon as possible. if (newTransition != null && mRequest.freezeScreen) { if (isIndependentLaunch && mRequest.freezeScreen) { final TaskDisplayArea tda = mLaunchParams.hasPreferredTaskDisplayArea() ? mLaunchParams.mPreferredTaskDisplayArea : mRootWindowContainer.getDefaultTaskDisplayArea(); final DisplayContent dc = mRootWindowContainer.getDisplayContentOrCreate( tda.getDisplayId()); if (dc != null) { transitionController.collect(dc); transitionController.collectVisibleChange(dc); transition.collect(dc); transition.collectVisibleChange(dc); } } try { mService.deferWindowLayout(); transitionController.collect(r); r.mTransitionController.collect(r); try { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner"); result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, Loading @@ -1545,8 +1551,8 @@ class ActivityStarter { Slog.e(TAG, "Exception on startActivityInner", ex); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); startedActivityRootTask = handleStartResult(r, options, result, newTransition, remoteTransition); startedActivityRootTask = handleStartResult(r, options, result, isIndependentLaunch, remoteTransition, transition); } } finally { mService.continueWindowLayout(); Loading @@ -1571,8 +1577,8 @@ class ActivityStarter { * @return the root task where the successful started activity resides. */ private @Nullable Task handleStartResult(@NonNull ActivityRecord started, ActivityOptions options, int result, Transition newTransition, RemoteTransition remoteTransition) { ActivityOptions options, int result, boolean isIndependentLaunch, RemoteTransition remoteTransition, @NonNull Transition transition) { final boolean userLeaving = mSupervisor.mUserLeaving; mSupervisor.mUserLeaving = false; final Task currentRootTask = started.getRootTask(); Loading @@ -1596,8 +1602,9 @@ class ActivityStarter { && !startedActivityRootTask.mCreatedByOrganizer) { startedActivityRootTask.removeIfPossible("handleStartResult"); } if (newTransition != null) { newTransition.abort(); if (isIndependentLaunch && mService.getTransitionController().isShellTransitionsEnabled()) { transition.abort(); } return null; } Loading Loading @@ -1649,44 +1656,46 @@ class ActivityStarter { // The activity is started new rather than just brought forward, so record it as an // existence change. transitionController.collectExistenceChange(started); } else if (result == START_DELIVERED_TO_TOP && newTransition != null } else if (result == START_DELIVERED_TO_TOP && isIndependentLaunch // An activity has changed order/visibility or the task is occluded by a transient // activity, so this isn't just deliver-to-top && mMovedToTopActivity == null && !transitionController.hasOrderChanges() && !transitionController.isTransientHide(startedActivityRootTask) && !newTransition.hasChanged(mLastStartActivityRecord)) { && !transition.hasChanged(mLastStartActivityRecord)) { // We just delivered to top, so there isn't an actual transition here. if (!forceTransientTransition) { newTransition.abort(); newTransition = null; transition.abort(); transition = null; } } if (forceTransientTransition) { transitionController.collect(mLastStartActivityRecord); transitionController.collect(mPriorAboveTask); if (forceTransientTransition && transition != null) { transition.collect(mLastStartActivityRecord); transition.collect(mPriorAboveTask); // If keyguard is active and occluded, the transient target won't be moved to front // to be collected, so set transient again after it is collected. transitionController.setTransientLaunch(mLastStartActivityRecord, mPriorAboveTask); transition.setTransientLaunch(mLastStartActivityRecord, mPriorAboveTask); final DisplayContent dc = mLastStartActivityRecord.getDisplayContent(); // update wallpaper target to TransientHide dc.mWallpaperController.adjustWallpaperWindows(); // execute transition because there is no change transitionController.setReady(dc, true /* ready */); transition.setReady(dc, true /* ready */); } if (!userLeaving) { if (!userLeaving && transition != null) { // no-user-leaving implies not entering PiP. transitionController.setCanPipOnFinish(false /* canPipOnFinish */); transition.setCanPipOnFinish(false /* canPipOnFinish */); } if (newTransition != null) { transitionController.requestStartTransition(newTransition, if (isIndependentLaunch && transition != null) { transitionController.requestStartTransition(transition, mTargetTask == null ? started.getTask() : mTargetTask, remoteTransition, null /* displayChange */); } else if (result == START_SUCCESS && mStartActivity.isState(RESUMED)) { // Do nothing if the activity is started and is resumed directly. } else if (isStarted) { // Make the collecting transition wait until this request is ready. transitionController.setReady(started, false); if (transition != null) { transition.setReady(started, false); } } return startedActivityRootTask; } Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +10 −7 Original line number Diff line number Diff line Loading @@ -2116,17 +2116,20 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Slog.w(TAG, "removeTask: No task remove with id=" + taskId); return false; } removeTask(task); return true; } finally { Binder.restoreCallingIdentity(ident); } } } void removeTask(@NonNull Task task) { if (task.isLeafTask()) { mTaskSupervisor.removeTask(task, true, REMOVE_FROM_RECENTS, "remove-task"); } else { mTaskSupervisor.removeRootTask(task); } return true; } finally { Binder.restoreCallingIdentity(ident); } } } @Override Loading Loading @@ -2938,7 +2941,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } getTransitionController().requestStartTransition(transition, task, null /* remoteTransition */, null /* displayChange */); getTransitionController().collect(task); transition.collect(task); task.resize(bounds, resizeMode, preserveWindow); transition.setReady(task, true); }); Loading