[go: nahoru, domu]

Refactor SplitType APIs

Bug: 267391190
Bug: 269199014
Test: presubmit
Relnote: "
  - Remove RatioSplitType, ExpandContainersSplit and HingeSplitType
    They are SplitType now.
  - Replace #splitEqually(), #expandContainers() amd #splitByHinge to
    constant SplitType SPLIT_TYPE_EQUAL,
    SPLIT_TYPE_EXPAND and SPLIT_TYPE_HINGE
  - Remove the functionality to set fallback type of hinge split type.
    If the hinge split type cannot be applied due to the current device
    or window state, it fallbacks to split the parent task container
    equally. Use SplitController#setSplitAttributesCalculator to
    customize the fallback split type.
"

Merged-In: Ifcc59d8ad1ea8fd7de04b65c597fff20f024bc13
Change-Id: Ifcc59d8ad1ea8fd7de04b65c597fff20f024bc13
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
index c5f46fd..95a6ea2 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
@@ -34,6 +34,8 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitAttributesCalculatorParams
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitController.SplitSupportStatus.Companion.SPLIT_AVAILABLE
@@ -76,7 +78,7 @@
         val config = params.parentConfiguration
         // The SplitAttributes to occupy the whole task bounds
         val expandContainersAttrs = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .setSplitType(SplitAttributes.SplitType.SPLIT_TYPE_EXPAND)
             .build()
         val tag = params.splitRuleTag
         val shouldReversed = tag?.contains(SUFFIX_REVERSED) ?: false
@@ -104,7 +106,7 @@
             TAG_SHOW_FULLSCREEN_IN_PORTRAIT + SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
                 if (isTabletop) {
                     return SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setSplitType(SPLIT_TYPE_HINGE)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -121,7 +123,7 @@
             TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
                 if (isTabletop) {
                     return SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setSplitType(SPLIT_TYPE_HINGE)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -135,7 +137,7 @@
             }
             TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE -> {
                 return SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setSplitType(SPLIT_TYPE_HINGE)
                     .setLayoutDirection(
                         if (shouldReversed) {
                             BOTTOM_TO_TOP
@@ -149,7 +151,7 @@
                     expandContainersAttrs
                 } else if (config.screenWidthDp <= 600) {
                     SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setSplitType(SPLIT_TYPE_EQUAL)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -161,7 +163,7 @@
                         .build()
                 } else {
                     SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setSplitType(SPLIT_TYPE_EQUAL)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 RIGHT_TO_LEFT
@@ -179,7 +181,7 @@
                     return SplitAttributes.Builder()
                         .setSplitType(
                             if (foldingState.isSeparating) {
-                                SplitAttributes.SplitType.splitByHinge()
+                                SPLIT_TYPE_HINGE
                             } else {
                                 SplitAttributes.SplitType.ratio(0.3f)
                             }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
index d035865..680d8d2 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
@@ -36,6 +36,8 @@
 import androidx.window.embedding.EmbeddingRule
 import androidx.window.embedding.RuleController
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitController.SplitSupportStatus.Companion.SPLIT_AVAILABLE
 import androidx.window.embedding.SplitInfo
@@ -262,7 +264,7 @@
         )
         splitPairFilters.add(splitPairFilter)
         val defaultSplitAttributes = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitEqually())
+            .setSplitType(SPLIT_TYPE_EQUAL)
             .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
             .setAnimationBackgroundColor(demoActivityEmbeddingController.animationBackgroundColor)
             .build()
@@ -309,7 +311,7 @@
 
     private suspend fun updateSplitAttributesText(newSplitInfos: List<SplitInfo>) {
         var splitAttributes: SplitAttributes = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .setSplitType(SPLIT_TYPE_EXPAND)
             .build()
         var suggestToFinishItself = false
         val isCallbackSupported = splitController.isSplitAttributesCalculatorSupported()
@@ -318,8 +320,7 @@
             if (info.contains(this@SplitDeviceStateActivityBase)) {
                 splitAttributes = info.splitAttributes
                 if (componentName == activityB &&
-                    splitAttributes.splitType
-                        is SplitAttributes.SplitType.ExpandContainersSplitType
+                    splitAttributes.splitType == SPLIT_TYPE_EXPAND
                 ) {
                     // We don't put any functionality on activity B. Suggest users to finish the
                     // activity if it fills the host task.
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
index 370951f..4ab221f 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
@@ -35,6 +35,7 @@
 import androidx.window.embedding.EmbeddingRule
 import androidx.window.embedding.RuleController
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitPairFilter
 import androidx.window.embedding.SplitPairRule
@@ -109,8 +110,7 @@
                         var isInSplit = false
                         for (info in newSplitInfos) {
                             if (info.contains(this@SplitPipActivityBase) &&
-                                info.splitAttributes.splitType !is
-                                    SplitAttributes.SplitType.ExpandContainersSplitType
+                                info.splitAttributes.splitType == SPLIT_TYPE_EXPAND
                             ) {
                                 isInSplit = true
                                 break
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
index 37fc296..ade64a2 100644
--- a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
@@ -16,6 +16,8 @@
 
 package androidx.window.testing.emedding;
 
+import static androidx.window.embedding.SplitAttributes.SplitType.SPLIT_TYPE_HINGE;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -52,8 +54,7 @@
     private static final SplitAttributes DEFAULT_SPLIT_ATTRIBUTES =
             new SplitAttributes.Builder().build();
     private static final SplitAttributes TABLETOP_HINGE_ATTRIBUTES = new SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitByHinge(
-                    SplitAttributes.SplitType.splitEqually()))
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
             .build();
 
@@ -114,7 +115,7 @@
             return params.getDefaultSplitAttributes();
         } else {
             return new SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SplitAttributes.SplitType.SPLIT_TYPE_EXPAND)
                     .build();
         }
     }
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
index 15f0193a..0eb2411 100644
--- a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
@@ -21,6 +21,8 @@
 import android.graphics.Rect
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
 import androidx.window.embedding.SplitAttributesCalculatorParams
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.WindowLayoutInfo
@@ -91,7 +93,7 @@
             params.defaultSplitAttributes
         } else {
             SplitAttributes.Builder()
-                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .setSplitType(SPLIT_TYPE_EXPAND)
                 .build()
         }
     }
@@ -101,7 +103,7 @@
         private val TEST_METRICS = WindowMetrics(TEST_BOUNDS)
         private val DEFAULT_SPLIT_ATTRIBUTES = SplitAttributes.Builder().build()
         private val TABLETOP_HINGE_ATTRIBUTES = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
             .build()
     }
diff --git a/window/window/api/current.txt b/window/window/api/current.txt
index f514e31..a7806dc 100644
--- a/window/window/api/current.txt
+++ b/window/window/api/current.txt
@@ -126,32 +126,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   public final class SplitController {
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 80d1b6b..01b7d59 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -167,32 +167,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   @androidx.window.core.ExperimentalWindowApi public final class SplitAttributesCalculatorParams {
diff --git a/window/window/api/restricted_current.txt b/window/window/api/restricted_current.txt
index f514e31..a7806dc 100644
--- a/window/window/api/restricted_current.txt
+++ b/window/window/api/restricted_current.txt
@@ -126,32 +126,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   public final class SplitController {
diff --git a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
index 2cba736..9e69205 100644
--- a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
+++ b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
@@ -21,6 +21,9 @@
 import androidx.annotation.Sampled
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitController
 import androidx.window.layout.FoldingFeature
 
@@ -50,7 +53,7 @@
                 // Split the parent container that followed by the hinge if the hinge separates the
                 // parent window.
                 return@setSplitAttributesCalculator SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setSplitType(SPLIT_TYPE_HINGE)
                     .setLayoutDirection(
                         if (foldingState.orientation == FoldingFeature.Orientation.HORIZONTAL) {
                             SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
@@ -67,14 +70,14 @@
             ) {
                 // Split the parent container equally and vertically if the device is in landscape.
                 SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitEqually())
+                    .setSplitType(SPLIT_TYPE_EQUAL)
                     .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                     .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GRAY))
                     .build()
             } else {
                 // Expand containers if the device is in portrait or the width is less than 600 dp.
                 SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SPLIT_TYPE_EXPAND)
                     .build()
             }
         }
@@ -104,7 +107,7 @@
             } else {
                 // Fallback to expand the secondary container
                 builder
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SPLIT_TYPE_EXPAND)
                     .build()
             }
         }
@@ -122,7 +125,7 @@
             val areDefaultConstraintsSatisfied = params.areDefaultConstraintsSatisfied
 
             val expandContainersAttrs = SplitAttributes.Builder()
-                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .setSplitType(SPLIT_TYPE_EXPAND)
                 .build()
             if (!areDefaultConstraintsSatisfied) {
                 return@setSplitAttributesCalculator expandContainersAttrs
@@ -130,7 +133,7 @@
             // Always expand containers for the splitRule tagged as
             // TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT if the device is in portrait
             // even if [areDefaultConstraintsSatisfied] reports true.
-            if (bounds.height() > bounds.width() && TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT.equals(tag)) {
+            if (bounds.height() > bounds.width() && TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT == tag) {
                 return@setSplitAttributesCalculator expandContainersAttrs
             }
             // Otherwise, use the default splitAttributes.
@@ -138,6 +141,22 @@
         }
 }
 
+@OptIn(ExperimentalWindowApi::class)
+@Sampled
+fun fallbackToExpandContainersForSplitTypeHinge() {
+    SplitController.getInstance(context).setSplitAttributesCalculator { params ->
+        SplitAttributes.Builder()
+            .setSplitType(
+                if (params.parentWindowLayoutInfo.displayFeatures
+                        .filterIsInstance<FoldingFeature>().isNotEmpty()) {
+                    SPLIT_TYPE_HINGE
+                } else {
+                    SPLIT_TYPE_EXPAND
+                }
+            ).build()
+    }
+}
+
 /** Assume it's a valid [Application]... */
 val context = Application()
 const val TAG_SPLIT_RULE_MAIN = "main"
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
index 0ce0920..631dfc3 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
@@ -25,8 +25,10 @@
 import androidx.window.core.ExtensionsUtil
 import androidx.window.core.PredicateAdapter
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
 import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.whenever
 import org.junit.Assert.assertEquals
@@ -57,7 +59,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.splitEqually())
+                .setSplitType(SplitType.SPLIT_TYPE_EQUAL)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                 .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
                 .build()
@@ -80,7 +82,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.expandContainers())
+                .setSplitType(SplitType.SPLIT_TYPE_EXPAND)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                 .build()
         )
@@ -120,11 +122,8 @@
             createTestOEMActivityStack(ArrayList(), true),
             createTestOEMActivityStack(ArrayList(), true),
             OEMSplitAttributes.Builder()
-                .setSplitType(
-                    OEMSplitAttributes.SplitType.HingeSplitType(
-                        OEMSplitAttributes.SplitType.RatioSplitType(0.3f)
-                    )
-                ).setLayoutDirection(TOP_TO_BOTTOM)
+                .setSplitType(OEMSplitAttributes.SplitType.HingeSplitType(RatioSplitType(0.5f)))
+                .setLayoutDirection(TOP_TO_BOTTOM)
                 .setAnimationBackgroundColor(Color.YELLOW)
                 .build(),
         )
@@ -132,7 +131,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.splitByHinge(SplitType.ratio(0.3f)))
+                .setSplitType(SPLIT_TYPE_HINGE)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
                 .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.YELLOW))
                 .build()
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
index 69c507d..b896bb4 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
@@ -24,6 +24,9 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotEquals
 import org.junit.Assert.assertThrows
@@ -34,27 +37,27 @@
     @Test
     fun testSplitAttributesEquals() {
         val attrs1 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitEqually())
+            .setSplitType(SPLIT_TYPE_EQUAL)
             .setLayoutDirection(LOCALE)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs2 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(LOCALE)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs3 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs4 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GREEN))
             .build()
         val attrs5 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GREEN))
             .build()
@@ -78,20 +81,12 @@
     @Test
     fun testTypesEquals() {
         val splitTypes = arrayOf(
-            SplitType.splitEqually(),
-            SplitType.expandContainers(),
-            SplitType.splitByHinge(),
-            SplitType.splitByHinge(SplitType.expandContainers())
+            SPLIT_TYPE_EQUAL,
+            SPLIT_TYPE_EXPAND,
+            SPLIT_TYPE_HINGE,
         )
 
         for ((i, type1) in splitTypes.withIndex()) {
-            if (type1 is SplitType.RatioSplitType) {
-                assertEquals(
-                    "Two SplitTypes must regarded as equal if their ratios are the same.",
-                    type1, SplitType.ratio(type1.value)
-                )
-                assertEquals(type1.hashCode(), SplitType.ratio(type1.value).hashCode())
-            }
             for ((j, type2) in splitTypes.withIndex()) {
                 if (i == j) {
                     assertEquals(type1, type2)
@@ -102,6 +97,12 @@
                 }
             }
         }
+
+        assertEquals(
+            "Two SplitTypes must regarded as equal if their ratios are the same.",
+            SPLIT_TYPE_EQUAL, SplitType.ratio(0.5f)
+        )
+        assertEquals(SPLIT_TYPE_EQUAL.hashCode(), SplitType.ratio(0.5f).hashCode())
     }
 
     @Test
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
index d97e70a..111a858 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -43,9 +43,14 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.ratio
 import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.core.util.function.Function
 import androidx.window.extensions.core.util.function.Predicate
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_ADJACENT
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_ALWAYS
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_NEVER
@@ -91,8 +96,14 @@
 
     internal fun translate(splitAttributes: OEMSplitAttributes): SplitAttributes =
         SplitAttributes.Builder()
-            .setSplitType(translate(splitAttributes.splitType))
-            .setLayoutDirection(
+            .setSplitType(
+                when (val splitType = splitAttributes.splitType) {
+                    is OEMSplitType.HingeSplitType -> SPLIT_TYPE_HINGE
+                    is OEMSplitType.ExpandContainersSplitType -> SPLIT_TYPE_EXPAND
+                    is OEMSplitType.RatioSplitType -> ratio(splitType.ratio)
+                    else -> throw IllegalArgumentException("Unknown split type: $splitType")
+                }
+            ).setLayoutDirection(
                 when (val layoutDirection = splitAttributes.layoutDirection) {
                     OEMSplitAttributes.LayoutDirection.LEFT_TO_RIGHT -> LEFT_TO_RIGHT
                     OEMSplitAttributes.LayoutDirection.RIGHT_TO_LEFT -> RIGHT_TO_LEFT
@@ -109,26 +120,6 @@
             )
             .build()
 
-    private fun translate(splitType: OEMSplitType): SplitType =
-        when (splitType) {
-            is OEMSplitType.RatioSplitType -> translate(splitType)
-            is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
-            is OEMSplitType.HingeSplitType -> translate(splitType)
-            else -> throw IllegalArgumentException("Unsupported split type: $splitType")
-        }
-
-    private fun translate(hinge: OEMSplitType.HingeSplitType): SplitType.HingeSplitType =
-        SplitType.splitByHinge(
-            when (val splitType = hinge.fallbackSplitType) {
-                is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
-                is OEMSplitType.RatioSplitType -> translate(splitType)
-                else -> throw IllegalArgumentException("Unsupported split type: $splitType")
-            }
-        )
-
-    private fun translate(splitRatio: OEMSplitType.RatioSplitType): SplitType.RatioSplitType =
-        SplitType.ratio(splitRatio.ratio)
-
     @OptIn(ExperimentalWindowApi::class)
     fun translateSplitAttributesCalculator(
         calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
@@ -205,7 +196,7 @@
         }
     }
 
-    internal fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
+    fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
         require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
         // To workaround the "unused" error in ktlint. It is necessary to translate SplitAttributes
         // from WM Jetpack version to WM extension version.
@@ -230,25 +221,22 @@
     private fun translateSplitType(splitType: SplitType): OEMSplitType {
         require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
         return when (splitType) {
-            is SplitType.HingeSplitType -> translateHinge(splitType)
-            is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
-            is SplitType.RatioSplitType -> translateRatio(splitType)
-            else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
+            SPLIT_TYPE_HINGE -> OEMSplitType.HingeSplitType(
+                translateSplitType(SPLIT_TYPE_EQUAL)
+            )
+            SPLIT_TYPE_EXPAND -> OEMSplitType.ExpandContainersSplitType()
+            else -> {
+                val ratio = splitType.value
+                if (ratio > 0.0 && ratio < 1.0) {
+                    RatioSplitType(ratio)
+                } else {
+                    throw IllegalArgumentException("Unsupported SplitType: $splitType with value:" +
+                        " ${splitType.value}")
+                }
+            }
         }
     }
 
-    private fun translateHinge(hinge: SplitType.HingeSplitType): OEMSplitType.HingeSplitType =
-        OEMSplitType.HingeSplitType(
-            when (val splitType = hinge.fallbackSplitType) {
-                is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
-                is SplitType.RatioSplitType -> translateRatio(splitType)
-                else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
-            }
-        )
-
-    private fun translateRatio(splitRatio: SplitType.RatioSplitType): OEMSplitType.RatioSplitType =
-        OEMSplitType.RatioSplitType(splitRatio.ratio)
-
     private fun translateSplitPlaceholderRule(
         context: Context,
         rule: SplitPlaceholderRule,
@@ -490,7 +478,7 @@
          * higher.
          */
         private fun isSplitAttributesSupported(attrs: SplitAttributes) =
-            attrs.splitType is SplitType.RatioSplitType &&
+            attrs.splitType.value in 0.0..1.0 && attrs.splitType.value != 1.0f &&
                 attrs.layoutDirection in arrayOf(LEFT_TO_RIGHT, RIGHT_TO_LEFT, LOCALE)
 
         @SuppressLint("ClassVerificationFailure", "NewApi")
@@ -513,40 +501,16 @@
                 splitRule.checkParentMetrics(context, windowMetrics)
             }
 
-        // TODO(b/267391190): Remove the NoSuchMethodError in EmbeddingAdapter
-        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo {
-            val primaryActivityStack = splitInfo.primaryActivityStack
-            val isPrimaryStackEmpty = try {
-                primaryActivityStack.isEmpty
-            } catch (e: NoSuchMethodError) {
-                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
-                // value for this case to avoid crash.
-                false
-            }
-            val primaryFragment = ActivityStack(
-                primaryActivityStack.activities,
-                isPrimaryStackEmpty
+        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo = SplitInfo(
+                ActivityStack(
+                    splitInfo.primaryActivityStack.activities,
+                    splitInfo.primaryActivityStack.isEmpty,
+                ),
+                ActivityStack(
+                    splitInfo.secondaryActivityStack.activities,
+                    splitInfo.secondaryActivityStack.isEmpty,
+                ),
+                getSplitAttributesCompat(splitInfo),
             )
-
-            val secondaryActivityStack = splitInfo.secondaryActivityStack
-            val isSecondaryStackEmpty = try {
-                secondaryActivityStack.isEmpty
-            } catch (e: NoSuchMethodError) {
-                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
-                // value for this case to avoid crash.
-                false
-            }
-            val secondaryFragment = ActivityStack(
-                secondaryActivityStack.activities,
-                isSecondaryStackEmpty
-            )
-
-            val splitAttributes = getSplitAttributesCompat(splitInfo)
-            return SplitInfo(
-                primaryFragment,
-                secondaryFragment,
-                splitAttributes
-            )
-        }
     }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
index 64219d2..645a56d 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
@@ -25,7 +25,7 @@
 import androidx.window.core.VerificationMode
 import androidx.window.embedding.SplitAttributes.BackgroundColor
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
-import androidx.window.embedding.SplitAttributes.SplitType.Companion.splitEqually
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 
 /**
  * Attributes that describe how the parent window (typically the activity task
@@ -65,7 +65,7 @@
      * The split type attribute. Defaults to an equal split of the parent window
      * for the primary and secondary containers.
      */
-    val splitType: SplitType = splitEqually(),
+    val splitType: SplitType = SPLIT_TYPE_EQUAL,
 
     /**
      * The layout direction attribute for the parent window split. The default
@@ -90,7 +90,7 @@
      * The type of parent window split, which defines the proportion of the
      * parent window occupied by the primary and secondary activity containers.
      */
-    open class SplitType internal constructor(
+    class SplitType internal constructor(
 
         /**
          * The description of this `SplitType`.
@@ -135,53 +135,9 @@
         override fun hashCode(): Int = description.hashCode() + 31 * value.hashCode()
 
         /**
-         * A window split that's based on the ratio of the size of the primary
-         * container to the size of the parent window.
-         *
-         * @see SplitAttributes.SplitType.ratio
-         */
-        class RatioSplitType internal constructor(
-
-            /**
-             * The proportion of the parent window occupied by the primary
-             * container of the split.
-             */
-            @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
-            val ratio: Float
-
-        ) : SplitType("ratio:$ratio", ratio)
-
-        /**
-         * A window split in which the primary and secondary activity containers
-         * each occupy the entire parent window.
-         *
-         * The secondary container overlays the primary container.
-         *
-         * @see SplitAttributes.SplitType.ExpandContainersSplitType
-         */
-        class ExpandContainersSplitType internal constructor() : SplitType("expandContainer", 0.0f)
-
-        /**
-         * A parent window split that conforms to a hinge or separating fold in
-         * the device display.
-         *
-         * @see SplitAttributes.SplitType.splitByHinge
-         */
-        class HingeSplitType internal constructor(
-
-            /**
-             * The split type to use if a split based on the device hinge or
-             * separating fold cannot be determined.
-             */
-            val fallbackSplitType: SplitType
-
-        ) : SplitType("hinge, fallback=$fallbackSplitType", -1.0f)
-
-        /**
          * Methods that create various split types.
          */
         companion object {
-
             /**
              * Creates a split type based on the proportion of the parent window
              * occupied by the primary container of the split.
@@ -197,13 +153,13 @@
              *
              * @param ratio The proportion of the parent window occupied by the
              *     primary container of the split.
-             * @return An instance of [RatioSplitType] with the specified ratio.
+             * @return An instance of `SplitType` with the specified ratio.
              */
             @JvmStatic
             fun ratio(
                 @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
                 ratio: Float
-            ): RatioSplitType {
+            ): SplitType {
                 val checkedRatio = ratio.startSpecification(
                     TAG,
                     VerificationMode.STRICT
@@ -211,45 +167,37 @@
                     "Use SplitType.expandContainers() instead of 0 or 1.") {
                     ratio in 0.0..1.0 && ratio !in arrayOf(0.0f, 1.0f)
                 }.compute()!!
-                return RatioSplitType(checkedRatio)
+                return SplitType("ratio:$checkedRatio", checkedRatio)
             }
 
-            private val EXPAND_CONTAINERS = ExpandContainersSplitType()
-
             /**
-             * Creates a split type in which the primary and secondary activity
-             * containers each expand to fill the parent window; the secondary
-             * container overlays the primary container.
+             * A split type in which the primary and secondary activity containers each expand to
+             * fill the parent window; the secondary container overlays the primary container.
              *
-             * Use this method with the function set in
+             * It is useful to use this `SplitType` with the function set in
              * [SplitController.setSplitAttributesCalculator] to expand the activity containers in
-             * some device states. The following sample shows how to always fill the parent bounds
-             * if the device is in portrait orientation:
+             * some device or window states. The following sample shows how to always fill the
+             * parent bounds if the device is in portrait orientation:
              *
              * @sample androidx.window.samples.embedding.expandContainersInPortrait
-             *
-             * @return An instance of [ExpandContainersSplitType].
              */
-            @JvmStatic
-            fun expandContainers(): ExpandContainersSplitType = EXPAND_CONTAINERS
+            @JvmField
+            val SPLIT_TYPE_EXPAND = SplitType("expandContainers", 0.0f)
 
             /**
-             * Creates a split type in which the primary and secondary
-             * containers occupy equal portions of the parent window.
+             * A split type in which the primary and secondary containers occupy equal portions of
+             * the parent window.
              *
              * Serves as the default [SplitType].
-             *
-             * @return A `RatioSplitType` in which the activity containers
-             *     occupy equal portions of the parent window.
              */
-            @JvmStatic
-            fun splitEqually(): RatioSplitType = ratio(0.5f)
+            @JvmField
+            val SPLIT_TYPE_EQUAL = ratio(0.5f)
 
             /**
-             * Creates a split type in which the split ratio conforms to the
+             * A split type in which the split ratio conforms to the
              * position of a hinge or separating fold in the device display.
              *
-             * The split type is created only if:
+             * The split type works only if:
              * <ul>
              *     <li>The host task is not in multi-window mode (e.g.,
              *         split-screen mode or picture-in-picture mode)</li>
@@ -268,40 +216,29 @@
              *     </li>
              * </ul>
              *
-             * Otherwise, the method falls back to `fallbackSplitType`.
+             * Otherwise, this `SplitType` fallback to show the split with [SPLIT_TYPE_EQUAL].
              *
-             * @param fallbackSplitType The split type to use if a split based
-             *     on the device hinge or separating fold cannot be determined.
-             *     Can be a [RatioSplitType] or [ExpandContainersSplitType].
-             *     Defaults to [SplitType.splitEqually].
-             * @return An instance of [HingeSplitType] with a fallback split
-             *     type.
+             * If the app wants to have another fallback `SplitType` if [SPLIT_TYPE_HINGE] cannot
+             * be applied. It is suggested to use [SplitController.setSplitAttributesCalculator] to
+             * customize the fallback `SplitType`.
+             *
+             * The following sample shows how to fallback to [SPLIT_TYPE_EXPAND]
+             * if there's no hinge area in the parent window container bounds.
+             *
+             * @sample androidx.window.samples.embedding.fallbackToExpandContainersForSplitTypeHinge
              */
-            @JvmStatic
-            fun splitByHinge(
-                fallbackSplitType: SplitType = splitEqually()
-            ): HingeSplitType {
-                val checkedType = fallbackSplitType.startSpecification(
-                    TAG,
-                    VerificationMode.STRICT
-                ).require(
-                    "FallbackSplitType must be a RatioSplitType or ExpandContainerSplitType"
-                ) {
-                    fallbackSplitType is RatioSplitType ||
-                        fallbackSplitType is ExpandContainersSplitType
-                }.compute()!!
-                return HingeSplitType(checkedType)
-            }
+            @JvmField
+            val SPLIT_TYPE_HINGE = SplitType("hinge", -1.0f)
 
+            // TODO(b/241044092): add XML support to SPLIT_TYPE_HINGE
             /**
              * Returns a `SplitType` with the given `value`.
              */
             @SuppressLint("Range") // value = 0.0 is covered.
-            @JvmStatic
             internal fun buildSplitTypeFromValue(
                 @FloatRange(from = 0.0, to = 1.0, toInclusive = false) value: Float
-            ) = if (value == EXPAND_CONTAINERS.value) {
-                    expandContainers()
+            ) = if (value == SPLIT_TYPE_EXPAND.value) {
+                    SPLIT_TYPE_EXPAND
                 } else {
                     ratio(value)
                 }
@@ -558,7 +495,7 @@
      *    window background color.
      */
     class Builder {
-        private var splitType: SplitType = splitEqually()
+        private var splitType = SPLIT_TYPE_EQUAL
         private var layoutDirection = LOCALE
         private var animationBackgroundColor = BackgroundColor.DEFAULT