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

Commit 5b49e719 authored by Thales Lima's avatar Thales Lima Committed by Android Build Coastguard Worker
Browse files

Combine LockTask transition with previous

Combine the transition that exists with a new transition that start
LockTask, to make sure that any issue from starting it is caught as part
of the previous transition.

Bug: 442319823
Test: m
Flag: EXEMPT BUGFIX
Cherrypick-From: https://googleplex-android-review.googlesource.com/q/commit:a1af0fb80811df3c334cd11f94224a799fb6e97d
Merged-In: I4c27eadb55b466244fb992792cad98f6ca62bdb4
Change-Id: I4c27eadb55b466244fb992792cad98f6ca62bdb4
parent 2a3b0287
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -1444,22 +1444,28 @@ class ActivityClientController extends IActivityClientController.Stub {
            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,

                if (!mService.canEnterLockTaskMode(task) || !mService.isTopMostTask(task)) {
                    Slog.w(TAG, "startLockTaskMode: Can't lock due to auth, task: " + task);
                    throw new IllegalArgumentException(
                            "startLockTaskMode: Can't lock due to auth, task: " + task);
                }
                ActionChain chain = mService.mChainTracker.startTransit("startLockTaskModeByToken");
                Transition newTransition = chain.isCollecting() ? null : 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,
                if (newTransition != null) {
                    mService.getTransitionController().requestStartTransition(newTransition,
                            task,
                            null /* remoteTransition */, null /* displayChange */);
                }
                chain.collect(task);
                mService.startLockTaskMode(task, false /* isSystemCaller */);
                            transition.setReady(task, true);
                if (newTransition != null) {
                    newTransition.setReady(task, true);
                }
                mService.mChainTracker.end();
                        });
            } else {
                mService.startLockTaskMode(r.getTask(), false /* isSystemCaller */);
            }
+20 −0
Original line number Diff line number Diff line
@@ -2696,11 +2696,20 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                }
                if (DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue()
                        && getTransitionController().isShellTransitionsEnabled()) {
                    if (!canEnterLockTaskMode(task)) {
                        Slog.w(TAG, "startLockTaskMode: Can't lock due to auth");
                        return;
                    }
                    final Transition transition = new Transition(TRANSIT_START_LOCK_TASK_MODE,
                            0 /* flags */,
                            getTransitionController(), mWindowManager.mSyncEngine);
                    getTransitionController().startCollectOrQueue(transition,
                            (deferred) -> {
                                if (deferred && !task.isAttached()) {
                                    Slog.w(TAG, "startLockTaskMode aborted: the task is removed.");
                                    transition.abort();
                                    return;
                                }
                                final ActionChain chain = mChainTracker.start(
                                        "startSystemLockTaskMOde",
                                        transition);
@@ -2789,6 +2798,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }
    }

    /** @return either a task can enter LockTask mode or not. */
    public boolean canEnterLockTaskMode(Task task) {
        return task.isAttached() && task.mLockTaskAuth != LOCK_TASK_AUTH_DONT_LOCK;
    }

    /** @return either a task is the top most or not. */
    public boolean isTopMostTask(Task task) {
        final Task rootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
        return rootTask != null && task == rootTask.getTopMostTask();
    }

    @Override
    public void updateLockTaskPackages(int userId, String[] packages) {
        final int callingUid = Binder.getCallingUid();