Merge "Allow devices to calculate their own split ratio instead of using fixed ratio" into 24D1-dev
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 784b371..8c11658 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -6947,6 +6947,9 @@
     <!-- Whether to enable left-right split in portrait on this device -->
     <bool name="config_leftRightSplitInPortrait">false</bool>
 
+    <!-- Whether to allow split screen ratios to flexibly calculate based on available space -->
+    <bool name="config_flexibleSplitRatios">false</bool>
+
     <!-- Whether scroll haptic feedback is enabled for rotary encoder scrolls on
          {@link MotionEvent#AXIS_SCROLL} generated by {@link InputDevice#SOURCE_ROTARY_ENCODER}
          devices. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index dadb7e4..7a8611dd 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -410,6 +410,7 @@
   <java-symbol type="bool" name="config_supportsSplitScreenMultiWindow" />
   <java-symbol type="bool" name="config_supportsMultiDisplay" />
   <java-symbol type="bool" name="config_leftRightSplitInPortrait" />
+  <java-symbol type="bool" name="config_flexibleSplitRatios" />
   <java-symbol type="integer" name="config_supportsNonResizableMultiWindow" />
   <java-symbol type="integer" name="config_respectsActivityMinWidthHeightMultiWindow" />
   <java-symbol type="dimen" name="config_minPercentageMultiWindowSupportHeight" />
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
index f9a286e..bc6ed1f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerSnapAlgorithm.java
@@ -84,6 +84,8 @@
     private final int mMinimalSizeResizableTask;
     private final int mTaskHeightInMinimizedMode;
     private final float mFixedRatio;
+    /** Allows split ratios to calculated dynamically instead of using {@link #mFixedRatio}. */
+    private final boolean mAllowFlexibleSplitRatios;
     private boolean mIsHorizontalDivision;
 
     /** The first target which is still splitting the screen */
@@ -144,6 +146,8 @@
                 com.android.internal.R.fraction.docked_stack_divider_fixed_ratio, 1, 1);
         mMinimalSizeResizableTask = res.getDimensionPixelSize(
                 com.android.internal.R.dimen.default_minimal_size_resizable_task);
+        mAllowFlexibleSplitRatios = res.getBoolean(
+                com.android.internal.R.bool.config_flexibleSplitRatios);
         mTaskHeightInMinimizedMode = isHomeResizable ? res.getDimensionPixelSize(
                 com.android.internal.R.dimen.task_height_of_minimized_mode) : 0;
         calculateTargets(isHorizontalDivision, dockSide);
@@ -349,6 +353,9 @@
                 ? mDisplayHeight - mInsets.bottom
                 : mDisplayWidth - mInsets.right;
         int size = (int) (mFixedRatio * (end - start)) - mDividerSize / 2;
+        if (mAllowFlexibleSplitRatios) {
+            size = Math.max(size, mMinimalSizeResizableTask);
+        }
         int topPosition = start + size;
         int bottomPosition = end - size - mDividerSize;
         addNonDismissingTargets(isHorizontalDivision, topPosition, bottomPosition, dividerMax);