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

Commit 044758be authored by Jerry Chang's avatar Jerry Chang Committed by Automerger Merge Worker
Browse files

Merge "Fix wrong divider position after rotation" into udc-dev am: 28d58eca

parents d7a53fd1 28d58eca
Loading
Loading
Loading
Loading
+25 −18
Original line number Original line Diff line number Diff line
@@ -63,8 +63,10 @@ import com.android.internal.policy.DockedDividerUtils;
import com.android.wm.shell.R;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.animation.Interpolators;
import com.android.wm.shell.animation.Interpolators;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.InteractionJankMonitorUtils;
import com.android.wm.shell.common.InteractionJankMonitorUtils;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;


@@ -104,6 +106,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
    private final Rect mWinBounds2 = new Rect();
    private final Rect mWinBounds2 = new Rect();
    private final SplitLayoutHandler mSplitLayoutHandler;
    private final SplitLayoutHandler mSplitLayoutHandler;
    private final SplitWindowManager mSplitWindowManager;
    private final SplitWindowManager mSplitWindowManager;
    private final DisplayController mDisplayController;
    private final DisplayImeController mDisplayImeController;
    private final DisplayImeController mDisplayImeController;
    private final ImePositionProcessor mImePositionProcessor;
    private final ImePositionProcessor mImePositionProcessor;
    private final ResizingEffectPolicy mSurfaceEffectPolicy;
    private final ResizingEffectPolicy mSurfaceEffectPolicy;
@@ -128,13 +131,14 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
    public SplitLayout(String windowName, Context context, Configuration configuration,
    public SplitLayout(String windowName, Context context, Configuration configuration,
            SplitLayoutHandler splitLayoutHandler,
            SplitLayoutHandler splitLayoutHandler,
            SplitWindowManager.ParentContainerCallbacks parentContainerCallbacks,
            SplitWindowManager.ParentContainerCallbacks parentContainerCallbacks,
            DisplayImeController displayImeController, ShellTaskOrganizer taskOrganizer,
            DisplayController displayController, DisplayImeController displayImeController,
            int parallaxType) {
            ShellTaskOrganizer taskOrganizer, int parallaxType) {
        mContext = context.createConfigurationContext(configuration);
        mContext = context.createConfigurationContext(configuration);
        mOrientation = configuration.orientation;
        mOrientation = configuration.orientation;
        mRotation = configuration.windowConfiguration.getRotation();
        mRotation = configuration.windowConfiguration.getRotation();
        mDensity = configuration.densityDpi;
        mDensity = configuration.densityDpi;
        mSplitLayoutHandler = splitLayoutHandler;
        mSplitLayoutHandler = splitLayoutHandler;
        mDisplayController = displayController;
        mDisplayImeController = displayImeController;
        mDisplayImeController = displayImeController;
        mSplitWindowManager = new SplitWindowManager(windowName, mContext, configuration,
        mSplitWindowManager = new SplitWindowManager(windowName, mContext, configuration,
                parentContainerCallbacks);
                parentContainerCallbacks);
@@ -145,7 +149,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        updateDividerConfig(mContext);
        updateDividerConfig(mContext);


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


        mDimNonImeSide = mContext.getResources().getBoolean(R.bool.config_dimNonImeAttachedSide);
        mDimNonImeSide = mContext.getResources().getBoolean(R.bool.config_dimNonImeAttachedSide);
@@ -314,7 +318,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        mRotation = rotation;
        mRotation = rotation;
        mDensity = density;
        mDensity = density;
        mUiMode = uiMode;
        mUiMode = uiMode;
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, null);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
        updateDividerConfig(mContext);
        updateDividerConfig(mContext);
        initDividerPosition(mTempRect);
        initDividerPosition(mTempRect);
        updateInvisibleRect();
        updateInvisibleRect();
@@ -324,7 +328,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange


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


@@ -337,7 +341,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        // We only need new bounds here, other configuration should be update later.
        // We only need new bounds here, other configuration should be update later.
        mTempRect.set(mRootBounds);
        mTempRect.set(mRootBounds);
        mRootBounds.set(tmpRect);
        mRootBounds.set(tmpRect);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds, stableInsets);
        mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
        initDividerPosition(mTempRect);
        initDividerPosition(mTempRect);
    }
    }


@@ -548,10 +552,9 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        return mDividerSnapAlgorithm.calculateSnapTarget(position, velocity, hardDismiss);
        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);
        final boolean isLandscape = isLandscape(rootBounds);
        final Rect insets = stableInsets != null ? stableInsets : getDisplayInsets(context);
        final Rect insets = getDisplayStableInsets(context);


        // Make split axis insets value same as the larger one to avoid bounds1 and bounds2
        // Make split axis insets value same as the larger one to avoid bounds1 and bounds2
        // have difference for avoiding size-compat mode when switching unresizable apps in
        // have difference for avoiding size-compat mode when switching unresizable apps in
@@ -634,7 +637,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
    public void splitSwitching(SurfaceControl.Transaction t, SurfaceControl leash1,
    public void splitSwitching(SurfaceControl.Transaction t, SurfaceControl leash1,
            SurfaceControl leash2, Consumer<Rect> finishCallback) {
            SurfaceControl leash2, Consumer<Rect> finishCallback) {
        final boolean isLandscape = isLandscape();
        final boolean isLandscape = isLandscape();
        final Rect insets = getDisplayInsets(mContext);
        final Rect insets = getDisplayStableInsets(mContext);
        insets.set(isLandscape ? insets.left : 0, isLandscape ? 0 : insets.top,
        insets.set(isLandscape ? insets.left : 0, isLandscape ? 0 : insets.top,
                isLandscape ? insets.right : 0, isLandscape ? 0 : insets.bottom);
                isLandscape ? insets.right : 0, isLandscape ? 0 : insets.bottom);


@@ -705,8 +708,12 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
        return animator;
        return animator;
    }
    }


    private static Rect getDisplayInsets(Context context) {
    private Rect getDisplayStableInsets(Context context) {
        return context.getSystemService(WindowManager.class)
        final DisplayLayout displayLayout =
                mDisplayController.getDisplayLayout(context.getDisplayId());
        return displayLayout != null
                ? displayLayout.stableInsets()
                : context.getSystemService(WindowManager.class)
                        .getMaximumWindowMetrics()
                        .getMaximumWindowMetrics()
                        .getWindowInsets()
                        .getWindowInsets()
                        .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()
                        .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()
@@ -784,7 +791,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange


    private int getSmallestWidthDp(Rect bounds) {
    private int getSmallestWidthDp(Rect bounds) {
        mTempRect.set(bounds);
        mTempRect.set(bounds);
        mTempRect.inset(getDisplayInsets(mContext));
        mTempRect.inset(getDisplayStableInsets(mContext));
        final int minWidth = Math.min(mTempRect.width(), mTempRect.height());
        final int minWidth = Math.min(mTempRect.width(), mTempRect.height());
        final float density = mContext.getResources().getDisplayMetrics().density;
        final float density = mContext.getResources().getDisplayMetrics().density;
        return (int) (minWidth / density);
        return (int) (minWidth / density);
+3 −10
Original line number Original line Diff line number Diff line
@@ -122,7 +122,6 @@ import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ScreenshotUtils;
import com.android.wm.shell.common.ScreenshotUtils;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SyncTransactionQueue;
@@ -171,7 +170,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private final StageListenerImpl mMainStageListener = new StageListenerImpl();
    private final StageListenerImpl mMainStageListener = new StageListenerImpl();
    private final SideStage mSideStage;
    private final SideStage mSideStage;
    private final StageListenerImpl mSideStageListener = new StageListenerImpl();
    private final StageListenerImpl mSideStageListener = new StageListenerImpl();
    private final DisplayLayout mDisplayLayout;
    @SplitPosition
    @SplitPosition
    private int mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT;
    private int mSideStagePosition = SPLIT_POSITION_BOTTOM_OR_RIGHT;


@@ -311,7 +309,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions,
        mSplitTransitions = new SplitScreenTransitions(transactionPool, transitions,
                this::onTransitionAnimationComplete, this);
                this::onTransitionAnimationComplete, this);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayLayout = new DisplayLayout(displayController.getDisplayLayout(displayId));
        transitions.addHandler(this);
        transitions.addHandler(this);
        mSplitUnsupportedToast = Toast.makeText(mContext,
        mSplitUnsupportedToast = Toast.makeText(mContext,
                R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT);
                R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT);
@@ -345,7 +342,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mMainExecutor = mainExecutor;
        mMainExecutor = mainExecutor;
        mRecentTasks = recentTasks;
        mRecentTasks = recentTasks;
        mDisplayController.addDisplayWindowListener(this);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayLayout = new DisplayLayout();
        transitions.addHandler(this);
        transitions.addHandler(this);
        mSplitUnsupportedToast = Toast.makeText(mContext,
        mSplitUnsupportedToast = Toast.makeText(mContext,
                R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT);
                R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT);
@@ -1689,7 +1685,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        if (mSplitLayout == null) {
        if (mSplitLayout == null) {
            mSplitLayout = new SplitLayout(TAG + "SplitDivider", mContext,
            mSplitLayout = new SplitLayout(TAG + "SplitDivider", mContext,
                    mRootTaskInfo.configuration, this, mParentContainerCallbacks,
                    mRootTaskInfo.configuration, this, mParentContainerCallbacks,
                    mDisplayImeController, mTaskOrganizer,
                    mDisplayController, mDisplayImeController, mTaskOrganizer,
                    PARALLAX_ALIGN_CENTER /* parallaxType */);
                    PARALLAX_ALIGN_CENTER /* parallaxType */);
            mDisplayInsetsController.addInsetsChangedListener(mDisplayId, mSplitLayout);
            mDisplayInsetsController.addInsetsChangedListener(mDisplayId, mSplitLayout);
        }
        }
@@ -2153,8 +2149,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        if (displayId != DEFAULT_DISPLAY) {
        if (displayId != DEFAULT_DISPLAY) {
            return;
            return;
        }
        }
        mDisplayLayout.set(mDisplayController.getDisplayLayout(displayId));

        if (mSplitLayout != null && mSplitLayout.isDensityChanged(newConfig.densityDpi)
        if (mSplitLayout != null && mSplitLayout.isDensityChanged(newConfig.densityDpi)
                && mMainStage.isActive()
                && mMainStage.isActive()
                && mSplitLayout.updateConfiguration(newConfig)
                && mSplitLayout.updateConfiguration(newConfig)
@@ -2171,10 +2165,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,


    private void onDisplayChange(int displayId, int fromRotation, int toRotation,
    private void onDisplayChange(int displayId, int fromRotation, int toRotation,
            @Nullable DisplayAreaInfo newDisplayAreaInfo, WindowContainerTransaction wct) {
            @Nullable DisplayAreaInfo newDisplayAreaInfo, WindowContainerTransaction wct) {
        if (!mMainStage.isActive()) return;
        if (displayId != DEFAULT_DISPLAY || !mMainStage.isActive()) return;


        mDisplayLayout.rotateTo(mContext.getResources(), toRotation);
        mSplitLayout.rotateTo(toRotation);
        mSplitLayout.rotateTo(toRotation, mDisplayLayout.stableInsets());
        if (newDisplayAreaInfo != null) {
        if (newDisplayAreaInfo != null) {
            mSplitLayout.updateConfiguration(newDisplayAreaInfo.configuration);
            mSplitLayout.updateConfiguration(newDisplayAreaInfo.configuration);
        }
        }
+16 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;


import android.app.ActivityManager;
import android.app.ActivityManager;
@@ -41,6 +42,7 @@ import com.android.internal.policy.DividerSnapAlgorithm;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestRunningTaskInfoBuilder;
import com.android.wm.shell.TestRunningTaskInfoBuilder;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayImeController;
import com.android.wm.shell.common.DisplayImeController;


import org.junit.Before;
import org.junit.Before;
@@ -57,6 +59,7 @@ import org.mockito.MockitoAnnotations;
public class SplitLayoutTests extends ShellTestCase {
public class SplitLayoutTests extends ShellTestCase {
    @Mock SplitLayout.SplitLayoutHandler mSplitLayoutHandler;
    @Mock SplitLayout.SplitLayoutHandler mSplitLayoutHandler;
    @Mock SplitWindowManager.ParentContainerCallbacks mCallbacks;
    @Mock SplitWindowManager.ParentContainerCallbacks mCallbacks;
    @Mock DisplayController mDisplayController;
    @Mock DisplayImeController mDisplayImeController;
    @Mock DisplayImeController mDisplayImeController;
    @Mock ShellTaskOrganizer mTaskOrganizer;
    @Mock ShellTaskOrganizer mTaskOrganizer;
    @Mock WindowContainerTransaction mWct;
    @Mock WindowContainerTransaction mWct;
@@ -72,6 +75,7 @@ public class SplitLayoutTests extends ShellTestCase {
                getConfiguration(),
                getConfiguration(),
                mSplitLayoutHandler,
                mSplitLayoutHandler,
                mCallbacks,
                mCallbacks,
                mDisplayController,
                mDisplayImeController,
                mDisplayImeController,
                mTaskOrganizer,
                mTaskOrganizer,
                SplitLayout.PARALLAX_NONE));
                SplitLayout.PARALLAX_NONE));
@@ -100,6 +104,10 @@ public class SplitLayoutTests extends ShellTestCase {
        // Verify updateConfiguration returns true if the density changed.
        // Verify updateConfiguration returns true if the density changed.
        config.densityDpi = 123;
        config.densityDpi = 123;
        assertThat(mSplitLayout.updateConfiguration(config)).isTrue();
        assertThat(mSplitLayout.updateConfiguration(config)).isTrue();

        // Verify updateConfiguration checks the current DisplayLayout
        verify(mDisplayController, times(5)) // init * 1 + updateConfiguration * 4
                .getDisplayLayout(anyInt());
    }
    }


    @Test
    @Test
@@ -168,6 +176,14 @@ public class SplitLayoutTests extends ShellTestCase {
        verify(mWct).setSmallestScreenWidthDp(eq(task2.token), anyInt());
        verify(mWct).setSmallestScreenWidthDp(eq(task2.token), anyInt());
    }
    }


    @Test
    public void testRoateTo_checksDisplayLayout() {
        mSplitLayout.rotateTo(90);

        verify(mDisplayController, times(2)) // init * 1 + rotateTo * 1
                .getDisplayLayout(anyInt());
    }

    private void waitDividerFlingFinished() {
    private void waitDividerFlingFinished() {
        verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), anyInt(),
        verify(mSplitLayout).flingDividePosition(anyInt(), anyInt(), anyInt(),
                mRunnableCaptor.capture());
                mRunnableCaptor.capture());