Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +30 −14 Original line number Diff line number Diff line Loading @@ -92,12 +92,16 @@ public final class SplitLayout { private DividerSnapAlgorithm mDividerSnapAlgorithm; private int mDividePosition; private boolean mInitialized = false; private int mOrientation; private int mRotation; public SplitLayout(String windowName, Context context, Configuration configuration, SplitLayoutHandler splitLayoutHandler, SplitWindowManager.ParentContainerCallbacks parentContainerCallbacks, DisplayImeController displayImeController, ShellTaskOrganizer taskOrganizer) { mContext = context.createConfigurationContext(configuration); mOrientation = configuration.orientation; mRotation = configuration.windowConfiguration.getRotation(); mSplitLayoutHandler = splitLayoutHandler; mDisplayImeController = displayImeController; mSplitWindowManager = new SplitWindowManager( Loading Loading @@ -144,27 +148,39 @@ public final class SplitLayout { /** Applies new configuration, returns {@code false} if there's no effect to the layout. */ public boolean updateConfiguration(Configuration configuration) { final Rect rootBounds = configuration.windowConfiguration.getBounds(); if (mRootBounds.equals(rootBounds)) { return false; } boolean affectsLayout = false; // Make sure to render the divider bar with proper resources that matching the screen // orientation. final int orientation = configuration.orientation; if (orientation != mOrientation) { mOrientation = orientation; mContext = mContext.createConfigurationContext(configuration); mSplitWindowManager.setConfiguration(configuration); affectsLayout = true; } // Update the split bounds when necessary. Besides root bounds changed, split bounds need to // be updated when the rotation changed to cover the case that users rotated the screen 180 // degrees. final int rotation = configuration.windowConfiguration.getRotation(); final Rect rootBounds = configuration.windowConfiguration.getBounds(); if (rotation != mRotation || !mRootBounds.equals(rootBounds)) { mRootBounds.set(rootBounds); mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); // Don't inflate divider bar if it is not initialized. if (!mInitialized) { return false; affectsLayout = true; } if (mInitialized && affectsLayout) { release(); init(); return true; } return false; } /** Updates recording bounds of divider window and both of the splits. */ private void updateBounds(int position) { mDividerBounds.set(mRootBounds); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +21 −6 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public class SplitLayoutTests extends ShellTestCase { mSplitLayout = new SplitLayout( "TestSplitLayout", mContext, getConfiguration(false), getConfiguration(), mSplitLayoutHandler, b -> b.setParent(mRootLeash), mDisplayImeController, Loading @@ -71,9 +71,23 @@ public class SplitLayoutTests extends ShellTestCase { @Test @UiThreadTest public void testUpdateConfiguration() { final Configuration config = getConfiguration(); mSplitLayout.init(); assertThat(mSplitLayout.updateConfiguration(getConfiguration(false))).isFalse(); assertThat(mSplitLayout.updateConfiguration(getConfiguration(true))).isTrue(); // Verify it returns true if new config won't affect split layout. assertThat(mSplitLayout.updateConfiguration(config)).isFalse(); // Verify updateConfiguration returns true if the orientation changed. config.orientation = ORIENTATION_LANDSCAPE; assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); // Verify updateConfiguration returns true if it rotated. config.windowConfiguration.setRotation(1); assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); // Verify updateConfiguration returns true if the root bounds changed. config.windowConfiguration.setBounds(new Rect(0, 0, 2160, 1080)); assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); } @Test Loading Loading @@ -108,12 +122,13 @@ public class SplitLayoutTests extends ShellTestCase { verify(mSplitLayoutHandler).onSnappedToDismiss(eq(true)); } private static Configuration getConfiguration(boolean isLandscape) { private static Configuration getConfiguration() { final Configuration configuration = new Configuration(); configuration.unset(); configuration.orientation = isLandscape ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT; configuration.orientation = ORIENTATION_PORTRAIT; configuration.windowConfiguration.setRotation(0); configuration.windowConfiguration.setBounds( new Rect(0, 0, isLandscape ? 2160 : 1080, isLandscape ? 1080 : 2160)); new Rect(0, 0, 1080, 2160)); return configuration; } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +30 −14 Original line number Diff line number Diff line Loading @@ -92,12 +92,16 @@ public final class SplitLayout { private DividerSnapAlgorithm mDividerSnapAlgorithm; private int mDividePosition; private boolean mInitialized = false; private int mOrientation; private int mRotation; public SplitLayout(String windowName, Context context, Configuration configuration, SplitLayoutHandler splitLayoutHandler, SplitWindowManager.ParentContainerCallbacks parentContainerCallbacks, DisplayImeController displayImeController, ShellTaskOrganizer taskOrganizer) { mContext = context.createConfigurationContext(configuration); mOrientation = configuration.orientation; mRotation = configuration.windowConfiguration.getRotation(); mSplitLayoutHandler = splitLayoutHandler; mDisplayImeController = displayImeController; mSplitWindowManager = new SplitWindowManager( Loading Loading @@ -144,27 +148,39 @@ public final class SplitLayout { /** Applies new configuration, returns {@code false} if there's no effect to the layout. */ public boolean updateConfiguration(Configuration configuration) { final Rect rootBounds = configuration.windowConfiguration.getBounds(); if (mRootBounds.equals(rootBounds)) { return false; } boolean affectsLayout = false; // Make sure to render the divider bar with proper resources that matching the screen // orientation. final int orientation = configuration.orientation; if (orientation != mOrientation) { mOrientation = orientation; mContext = mContext.createConfigurationContext(configuration); mSplitWindowManager.setConfiguration(configuration); affectsLayout = true; } // Update the split bounds when necessary. Besides root bounds changed, split bounds need to // be updated when the rotation changed to cover the case that users rotated the screen 180 // degrees. final int rotation = configuration.windowConfiguration.getRotation(); final Rect rootBounds = configuration.windowConfiguration.getBounds(); if (rotation != mRotation || !mRootBounds.equals(rootBounds)) { mRootBounds.set(rootBounds); mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); // Don't inflate divider bar if it is not initialized. if (!mInitialized) { return false; affectsLayout = true; } if (mInitialized && affectsLayout) { release(); init(); return true; } return false; } /** Updates recording bounds of divider window and both of the splits. */ private void updateBounds(int position) { mDividerBounds.set(mRootBounds); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +21 −6 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public class SplitLayoutTests extends ShellTestCase { mSplitLayout = new SplitLayout( "TestSplitLayout", mContext, getConfiguration(false), getConfiguration(), mSplitLayoutHandler, b -> b.setParent(mRootLeash), mDisplayImeController, Loading @@ -71,9 +71,23 @@ public class SplitLayoutTests extends ShellTestCase { @Test @UiThreadTest public void testUpdateConfiguration() { final Configuration config = getConfiguration(); mSplitLayout.init(); assertThat(mSplitLayout.updateConfiguration(getConfiguration(false))).isFalse(); assertThat(mSplitLayout.updateConfiguration(getConfiguration(true))).isTrue(); // Verify it returns true if new config won't affect split layout. assertThat(mSplitLayout.updateConfiguration(config)).isFalse(); // Verify updateConfiguration returns true if the orientation changed. config.orientation = ORIENTATION_LANDSCAPE; assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); // Verify updateConfiguration returns true if it rotated. config.windowConfiguration.setRotation(1); assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); // Verify updateConfiguration returns true if the root bounds changed. config.windowConfiguration.setBounds(new Rect(0, 0, 2160, 1080)); assertThat(mSplitLayout.updateConfiguration(config)).isTrue(); } @Test Loading Loading @@ -108,12 +122,13 @@ public class SplitLayoutTests extends ShellTestCase { verify(mSplitLayoutHandler).onSnappedToDismiss(eq(true)); } private static Configuration getConfiguration(boolean isLandscape) { private static Configuration getConfiguration() { final Configuration configuration = new Configuration(); configuration.unset(); configuration.orientation = isLandscape ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT; configuration.orientation = ORIENTATION_PORTRAIT; configuration.windowConfiguration.setRotation(0); configuration.windowConfiguration.setBounds( new Rect(0, 0, isLandscape ? 2160 : 1080, isLandscape ? 1080 : 2160)); new Rect(0, 0, 1080, 2160)); return configuration; } Loading