Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b7b15c8 authored by Orhan Uysal's avatar Orhan Uysal
Browse files

Add a new transition type for lock task mode

Add TRANSIT_START_LOCK_TASK_MODE to be used when starting lock task
mode. This allows shell to identify when a lock task mode is happening
and add any presentation changes.

Bug: 402443859
Test: Manual using TestDPC
Flag: com.android.window.flags.enable_desktop_windowing_enterprise_bugfix
Change-Id: Ic9356e707d500939b8071cfa8df760d37ad32e7b
parent f6ad5c42
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -398,6 +398,11 @@ public interface WindowManager extends ViewManager {
     * @hide
     */
    int TRANSIT_CLOSE_PREPARE_BACK_NAVIGATION = 14;
    /**
     * Lock task mode is starting.
     * @hide
     */
    int TRANSIT_START_LOCK_TASK_MODE = 15;

    /**
     * The first slot for custom transition types. Callers (like Shell) can make use of custom
@@ -429,6 +434,7 @@ public interface WindowManager extends ViewManager {
            TRANSIT_SLEEP,
            TRANSIT_PREPARE_BACK_NAVIGATION,
            TRANSIT_CLOSE_PREPARE_BACK_NAVIGATION,
            TRANSIT_START_LOCK_TASK_MODE,
            TRANSIT_FIRST_CUSTOM
    })
    @Retention(RetentionPolicy.SOURCE)
+25 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICAT
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_START_LOCK_TASK_MODE;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;

@@ -97,6 +98,7 @@ import android.os.UserHandle;
import android.service.voice.VoiceInteractionManagerInternal;
import android.util.Slog;
import android.view.RemoteAnimationDefinition;
import android.window.DesktopExperienceFlags;
import android.window.DesktopModeFlags;
import android.window.SizeConfigurationBuckets;
import android.window.TransitionInfo;
@@ -1415,9 +1417,31 @@ class ActivityClientController extends IActivityClientController.Stub {
        synchronized (mGlobalLock) {
            final ActivityRecord r = ActivityRecord.forTokenLocked(token);
            if (r == null) return;

            if (DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue()
                    && mService.getTransitionController().isShellTransitionsEnabled()) {
                final Task task = r.getTask();
                final Transition transition = new Transition(TRANSIT_START_LOCK_TASK_MODE,
                        0 /* flags */,
                        mService.getTransitionController(), mService.mWindowManager.mSyncEngine);
                mService.getTransitionController().startCollectOrQueue(transition,
                        (deferred) -> {
                            final ActionChain chain = mService.mChainTracker.start(
                                    "startLockTaskModeByToken",
                                    transition);
                            mService.getTransitionController().requestStartTransition(transition,
                                    task,
                                    null /* remoteTransition */, null /* displayChange */);
                            chain.collect(task);
                            mService.startLockTaskMode(task, false /* isSystemCaller */);
                            transition.setReady(task, true);
                            mService.mChainTracker.end();
                        });
            } else {
                mService.startLockTaskMode(r.getTask(), false /* isSystemCaller */);
            }
        }
    }

    @Override
    public void stopLockTaskModeByToken(IBinder token) {
+26 −4
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_PIP;
import static android.view.WindowManager.TRANSIT_START_LOCK_TASK_MODE;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT;
import static android.window.DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_PIP;
@@ -252,6 +253,7 @@ import android.view.RemoteAnimationDefinition;
import android.view.WindowManager;
import android.window.BackAnimationAdapter;
import android.window.BackNavigationInfo;
import android.window.DesktopExperienceFlags;
import android.window.ITaskSnapshotManager;
import android.window.IWindowOrganizerController;
import android.window.SplashScreenView.SplashScreenViewParcelable;
@@ -2681,10 +2683,30 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                if (task == null) {
                    return;
                }

                // When starting lock task mode the root task must be in front and focused
                if (DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue()
                        && getTransitionController().isShellTransitionsEnabled()) {
                    final Transition transition = new Transition(TRANSIT_START_LOCK_TASK_MODE,
                            0 /* flags */,
                            getTransitionController(), mWindowManager.mSyncEngine);
                    getTransitionController().startCollectOrQueue(transition,
                            (deferred) -> {
                                final ActionChain chain = mChainTracker.start(
                                        "startSystemLockTaskMOde",
                                        transition);
                                getTransitionController().requestStartTransition(transition, task,
                                        null /* remoteTransition */, null /* displayChange */);
                                chain.collect(task);
                                // When starting lock task mode the root task must be in front
                                // and focused
                                task.getRootTask().moveToFront("startSystemLockTaskMode");
                                startLockTaskMode(task, true /* isSystemCaller */);
                                transition.setReady(task, true);
                                mChainTracker.end();
                            });
                } else {
                    task.getRootTask().moveToFront("startSystemLockTaskMode");
                    startLockTaskMode(task, true /* isSystemCaller */);
                }
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
+27 −2
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import static android.os.Process.SYSTEM_UID;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.TRANSIT_START_LOCK_TASK_MODE;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;

@@ -903,7 +904,31 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
                    || (task.mLockTaskAuth == LOCK_TASK_AUTH_ALLOWLISTED
                            && lockTaskController.getLockTaskModeState()
                    == LOCK_TASK_MODE_LOCKED)) {
                lockTaskController.startLockTaskMode(task, false, 0 /* blank UID */);

                if (DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue()
                        && task.mTransitionController.isShellTransitionsEnabled()) {
                    final Transition transition = new Transition(TRANSIT_START_LOCK_TASK_MODE,
                            0 /* flags */,
                            task.mTransitionController, mWindowManager.mSyncEngine);
                    task.mTransitionController.startCollectOrQueue(transition,
                            (deferred) -> {
                                final ActionChain chain = mService.mChainTracker.start(
                                        "realStartActivity",
                                        transition);
                                task.mTransitionController.requestStartTransition(transition, task,
                                        null /* remoteTransition */, null /* displayChange */);
                                chain.collect(task);
                                // When starting lock task mode the root task must be in front and
                                // focused
                                lockTaskController.startLockTaskMode(task, false,
                                        0 /* blank UID */);
                                transition.setReady(task, true);
                                mService.mChainTracker.end();
                            });
                } else {
                    lockTaskController.startLockTaskMode(task, false,
                            0 /* blank UID */);
                }
            }

            final RemoteException e = tryRealStartActivityInner(
+1 −2
Original line number Diff line number Diff line
@@ -677,7 +677,6 @@ public class LockTaskController {
                stopLockTaskMode(/* task= */ null, /* stopAppPinning= */ true, callingUid);
            }
        }

        // When a task is locked, dismiss the root pinned task if it exists
        mSupervisor.mRootWindowContainer.removeRootTasksInWindowingModes(WINDOWING_MODE_PINNED);