Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +12 −31 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ import com.android.systemui.scene.data.repository.Idle import com.android.systemui.scene.data.repository.Transition import com.android.systemui.scene.data.repository.setTransition import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.mockLargeScreenHeaderHelper import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor Loading Loading @@ -116,36 +115,18 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S kosmos.aodBurnInViewModel = aodBurnInViewModel } val testScope = kosmos.testScope val configurationRepository get() = kosmos.fakeConfigurationRepository val keyguardRepository get() = kosmos.fakeKeyguardRepository val keyguardInteractor get() = kosmos.keyguardInteractor val keyguardRootViewModel get() = kosmos.keyguardRootViewModel val keyguardTransitionRepository get() = kosmos.fakeKeyguardTransitionRepository val shadeTestUtil get() = kosmos.shadeTestUtil val sharedNotificationContainerInteractor get() = kosmos.sharedNotificationContainerInteractor val largeScreenHeaderHelper get() = kosmos.mockLargeScreenHeaderHelper val communalSceneRepository get() = kosmos.communalSceneRepository val shadeRepository get() = kosmos.fakeShadeRepository private val testScope = kosmos.testScope private val configurationRepository by lazy { kosmos.fakeConfigurationRepository } private val keyguardRepository by lazy { kosmos.fakeKeyguardRepository } private val keyguardInteractor by lazy { kosmos.keyguardInteractor } private val keyguardRootViewModel by lazy { kosmos.keyguardRootViewModel } private val keyguardTransitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository } private val shadeTestUtil by lazy { kosmos.shadeTestUtil } private val sharedNotificationContainerInteractor by lazy { kosmos.sharedNotificationContainerInteractor } private val largeScreenHeaderHelper by lazy { kosmos.mockLargeScreenHeaderHelper } private val communalSceneRepository by lazy { kosmos.communalSceneRepository } lateinit var underTest: SharedNotificationContainerViewModel Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt +12 −18 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController import dagger.Lazy import javax.inject.Inject Loading @@ -48,7 +47,6 @@ class SharedNotificationContainerInteractor constructor( @ShadeDisplayAware private val context: Context, private val splitShadeStateController: Lazy<SplitShadeStateController>, private val shadeInteractor: Lazy<ShadeInteractor>, configurationInteractor: ConfigurationInteractor, keyguardInteractor: KeyguardInteractor, deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor, Loading @@ -67,23 +65,14 @@ constructor( * distinctUntilChanged() to this would cause configurationBasedDimensions to miss configuration * updates that affect other resources, like margins or the large screen header flag. */ private val dimensionsUpdateEventsWithShouldUseSplitShade: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { combine( configurationInteractor.onAnyConfigurationChange, shadeInteractor.get().isShadeLayoutWide, ) { _, isShadeLayoutWide -> isShadeLayoutWide } } else { configurationInteractor.onAnyConfigurationChange.map { splitShadeStateController.get().shouldUseSplitNotificationShade(context.resources) } } @Deprecated("Use SharedNotificationContainerViewModel.ConfigurationBasedDimensions instead") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = dimensionsUpdateEventsWithShouldUseSplitShade .map { shouldUseSplitShade -> configurationInteractor.onAnyConfigurationChange .map { val shouldUseSplitShade = splitShadeStateController .get() .shouldUseSplitNotificationShade(context.resources) with(context.resources) { ConfigurationBasedDimensions( useSplitShade = shouldUseSplitShade, Loading @@ -102,6 +91,10 @@ constructor( } } .distinctUntilChanged() get() { SceneContainerFlag.assertInLegacyMode() return field } /** * The notification shelf can extend over the lock icon area if: Loading @@ -126,6 +119,7 @@ constructor( _notificationStackChanged.value = _notificationStackChanged.value + 1 } @Deprecated("Use SharedNotificationContainerViewModel.ConfigurationBasedDimensions instead") data class ConfigurationBasedDimensions( val useSplitShade: Boolean, val useLargeScreenHeader: Boolean, Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +105 −48 Original line number Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import android.content.Context import androidx.annotation.VisibleForTesting import com.android.app.tracing.coroutines.flow.flowName import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application Loading Loading @@ -66,10 +68,14 @@ import com.android.systemui.keyguard.ui.viewmodel.OffToLockscreenTransitionViewM import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.shade.shared.model.ShadeMode.Dual import com.android.systemui.shade.shared.model.ShadeMode.Single import com.android.systemui.shade.shared.model.ShadeMode.Split import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor Loading @@ -90,6 +96,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow Loading @@ -108,6 +115,8 @@ constructor( private val interactor: SharedNotificationContainerInteractor, dumpManager: DumpManager, @Application applicationScope: CoroutineScope, private val context: Context, configurationInteractor: ConfigurationInteractor, private val keyguardInteractor: KeyguardInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val shadeInteractor: ShadeInteractor, Loading Loading @@ -145,6 +154,7 @@ constructor( private val communalSceneInteractor: CommunalSceneInteractor, // Lazy because it's only used in the SceneContainer + Dual Shade configuration. headsUpNotificationInteractor: Lazy<HeadsUpNotificationInteractor>, private val largeScreenHeaderHelperLazy: Lazy<LargeScreenHeaderHelper>, unfoldTransitionInteractor: UnfoldTransitionInteractor, ) : FlowDumperImpl(dumpManager) { Loading Loading @@ -187,34 +197,63 @@ constructor( @VisibleForTesting val paddingTopDimen: Flow<Int> = interactor.configurationBasedDimensions .map { if (SceneContainerFlag.isEnabled) { configurationInteractor.onAnyConfigurationChange.map { with(context.resources) { val useLargeScreenHeader = getBoolean(R.bool.config_use_large_screen_shade_header) if (useLargeScreenHeader) { largeScreenHeaderHelperLazy.get().getLargeScreenHeaderHeight() } else { getDimensionPixelSize(R.dimen.notification_panel_margin_top) } } } } else { interactor.configurationBasedDimensions.map { when { it.useLargeScreenHeader -> it.marginTopLargeScreen else -> it.marginTop } } } .distinctUntilChanged() .dumpWhileCollecting("paddingTopDimen") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = interactor.configurationBasedDimensions .map { val marginTop = when { // y position of the NSSL in the window needs to be 0 under scene container SceneContainerFlag.isEnabled -> 0 it.useLargeScreenHeader -> it.marginTopLargeScreen else -> it.marginTop if (SceneContainerFlag.isEnabled) { combine( shadeInteractor.isShadeLayoutWide, configurationInteractor.onAnyConfigurationChange, ) { isShadeLayoutWide, _ -> with(context.resources) { // TODO(b/338033836): Define separate horizontal margins for dual shade. val marginHorizontal = getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal) ConfigurationBasedDimensions( marginStart = if (isShadeLayoutWide) 0 else marginHorizontal, marginEnd = marginHorizontal, marginBottom = getDimensionPixelSize(R.dimen.notification_panel_margin_bottom), // y position of the NSSL in the window needs to be 0 under scene // container marginTop = 0, useSplitShade = isShadeLayoutWide, ) } } } else { interactor.configurationBasedDimensions.map { ConfigurationBasedDimensions( marginStart = if (it.useSplitShade) 0 else it.marginHorizontal, marginEnd = it.marginHorizontal, marginBottom = it.marginBottom, marginTop = marginTop, marginTop = if (it.useLargeScreenHeader) it.marginTopLargeScreen else it.marginTop, useSplitShade = it.useSplitShade, ) } } .distinctUntilChanged() .dumpWhileCollecting("configurationBasedDimensions") Loading Loading @@ -406,7 +445,24 @@ constructor( * notifications unless in splitshade. */ private val alphaForShadeAndQsExpansion: Flow<Float> = if (DualShade.isEnabled) { if (SceneContainerFlag.isEnabled) { shadeInteractor.shadeMode.flatMapLatest { shadeMode -> when (shadeMode) { Single -> combineTransform( shadeInteractor.shadeExpansion, shadeInteractor.qsExpansion, ) { shadeExpansion, qsExpansion -> if (qsExpansion == 1f) { // Ensure HUNs will be visible in QS shade (at least while unlocked) emit(1f) } else if (shadeExpansion > 0f || qsExpansion > 0f) { // Fade as QS shade expands emit(1f - qsExpansion) } } Split -> isAnyExpanded.filter { it }.map { 1f } Dual -> combineTransform( headsUpNotificationInteractor.get().isHeadsUpOrAnimatingAway, shadeInteractor.shadeExpansion, Loading @@ -420,9 +476,10 @@ constructor( emit(1f - qsExpansion) } } } } } else { interactor.configurationBasedDimensions.flatMapLatest { configurationBasedDimensions -> interactor.configurationBasedDimensions.flatMapLatest { configurationBasedDimensions -> combineTransform(shadeInteractor.shadeExpansion, shadeInteractor.qsExpansion) { shadeExpansion, qsExpansion -> Loading packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.policy.splitShadeStateController import kotlinx.coroutines.ExperimentalCoroutinesApi Loading @@ -33,7 +32,6 @@ val Kosmos.sharedNotificationContainerInteractor by SharedNotificationContainerInteractor( context = applicationContext, splitShadeStateController = { splitShadeStateController }, shadeInteractor = { shadeInteractor }, configurationInteractor = configurationInteractor, keyguardInteractor = keyguardInteractor, deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, Loading packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import android.content.applicationContext import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.communal.domain.interactor.communalSceneInteractor import com.android.systemui.dump.dumpManager import com.android.systemui.keyguard.domain.interactor.keyguardInteractor Loading Loading @@ -49,6 +51,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor Loading @@ -61,6 +64,8 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { interactor = sharedNotificationContainerInteractor, dumpManager = dumpManager, applicationScope = applicationCoroutineScope, context = applicationContext, configurationInteractor = configurationInteractor, keyguardInteractor = keyguardInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, shadeInteractor = shadeInteractor, Loading Loading @@ -94,6 +99,7 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { aodBurnInViewModel = aodBurnInViewModel, communalSceneInteractor = communalSceneInteractor, headsUpNotificationInteractor = { headsUpNotificationInteractor }, largeScreenHeaderHelperLazy = { largeScreenHeaderHelper }, unfoldTransitionInteractor = unfoldTransitionInteractor, ) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +12 −31 Original line number Diff line number Diff line Loading @@ -64,7 +64,6 @@ import com.android.systemui.scene.data.repository.Idle import com.android.systemui.scene.data.repository.Transition import com.android.systemui.scene.data.repository.setTransition import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.mockLargeScreenHeaderHelper import com.android.systemui.shade.shadeTestUtil import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor Loading Loading @@ -116,36 +115,18 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S kosmos.aodBurnInViewModel = aodBurnInViewModel } val testScope = kosmos.testScope val configurationRepository get() = kosmos.fakeConfigurationRepository val keyguardRepository get() = kosmos.fakeKeyguardRepository val keyguardInteractor get() = kosmos.keyguardInteractor val keyguardRootViewModel get() = kosmos.keyguardRootViewModel val keyguardTransitionRepository get() = kosmos.fakeKeyguardTransitionRepository val shadeTestUtil get() = kosmos.shadeTestUtil val sharedNotificationContainerInteractor get() = kosmos.sharedNotificationContainerInteractor val largeScreenHeaderHelper get() = kosmos.mockLargeScreenHeaderHelper val communalSceneRepository get() = kosmos.communalSceneRepository val shadeRepository get() = kosmos.fakeShadeRepository private val testScope = kosmos.testScope private val configurationRepository by lazy { kosmos.fakeConfigurationRepository } private val keyguardRepository by lazy { kosmos.fakeKeyguardRepository } private val keyguardInteractor by lazy { kosmos.keyguardInteractor } private val keyguardRootViewModel by lazy { kosmos.keyguardRootViewModel } private val keyguardTransitionRepository by lazy { kosmos.fakeKeyguardTransitionRepository } private val shadeTestUtil by lazy { kosmos.shadeTestUtil } private val sharedNotificationContainerInteractor by lazy { kosmos.sharedNotificationContainerInteractor } private val largeScreenHeaderHelper by lazy { kosmos.mockLargeScreenHeaderHelper } private val communalSceneRepository by lazy { kosmos.communalSceneRepository } lateinit var underTest: SharedNotificationContainerViewModel Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt +12 −18 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController import dagger.Lazy import javax.inject.Inject Loading @@ -48,7 +47,6 @@ class SharedNotificationContainerInteractor constructor( @ShadeDisplayAware private val context: Context, private val splitShadeStateController: Lazy<SplitShadeStateController>, private val shadeInteractor: Lazy<ShadeInteractor>, configurationInteractor: ConfigurationInteractor, keyguardInteractor: KeyguardInteractor, deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor, Loading @@ -67,23 +65,14 @@ constructor( * distinctUntilChanged() to this would cause configurationBasedDimensions to miss configuration * updates that affect other resources, like margins or the large screen header flag. */ private val dimensionsUpdateEventsWithShouldUseSplitShade: Flow<Boolean> = if (SceneContainerFlag.isEnabled) { combine( configurationInteractor.onAnyConfigurationChange, shadeInteractor.get().isShadeLayoutWide, ) { _, isShadeLayoutWide -> isShadeLayoutWide } } else { configurationInteractor.onAnyConfigurationChange.map { splitShadeStateController.get().shouldUseSplitNotificationShade(context.resources) } } @Deprecated("Use SharedNotificationContainerViewModel.ConfigurationBasedDimensions instead") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = dimensionsUpdateEventsWithShouldUseSplitShade .map { shouldUseSplitShade -> configurationInteractor.onAnyConfigurationChange .map { val shouldUseSplitShade = splitShadeStateController .get() .shouldUseSplitNotificationShade(context.resources) with(context.resources) { ConfigurationBasedDimensions( useSplitShade = shouldUseSplitShade, Loading @@ -102,6 +91,10 @@ constructor( } } .distinctUntilChanged() get() { SceneContainerFlag.assertInLegacyMode() return field } /** * The notification shelf can extend over the lock icon area if: Loading @@ -126,6 +119,7 @@ constructor( _notificationStackChanged.value = _notificationStackChanged.value + 1 } @Deprecated("Use SharedNotificationContainerViewModel.ConfigurationBasedDimensions instead") data class ConfigurationBasedDimensions( val useSplitShade: Boolean, val useLargeScreenHeader: Boolean, Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +105 −48 Original line number Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import android.content.Context import androidx.annotation.VisibleForTesting import com.android.app.tracing.coroutines.flow.flowName import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application Loading Loading @@ -66,10 +68,14 @@ import com.android.systemui.keyguard.ui.viewmodel.OffToLockscreenTransitionViewM import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToLockscreenTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.res.R import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.LargeScreenHeaderHelper import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shade.shared.flag.DualShade import com.android.systemui.shade.shared.model.ShadeMode.Dual import com.android.systemui.shade.shared.model.ShadeMode.Single import com.android.systemui.shade.shared.model.ShadeMode.Split import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor Loading @@ -90,6 +96,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow Loading @@ -108,6 +115,8 @@ constructor( private val interactor: SharedNotificationContainerInteractor, dumpManager: DumpManager, @Application applicationScope: CoroutineScope, private val context: Context, configurationInteractor: ConfigurationInteractor, private val keyguardInteractor: KeyguardInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val shadeInteractor: ShadeInteractor, Loading Loading @@ -145,6 +154,7 @@ constructor( private val communalSceneInteractor: CommunalSceneInteractor, // Lazy because it's only used in the SceneContainer + Dual Shade configuration. headsUpNotificationInteractor: Lazy<HeadsUpNotificationInteractor>, private val largeScreenHeaderHelperLazy: Lazy<LargeScreenHeaderHelper>, unfoldTransitionInteractor: UnfoldTransitionInteractor, ) : FlowDumperImpl(dumpManager) { Loading Loading @@ -187,34 +197,63 @@ constructor( @VisibleForTesting val paddingTopDimen: Flow<Int> = interactor.configurationBasedDimensions .map { if (SceneContainerFlag.isEnabled) { configurationInteractor.onAnyConfigurationChange.map { with(context.resources) { val useLargeScreenHeader = getBoolean(R.bool.config_use_large_screen_shade_header) if (useLargeScreenHeader) { largeScreenHeaderHelperLazy.get().getLargeScreenHeaderHeight() } else { getDimensionPixelSize(R.dimen.notification_panel_margin_top) } } } } else { interactor.configurationBasedDimensions.map { when { it.useLargeScreenHeader -> it.marginTopLargeScreen else -> it.marginTop } } } .distinctUntilChanged() .dumpWhileCollecting("paddingTopDimen") val configurationBasedDimensions: Flow<ConfigurationBasedDimensions> = interactor.configurationBasedDimensions .map { val marginTop = when { // y position of the NSSL in the window needs to be 0 under scene container SceneContainerFlag.isEnabled -> 0 it.useLargeScreenHeader -> it.marginTopLargeScreen else -> it.marginTop if (SceneContainerFlag.isEnabled) { combine( shadeInteractor.isShadeLayoutWide, configurationInteractor.onAnyConfigurationChange, ) { isShadeLayoutWide, _ -> with(context.resources) { // TODO(b/338033836): Define separate horizontal margins for dual shade. val marginHorizontal = getDimensionPixelSize(R.dimen.notification_panel_margin_horizontal) ConfigurationBasedDimensions( marginStart = if (isShadeLayoutWide) 0 else marginHorizontal, marginEnd = marginHorizontal, marginBottom = getDimensionPixelSize(R.dimen.notification_panel_margin_bottom), // y position of the NSSL in the window needs to be 0 under scene // container marginTop = 0, useSplitShade = isShadeLayoutWide, ) } } } else { interactor.configurationBasedDimensions.map { ConfigurationBasedDimensions( marginStart = if (it.useSplitShade) 0 else it.marginHorizontal, marginEnd = it.marginHorizontal, marginBottom = it.marginBottom, marginTop = marginTop, marginTop = if (it.useLargeScreenHeader) it.marginTopLargeScreen else it.marginTop, useSplitShade = it.useSplitShade, ) } } .distinctUntilChanged() .dumpWhileCollecting("configurationBasedDimensions") Loading Loading @@ -406,7 +445,24 @@ constructor( * notifications unless in splitshade. */ private val alphaForShadeAndQsExpansion: Flow<Float> = if (DualShade.isEnabled) { if (SceneContainerFlag.isEnabled) { shadeInteractor.shadeMode.flatMapLatest { shadeMode -> when (shadeMode) { Single -> combineTransform( shadeInteractor.shadeExpansion, shadeInteractor.qsExpansion, ) { shadeExpansion, qsExpansion -> if (qsExpansion == 1f) { // Ensure HUNs will be visible in QS shade (at least while unlocked) emit(1f) } else if (shadeExpansion > 0f || qsExpansion > 0f) { // Fade as QS shade expands emit(1f - qsExpansion) } } Split -> isAnyExpanded.filter { it }.map { 1f } Dual -> combineTransform( headsUpNotificationInteractor.get().isHeadsUpOrAnimatingAway, shadeInteractor.shadeExpansion, Loading @@ -420,9 +476,10 @@ constructor( emit(1f - qsExpansion) } } } } } else { interactor.configurationBasedDimensions.flatMapLatest { configurationBasedDimensions -> interactor.configurationBasedDimensions.flatMapLatest { configurationBasedDimensions -> combineTransform(shadeInteractor.shadeExpansion, shadeInteractor.qsExpansion) { shadeExpansion, qsExpansion -> Loading
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.policy.splitShadeStateController import kotlinx.coroutines.ExperimentalCoroutinesApi Loading @@ -33,7 +32,6 @@ val Kosmos.sharedNotificationContainerInteractor by SharedNotificationContainerInteractor( context = applicationContext, splitShadeStateController = { splitShadeStateController }, shadeInteractor = { shadeInteractor }, configurationInteractor = configurationInteractor, keyguardInteractor = keyguardInteractor, deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, Loading
packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import android.content.applicationContext import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.communal.domain.interactor.communalSceneInteractor import com.android.systemui.dump.dumpManager import com.android.systemui.keyguard.domain.interactor.keyguardInteractor Loading Loading @@ -49,6 +51,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor Loading @@ -61,6 +64,8 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { interactor = sharedNotificationContainerInteractor, dumpManager = dumpManager, applicationScope = applicationCoroutineScope, context = applicationContext, configurationInteractor = configurationInteractor, keyguardInteractor = keyguardInteractor, keyguardTransitionInteractor = keyguardTransitionInteractor, shadeInteractor = shadeInteractor, Loading Loading @@ -94,6 +99,7 @@ val Kosmos.sharedNotificationContainerViewModel by Fixture { aodBurnInViewModel = aodBurnInViewModel, communalSceneInteractor = communalSceneInteractor, headsUpNotificationInteractor = { headsUpNotificationInteractor }, largeScreenHeaderHelperLazy = { largeScreenHeaderHelper }, unfoldTransitionInteractor = unfoldTransitionInteractor, ) }