Loading packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt +6 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.lifecycle.DisposableEffectWithLifecycle import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel Loading Loading @@ -86,6 +87,10 @@ constructor( viewModel.notificationsPlaceholderViewModelFactory.create() } DisposableEffectWithLifecycle(Unit) { onDispose { viewModel.onShadeOverlayBoundsChanged(null) } } val isFullWidth = isFullWidthShade() OverlayShade( Loading @@ -94,6 +99,7 @@ constructor( enableTransparency = viewModel.isTransparencyEnabled, modifier = modifier, onScrimClicked = viewModel::onScrimClicked, onBackgroundPlaced = { bounds, _, _ -> viewModel.onShadeOverlayBoundsChanged(bounds) }, header = { if (viewModel.showHeader) { val headerViewModel = Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +8 −2 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope Loading @@ -61,6 +60,7 @@ import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.lifecycle.DisposableEffectWithLifecycle import com.android.compose.animation.scene.mechanics.TileRevealFlag import com.android.compose.lifecycle.LaunchedEffectWithLifecycle import com.android.compose.modifiers.thenIf Loading Loading @@ -153,7 +153,12 @@ constructor( animateFloatAsState(if (showBrightnessMirror) 0f else 1f) // Set the bounds to null when the QuickSettings overlay disappears. DisposableEffect(Unit) { onDispose { contentViewModel.onPanelShapeInWindowChanged(null) } } DisposableEffectWithLifecycle(Unit) { onDispose { contentViewModel.onPanelShapeInWindowChanged(null) contentViewModel.onShadeOverlayBoundsChanged(null) } } LaunchedEffectWithLifecycle(key1 = Unit) { contentViewModel.detectShadeModeChanges() } Loading @@ -164,6 +169,7 @@ constructor( enableTransparency = contentViewModel.isTransparencyEnabled, onScrimClicked = contentViewModel::onScrimClicked, onBackgroundPlaced = { bounds, topCornerRadius, bottomCornerRadius -> contentViewModel.onShadeOverlayBoundsChanged(bounds) contentViewModel.onPanelShapeInWindowChanged( ShadeScrimShape( bounds = ShadeScrimBounds(bounds), Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt +2 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ fun ContentScope.OverlayShade( .element(panelElement) .thenIf(TileRevealFlag.isEnabled) { Modifier.motionDriver(gestureContext) } .panelWidth(isFullWidth) // TODO(440566878): Investigate if this can be optimized by replacing with // onLayoutRectChanged. .onPlaced { coordinates -> val bounds = coordinates.boundsInWindow() val isTopRounded = panelSpec.isFloating Loading packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.testableContext import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import androidx.compose.ui.geometry.Rect import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR Loading Loading @@ -278,4 +279,18 @@ class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(Scenes.Gone) } @Test fun onShadeBoundsChanged_forwardsToShadeOverlayInteractor() = testScope.runTest { var shadeBounds: android.graphics.Rect? = null kosmos.shadeInteractor.addShadeOverlayBoundsListener { shadeBounds = it } assertThat(shadeBounds).isNull() val bounds = Rect(0f, 0f, 100f, 100f) val expectedShadeBounds = android.graphics.Rect(0, 0, 100, 100) underTest.onShadeOverlayBoundsChanged(bounds) assertThat(shadeBounds).isEqualTo(expectedShadeBounds) } } packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.res.Configuration import android.content.testableContext import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.compose.ui.geometry.Rect import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR Loading Loading @@ -183,6 +184,20 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() { disposable.dispose() } @Test fun onShadeBoundsChanged_forwardsToShadeOverlayInteractor() = kosmos.runTest { var shadeBounds: android.graphics.Rect? = null shadeInteractor.addShadeOverlayBoundsListener { shadeBounds = it } assertThat(shadeBounds).isNull() val bounds = Rect(0f, 0f, 100f, 100f) val expectedShadeBounds = android.graphics.Rect(0, 0, 100, 100) underTest.onShadeOverlayBoundsChanged(bounds) assertThat(shadeBounds).isEqualTo(expectedShadeBounds) } @Test fun showHeader_desktopFeatureSetDisabled_true() = kosmos.runTest { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationsShadeOverlay.kt +6 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import com.android.compose.animation.scene.ContentScope import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.lifecycle.DisposableEffectWithLifecycle import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel Loading Loading @@ -86,6 +87,10 @@ constructor( viewModel.notificationsPlaceholderViewModelFactory.create() } DisposableEffectWithLifecycle(Unit) { onDispose { viewModel.onShadeOverlayBoundsChanged(null) } } val isFullWidth = isFullWidthShade() OverlayShade( Loading @@ -94,6 +99,7 @@ constructor( enableTransparency = viewModel.isTransparencyEnabled, modifier = modifier, onScrimClicked = viewModel::onScrimClicked, onBackgroundPlaced = { bounds, _, _ -> viewModel.onShadeOverlayBoundsChanged(bounds) }, header = { if (viewModel.showHeader) { val headerViewModel = Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +8 −2 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope Loading @@ -61,6 +60,7 @@ import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.lifecycle.DisposableEffectWithLifecycle import com.android.compose.animation.scene.mechanics.TileRevealFlag import com.android.compose.lifecycle.LaunchedEffectWithLifecycle import com.android.compose.modifiers.thenIf Loading Loading @@ -153,7 +153,12 @@ constructor( animateFloatAsState(if (showBrightnessMirror) 0f else 1f) // Set the bounds to null when the QuickSettings overlay disappears. DisposableEffect(Unit) { onDispose { contentViewModel.onPanelShapeInWindowChanged(null) } } DisposableEffectWithLifecycle(Unit) { onDispose { contentViewModel.onPanelShapeInWindowChanged(null) contentViewModel.onShadeOverlayBoundsChanged(null) } } LaunchedEffectWithLifecycle(key1 = Unit) { contentViewModel.detectShadeModeChanges() } Loading @@ -164,6 +169,7 @@ constructor( enableTransparency = contentViewModel.isTransparencyEnabled, onScrimClicked = contentViewModel::onScrimClicked, onBackgroundPlaced = { bounds, topCornerRadius, bottomCornerRadius -> contentViewModel.onShadeOverlayBoundsChanged(bounds) contentViewModel.onPanelShapeInWindowChanged( ShadeScrimShape( bounds = ShadeScrimBounds(bounds), Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt +2 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,8 @@ fun ContentScope.OverlayShade( .element(panelElement) .thenIf(TileRevealFlag.isEnabled) { Modifier.motionDriver(gestureContext) } .panelWidth(isFullWidth) // TODO(440566878): Investigate if this can be optimized by replacing with // onLayoutRectChanged. .onPlaced { coordinates -> val bounds = coordinates.boundsInWindow() val isTopRounded = panelSpec.isFloating Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.testableContext import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import androidx.compose.ui.geometry.Rect import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR Loading Loading @@ -278,4 +279,18 @@ class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(Scenes.Gone) } @Test fun onShadeBoundsChanged_forwardsToShadeOverlayInteractor() = testScope.runTest { var shadeBounds: android.graphics.Rect? = null kosmos.shadeInteractor.addShadeOverlayBoundsListener { shadeBounds = it } assertThat(shadeBounds).isNull() val bounds = Rect(0f, 0f, 100f, 100f) val expectedShadeBounds = android.graphics.Rect(0, 0, 100, 100) underTest.onShadeOverlayBoundsChanged(bounds) assertThat(shadeBounds).isEqualTo(expectedShadeBounds) } }
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.res.Configuration import android.content.testableContext import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.compose.ui.geometry.Rect import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR Loading Loading @@ -183,6 +184,20 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() { disposable.dispose() } @Test fun onShadeBoundsChanged_forwardsToShadeOverlayInteractor() = kosmos.runTest { var shadeBounds: android.graphics.Rect? = null shadeInteractor.addShadeOverlayBoundsListener { shadeBounds = it } assertThat(shadeBounds).isNull() val bounds = Rect(0f, 0f, 100f, 100f) val expectedShadeBounds = android.graphics.Rect(0, 0, 100, 100) underTest.onShadeOverlayBoundsChanged(bounds) assertThat(shadeBounds).isEqualTo(expectedShadeBounds) } @Test fun showHeader_desktopFeatureSetDisabled_true() = kosmos.runTest { Loading