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
+ }
+}