enableEdgeToEdge draws around display cutout

Bug: 311173461
Test: EdgeToEdgeTest
Change-Id: I02a53d632d9c95fe466da04ce500a8d471e5001a
diff --git a/activity/activity/src/androidTest/java/androidx/activity/EdgeToEdgeTest.kt b/activity/activity/src/androidTest/java/androidx/activity/EdgeToEdgeTest.kt
index 671c7f2..3dccbc9 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/EdgeToEdgeTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/EdgeToEdgeTest.kt
@@ -18,6 +18,7 @@
 
 import android.graphics.Color
 import android.os.Build
+import android.view.WindowManager
 import androidx.core.view.WindowInsetsControllerCompat
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -59,6 +60,15 @@
                         assertThat(isAppearanceLightStatusBars).isTrue()
                     }
                 }
+                if (Build.VERSION.SDK_INT >= 30) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+                    )
+                } else if (Build.VERSION.SDK_INT >= 28) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+                    )
+                }
             }
         }
     }
@@ -94,6 +104,15 @@
                         assertThat(isAppearanceLightStatusBars).isTrue()
                     }
                 }
+                if (Build.VERSION.SDK_INT >= 30) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+                    )
+                } else if (Build.VERSION.SDK_INT >= 28) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+                    )
+                }
             }
         }
     }
@@ -121,6 +140,15 @@
                         assertThat(isAppearanceLightStatusBars).isFalse()
                     }
                 }
+                if (Build.VERSION.SDK_INT >= 30) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+                    )
+                } else if (Build.VERSION.SDK_INT >= 28) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+                    )
+                }
             }
         }
     }
@@ -148,6 +176,15 @@
                         assertThat(isAppearanceLightStatusBars).isTrue()
                     }
                 }
+                if (Build.VERSION.SDK_INT >= 30) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+                    )
+                } else if (Build.VERSION.SDK_INT >= 28) {
+                    assertThat(window.attributes.layoutInDisplayCutoutMode).isEqualTo(
+                        WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+                    )
+                }
             }
         }
     }
diff --git a/activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt b/activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt
index 991ea29..8132955 100644
--- a/activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt
+++ b/activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt
@@ -75,8 +75,12 @@
     val view = window.decorView
     val statusBarIsDark = statusBarStyle.detectDarkMode(view.resources)
     val navigationBarIsDark = navigationBarStyle.detectDarkMode(view.resources)
-    val impl = Impl ?: if (Build.VERSION.SDK_INT >= 29) {
+    val impl = Impl ?: if (Build.VERSION.SDK_INT >= 30) {
+        EdgeToEdgeApi30()
+    } else if (Build.VERSION.SDK_INT >= 29) {
         EdgeToEdgeApi29()
+    } else if (Build.VERSION.SDK_INT >= 28) {
+        EdgeToEdgeApi28()
     } else if (Build.VERSION.SDK_INT >= 26) {
         EdgeToEdgeApi26()
     } else if (Build.VERSION.SDK_INT >= 23) {
@@ -89,6 +93,7 @@
     impl.setUp(
         statusBarStyle, navigationBarStyle, window, view, statusBarIsDark, navigationBarIsDark
     )
+    impl.adjustLayoutInDisplayCutoutMode(window)
 }
 
 /**
@@ -198,9 +203,11 @@
         statusBarIsDark: Boolean,
         navigationBarIsDark: Boolean
     )
+
+    fun adjustLayoutInDisplayCutoutMode(window: Window)
 }
 
-private class EdgeToEdgeBase : EdgeToEdgeImpl {
+private open class EdgeToEdgeBase : EdgeToEdgeImpl {
 
     override fun setUp(
         statusBarStyle: SystemBarStyle,
@@ -212,10 +219,14 @@
     ) {
         // No edge-to-edge before SDK 21.
     }
+
+    override fun adjustLayoutInDisplayCutoutMode(window: Window) {
+        // No display cutout before SDK 28.
+    }
 }
 
 @RequiresApi(21)
-private class EdgeToEdgeApi21 : EdgeToEdgeImpl {
+private class EdgeToEdgeApi21 : EdgeToEdgeBase() {
 
     @Suppress("DEPRECATION")
     @DoNotInline
@@ -234,7 +245,7 @@
 }
 
 @RequiresApi(23)
-private class EdgeToEdgeApi23 : EdgeToEdgeImpl {
+private class EdgeToEdgeApi23 : EdgeToEdgeBase() {
 
     @DoNotInline
     override fun setUp(
@@ -253,7 +264,7 @@
 }
 
 @RequiresApi(26)
-private class EdgeToEdgeApi26 : EdgeToEdgeImpl {
+private open class EdgeToEdgeApi26 : EdgeToEdgeBase() {
 
     @DoNotInline
     override fun setUp(
@@ -274,8 +285,18 @@
     }
 }
 
+@RequiresApi(28)
+private class EdgeToEdgeApi28 : EdgeToEdgeApi26() {
+
+    @DoNotInline
+    override fun adjustLayoutInDisplayCutoutMode(window: Window) {
+        window.attributes.layoutInDisplayCutoutMode =
+            WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
+    }
+}
+
 @RequiresApi(29)
-private class EdgeToEdgeApi29 : EdgeToEdgeImpl {
+private open class EdgeToEdgeApi29 : EdgeToEdgeBase() {
 
     @DoNotInline
     override fun setUp(
@@ -299,3 +320,13 @@
         }
     }
 }
+
+@RequiresApi(29)
+private class EdgeToEdgeApi30 : EdgeToEdgeApi29() {
+
+    @DoNotInline
+    override fun adjustLayoutInDisplayCutoutMode(window: Window) {
+        window.attributes.layoutInDisplayCutoutMode =
+            WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
+    }
+}