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

Commit 537a8c04 authored by Jerry Chang's avatar Jerry Chang Committed by Wale Ogunwale
Browse files

Dismiss stage split when unlock after folded

Dismiss stage split to the last focused stage when unlocking after
folded.

Bug: 184795546
Test: enter split and fold the device, observe it dismisses to the
      proper stage after unlocked the device.
Test: enter split after folded, unlock whon't dismiss split.

Change-Id: I6abbf63c1675d612811c47b1c42f337607fb65fd
parent afc96fda
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -81,6 +81,12 @@ public interface SplitScreen {
     */
    void onKeyguardOccludedChanged(boolean occluded);

    /**
     * Called when the visibility of the keyguard changes.
     * @param showing Indicates if the keyguard is now visible.
     */
    void onKeyguardVisibilityChanged(boolean showing);

    /** Get a string representation of a stage type */
    static String stageTypeToString(@StageType int stage) {
        switch (stage) {
+11 −0
Original line number Diff line number Diff line
@@ -172,6 +172,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        mStageCoordinator.onKeyguardOccludedChanged(occluded);
    }

    public void onKeyguardVisibilityChanged(boolean showing) {
        mStageCoordinator.onKeyguardVisibilityChanged(showing);
    }

    public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) {
        mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide);
    }
@@ -371,6 +375,13 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
                }
            });
        }

        @Override
        public void onKeyguardVisibilityChanged(boolean showing) {
            mMainExecutor.execute(() -> {
                SplitScreenController.this.onKeyguardVisibilityChanged(showing);
            });
        }
    }

    /**
+19 −3
Original line number Diff line number Diff line
@@ -136,7 +136,10 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    /** Whether the device is supporting legacy split or not. */
    private boolean mUseLegacySplit;

    @SplitScreen.StageType int mDismissTop = NO_DISMISS;
    @SplitScreen.StageType private int mDismissTop = NO_DISMISS;

    /** The target stage to dismiss to when unlock after folded. */
    @SplitScreen.StageType private int mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED;

    private final Runnable mOnTransitionAnimationComplete = () -> {
        // If still playing, let it finish.
@@ -443,6 +446,13 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mKeyguardOccluded = occluded;
    }

    void onKeyguardVisibilityChanged(boolean showing) {
        if (!showing && mMainStage.isActive()
                && mTopStageAfterFoldDismiss != STAGE_TYPE_UNDEFINED) {
            exitSplitScreen(mTopStageAfterFoldDismiss == STAGE_TYPE_MAIN ? mMainStage : mSideStage);
        }
    }

    void exitSplitScreen() {
        exitSplitScreen(null /* childrenToTop */);
    }
@@ -458,6 +468,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mTaskOrganizer.applyTransaction(wct);
        // Reset divider position.
        mSplitLayout.resetDividerPosition();
        mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED;
    }

    /**
@@ -808,8 +819,13 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    }

    private void onFoldedStateChanged(boolean folded) {
        if (folded && mMainStage.isActive()) {
            exitSplitScreen(mMainStage);
        mTopStageAfterFoldDismiss = STAGE_TYPE_UNDEFINED;
        if (!folded) return;

        if (mMainStage.isFocused()) {
            mTopStageAfterFoldDismiss = STAGE_TYPE_MAIN;
        } else if (mSideStage.isFocused()) {
            mTopStageAfterFoldDismiss = STAGE_TYPE_SIDE;
        }
    }

+9 −0
Original line number Diff line number Diff line
@@ -97,6 +97,15 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
        return mChildrenTaskInfo.contains(taskId);
    }

    /** @return {@code true} if this listener contains the currently focused task. */
    boolean isFocused() {
        if (mRootTaskInfo.isFocused) return true;
        for (int i = mChildrenTaskInfo.size() - 1; i >= 0; --i) {
            if (mChildrenTaskInfo.valueAt(i).isFocused) return true;
        }
        return false;
    }

    @Override
    @CallSuper
    public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
+5 −0
Original line number Diff line number Diff line
@@ -241,6 +241,11 @@ public final class WMShell extends SystemUI
    @VisibleForTesting
    void initSplitScreen(SplitScreen splitScreen) {
        mSplitScreenKeyguardCallback = new KeyguardUpdateMonitorCallback() {
            @Override
            public void onKeyguardVisibilityChanged(boolean showing) {
                splitScreen.onKeyguardVisibilityChanged(showing);
            }

            @Override
            public void onKeyguardOccludedChanged(boolean occluded) {
                splitScreen.onKeyguardOccludedChanged(occluded);