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

Commit 543c36e7 authored by Tony Huang's avatar Tony Huang Committed by Android (Google) Code Review
Browse files

Merge "Fix rotation bounds on devices have cut-out"

parents 44333411 75bd8447
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        mDividerWindowWidth = mDividerSize + 2 * mDividerInsets;

        mRootBounds.set(configuration.windowConfiguration.getBounds());
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, null);
        resetDividerPosition();
    }

@@ -201,7 +201,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        mTempRect.set(mRootBounds);
        mRootBounds.set(rootBounds);
        mRotation = rotation;
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, null);
        initDividerPosition(mTempRect);

        if (mInitialized) {
@@ -212,8 +212,9 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        return true;
    }

    /** Rotate the layout to specific rotation and assume its new bounds. */
    public void rotateTo(int newRotation) {
    /** Rotate the layout to specific rotation and calculate new bounds. The stable insets value
     *  should be calculated by display layout. */
    public void rotateTo(int newRotation, Rect stableInsets) {
        final int rotationDelta = (newRotation - mRotation + 4) % 4;
        final boolean changeOrient = (rotationDelta % 2) != 0;

@@ -223,11 +224,11 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
            tmpRect.set(mRootBounds.top, mRootBounds.left, mRootBounds.bottom, mRootBounds.right);
        }

        final Configuration config = new Configuration();
        config.setTo(mContext.getResources().getConfiguration());
        config.orientation = mOrientation;
        config.windowConfiguration.setBounds(tmpRect);
        updateConfiguration(config);
        // We only need new bounds here, other configuration should be update later.
        mTempRect.set(mRootBounds);
        mRootBounds.set(tmpRect);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, stableInsets);
        initDividerPosition(mTempRect);
    }

    private void initDividerPosition(Rect oldBounds) {
@@ -372,7 +373,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        return mDividerSnapAlgorithm.calculateSnapTarget(position, velocity, hardDismiss);
    }

    private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) {
    private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds,
            @Nullable Rect stableInsets) {
        final boolean isLandscape = isLandscape(rootBounds);
        return new DividerSnapAlgorithm(
                context.getResources(),
@@ -380,7 +382,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
                rootBounds.height(),
                mDividerSize,
                !isLandscape,
                getDisplayInsets(context),
                stableInsets != null ? stableInsets : getDisplayInsets(context),
                isLandscape ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
    }

+15 −1
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import android.app.ActivityOptions;
import android.app.ActivityTaskManager;
import android.app.WindowConfiguration;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.hardware.devicestate.DeviceStateManager;
import android.os.Bundle;
@@ -87,6 +88,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.split.SplitLayout;
@@ -133,6 +135,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private final SideStage mSideStage;
    private final StageListenerImpl mSideStageListener = new StageListenerImpl();
    private final StageTaskUnfoldController mSideUnfoldController;
    private final DisplayLayout mDisplayLayout;
    @SplitPosition
    private int mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT;

@@ -234,6 +237,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions,
                mOnTransitionAnimationComplete);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayLayout = new DisplayLayout(displayController.getDisplayLayout(displayId));
        transitions.addHandler(this);
    }

@@ -267,6 +271,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mLogger = logger;
        mRecentTasks = recentTasks;
        mDisplayController.addDisplayWindowListener(this);
        mDisplayLayout = new DisplayLayout();
        transitions.addHandler(this);
    }

@@ -1084,6 +1089,14 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mDisplayController.addDisplayChangingController(this::onRotateDisplay);
    }

    @Override
    public void onDisplayConfigurationChanged(int displayId, Configuration newConfig) {
        if (displayId != DEFAULT_DISPLAY) {
            return;
        }
        mDisplayLayout.set(mDisplayController.getDisplayLayout(displayId));
    }

    private void onRotateDisplay(int displayId, int fromRotation, int toRotation,
            WindowContainerTransaction wct) {
        if (!mMainStage.isActive()) return;
@@ -1092,7 +1105,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,

        final SurfaceControl.Transaction t = mTransactionPool.acquire();
        setDividerVisibility(false, t);
        mSplitLayout.rotateTo(toRotation);
        mDisplayLayout.rotateTo(mContext.getResources(), toRotation);
        mSplitLayout.rotateTo(toRotation, mDisplayLayout.stableInsets());
        updateWindowBounds(mSplitLayout, wct);
        updateUnfoldBounds();
        t.apply();