diff options
| author | 2025-01-16 06:26:03 -0800 | |
|---|---|---|
| committer | 2025-01-16 06:26:03 -0800 | |
| commit | 01611f83aa0774fc227892e49bacbc6da9d8eea3 (patch) | |
| tree | da8c23b8e67f21374403110af0a04fd0ea80197c | |
| parent | 302b7e395a8ef19f2d36e424aa1bf44261ba880c (diff) | |
| parent | 1ce7ab39304a6dee84878dc0e52ac188f14d349d (diff) | |
Merge "[sb] add some table logging for HomeStatusBarViewModel" into main
8 files changed, 248 insertions, 113 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt index 937f333b0065..a1c910d48cef 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt @@ -24,6 +24,8 @@ import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChip import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel +import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel +import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -51,28 +53,15 @@ class FakeHomeStatusBarViewModel( override val shouldShowOperatorNameView = MutableStateFlow(false) override val isClockVisible = - MutableStateFlow( - HomeStatusBarViewModel.VisibilityModel( - visibility = View.GONE, - shouldAnimateChange = false, - ) - ) + MutableStateFlow(VisibilityModel(visibility = View.GONE, shouldAnimateChange = false)) override val isNotificationIconContainerVisible = - MutableStateFlow( - HomeStatusBarViewModel.VisibilityModel( - visibility = View.GONE, - shouldAnimateChange = false, - ) - ) + MutableStateFlow(VisibilityModel(visibility = View.GONE, shouldAnimateChange = false)) override val systemInfoCombinedVis = MutableStateFlow( - HomeStatusBarViewModel.SystemInfoCombinedVisibilityModel( - HomeStatusBarViewModel.VisibilityModel( - visibility = View.GONE, - shouldAnimateChange = false, - ), + SystemInfoCombinedVisibilityModel( + VisibilityModel(visibility = View.GONE, shouldAnimateChange = false), Idle, ) ) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt index 03abcf850d26..e74d009bb909 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt @@ -83,12 +83,11 @@ import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher import com.android.systemui.statusbar.phone.data.repository.fakeDarkIconRepository import com.android.systemui.statusbar.pipeline.shared.domain.interactor.setHomeStatusBarIconBlockList import com.android.systemui.statusbar.pipeline.shared.domain.interactor.setHomeStatusBarInteractorShowOperatorName -import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel +import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Before @@ -423,8 +422,9 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() { fun areNotificationsLightsOut_requiresFlagEnabled() = kosmos.runTest { assertLogsWtf { - val flow = underTest.areNotificationsLightsOut - assertThat(flow).isEqualTo(emptyFlow<Boolean>()) + val latest by collectLastValue(underTest.areNotificationsLightsOut) + // Nothing is emitted + assertThat(latest).isNull() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt index 8daa8037c367..7e76d77abe61 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt @@ -41,8 +41,8 @@ import com.android.systemui.statusbar.notification.icon.ui.viewbinder.ConnectedD import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization +import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel -import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel import javax.inject.Inject import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt index b1cc208e9b43..9c1171fd1ebc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt @@ -57,6 +57,7 @@ import com.android.systemui.statusbar.phone.ui.StatusBarIconController import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarIconBlockListBinder import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarViewBinder import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarVisibilityChangeListener +import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.HomeStatusBarViewModelFactory import javax.inject.Inject @@ -304,11 +305,7 @@ fun StatusBarRoot( fun Disambiguation(viewModel: HomeStatusBarViewModel) { val clockVisibilityModel = viewModel.isClockVisible.collectAsStateWithLifecycle( - initialValue = - HomeStatusBarViewModel.VisibilityModel( - visibility = View.GONE, - shouldAnimateChange = false, - ) + initialValue = VisibilityModel(visibility = View.GONE, shouldAnimateChange = false) ) if (clockVisibilityModel.value.visibility == View.VISIBLE) { Box(modifier = Modifier.fillMaxSize().alpha(0.5f), contentAlignment = Alignment.Center) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/SystemInfoCombinedVisibilityModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/SystemInfoCombinedVisibilityModel.kt new file mode 100644 index 000000000000..e27225270633 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/SystemInfoCombinedVisibilityModel.kt @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.pipeline.shared.ui.model + +import com.android.systemui.log.table.Diffable +import com.android.systemui.log.table.TableRowLogger +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState + +/** The combined visibility + animation state for the system info status bar area */ +data class SystemInfoCombinedVisibilityModel( + val baseVisibility: VisibilityModel, + val animationState: SystemEventAnimationState, +) : Diffable<SystemInfoCombinedVisibilityModel> { + override fun logDiffs(prevVal: SystemInfoCombinedVisibilityModel, row: TableRowLogger) { + if (animationState != prevVal.animationState) { + row.logChange(COL_ANIM, animationState.name) + } + + baseVisibility.logDiffs(prevVal.baseVisibility, row) + } + + override fun logFull(row: TableRowLogger) { + row.logChange(COL_ANIM, animationState.name) + baseVisibility.logFull(row) + } + + companion object { + const val COL_ANIM = "animState" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/VisibilityModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/VisibilityModel.kt new file mode 100644 index 000000000000..7b39ada72c64 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/model/VisibilityModel.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.pipeline.shared.ui.model + +import android.view.View +import com.android.systemui.log.table.Diffable +import com.android.systemui.log.table.TableRowLogger +import com.android.systemui.util.visibilityString + +/** Models the current visibility for a specific child view of status bar. */ +data class VisibilityModel( + @View.Visibility val visibility: Int, + /** True if a visibility change should be animated. */ + val shouldAnimateChange: Boolean, +) : Diffable<VisibilityModel> { + override fun logDiffs(prevVal: VisibilityModel, row: TableRowLogger) { + if (visibility != prevVal.visibility) { + row.logChange(COL_VIS, visibilityString(visibility)) + } + + if (shouldAnimateChange != prevVal.shouldAnimateChange) { + row.logChange(COL_ANIMATE, shouldAnimateChange) + } + } + + override fun logFull(row: TableRowLogger) { + row.logChange(COL_VIS, visibilityString(visibility)) + row.logChange(COL_ANIMATE, shouldAnimateChange) + } + + companion object { + const val COL_VIS = "vis" + const val COL_ANIMATE = "animate" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt index dcd2dbf57b42..5acedf129184 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt @@ -28,6 +28,8 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED import com.android.systemui.keyguard.shared.model.TransitionState +import com.android.systemui.log.table.TableLogBufferFactory +import com.android.systemui.log.table.logDiffsForTable import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor @@ -39,7 +41,6 @@ import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChip import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModel import com.android.systemui.statusbar.events.domain.interactor.SystemStatusEventAnimationInteractor -import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel import com.android.systemui.statusbar.featurepods.popups.ui.viewmodel.StatusBarPopupChipsViewModel @@ -53,7 +54,8 @@ import com.android.systemui.statusbar.phone.domain.interactor.DarkIconInteractor import com.android.systemui.statusbar.phone.domain.interactor.LightsOutInteractor import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarIconBlockListInteractor import com.android.systemui.statusbar.pipeline.shared.domain.interactor.HomeStatusBarInteractor -import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel +import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel +import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -155,19 +157,6 @@ interface HomeStatusBarViewModel { */ val areaTint: Flow<StatusBarTintColor> - /** Models the current visibility for a specific child view of status bar. */ - data class VisibilityModel( - @View.Visibility val visibility: Int, - /** True if a visibility change should be animated. */ - val shouldAnimateChange: Boolean, - ) - - /** The combined visibility + animation state for the system info status bar area */ - data class SystemInfoCombinedVisibilityModel( - val baseVisibility: VisibilityModel, - val animationState: SystemEventAnimationState, - ) - /** Interface for the assisted factory, to allow for providing a fake in tests */ interface HomeStatusBarViewModelFactory { fun create(displayId: Int): HomeStatusBarViewModel @@ -178,6 +167,7 @@ class HomeStatusBarViewModelImpl @AssistedInject constructor( @Assisted thisDisplayId: Int, + tableLoggerFactory: TableLogBufferFactory, homeStatusBarInteractor: HomeStatusBarInteractor, homeStatusBarIconBlockListInteractor: HomeStatusBarIconBlockListInteractor, lightsOutInteractor: LightsOutInteractor, @@ -196,9 +186,19 @@ constructor( statusBarContentInsetsViewModelStore: StatusBarContentInsetsViewModelStore, @Application coroutineScope: CoroutineScope, ) : HomeStatusBarViewModel { + + val tableLogger = tableLoggerFactory.getOrCreate(tableLogBufferName(thisDisplayId), 200) + override val isTransitioningFromLockscreenToOccluded: StateFlow<Boolean> = keyguardTransitionInteractor .isInTransition(Edge.create(from = LOCKSCREEN, to = OCCLUDED)) + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = "", + columnName = COL_LOCK_TO_OCCLUDED, + initialValue = false, + ) .stateIn(coroutineScope, SharingStarted.WhileSubscribed(), initialValue = false) override val transitionFromLockscreenToDreamStartedEvent: Flow<Unit> = @@ -225,20 +225,33 @@ constructor( // which lives elsewhere.) currentScene == Scenes.Gone || isOccluded } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = "", + columnName = COL_ALLOWED_BY_SCENE, + initialValue = false, + ) .stateIn(coroutineScope, SharingStarted.WhileSubscribed(), initialValue = false) override val areNotificationsLightsOut: Flow<Boolean> = if (NotificationsLiveDataStoreRefactor.isUnexpectedlyInLegacyMode()) { - emptyFlow() - } else { - combine( - notificationsInteractor.areAnyNotificationsPresent, - lightsOutInteractor.isLowProfile(thisDisplayId) ?: flowOf(false), - ) { hasNotifications, isLowProfile -> - hasNotifications && isLowProfile - } - .distinctUntilChanged() - } + emptyFlow() + } else { + combine( + notificationsInteractor.areAnyNotificationsPresent, + lightsOutInteractor.isLowProfile(thisDisplayId) ?: flowOf(false), + ) { hasNotifications, isLowProfile -> + hasNotifications && isLowProfile + } + .distinctUntilChanged() + } + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = "", + columnName = COL_NOTIF_LIGHTS_OUT, + initialValue = false, + ) override val areaTint: Flow<StatusBarTintColor> = darkIconInteractor @@ -277,19 +290,26 @@ constructor( override val shouldHomeStatusBarBeVisible = combine( - isHomeStatusBarAllowed, - keyguardInteractor.isSecureCameraActive, - headsUpNotificationInteractor.statusBarHeadsUpStatus, - ) { isHomeStatusBarAllowed, isSecureCameraActive, headsUpState -> - // When launching the camera over the lockscreen, the status icons would typically - // become visible momentarily before animating out, since we're not yet aware that the - // launching camera activity is fullscreen. Even once the activity finishes launching, - // it takes a short time before WM decides that the top app wants to hide the icons and - // tells us to hide them. - // To ensure that this high-visibility animation is smooth, keep the icons hidden during - // a camera launch. See b/257292822. - headsUpState.isPinned || (isHomeStatusBarAllowed && !isSecureCameraActive) - } + isHomeStatusBarAllowed, + keyguardInteractor.isSecureCameraActive, + headsUpNotificationInteractor.statusBarHeadsUpStatus, + ) { isHomeStatusBarAllowed, isSecureCameraActive, headsUpState -> + // When launching the camera over the lockscreen, the status icons would typically + // become visible momentarily before animating out, since we're not yet aware that + // the launching camera activity is fullscreen. Even once the activity finishes + // launching, it takes a short time before WM decides that the top app wants to hide + // the icons and tells us to hide them. To ensure that this high-visibility + // animation is smooth, keep the icons hidden during a camera launch. See + // b/257292822. + headsUpState.isPinned || (isHomeStatusBarAllowed && !isSecureCameraActive) + } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = "", + columnName = COL_VISIBLE, + initialValue = false, + ) private val isAnyChipVisible = if (StatusBarNotifChips.isEnabled) { @@ -313,53 +333,73 @@ constructor( override val shouldShowOperatorNameView: Flow<Boolean> = combine( - shouldHomeStatusBarBeVisible, - hideStartSideContentForHeadsUp, - homeStatusBarInteractor.visibilityViaDisableFlags, - homeStatusBarInteractor.shouldShowOperatorName, - ) { - shouldStatusBarBeVisible, - hideStartSideContentForHeadsUp, - visibilityViaDisableFlags, - shouldShowOperator -> - shouldStatusBarBeVisible && - !hideStartSideContentForHeadsUp && - visibilityViaDisableFlags.isSystemInfoAllowed && - shouldShowOperator - } + shouldHomeStatusBarBeVisible, + hideStartSideContentForHeadsUp, + homeStatusBarInteractor.visibilityViaDisableFlags, + homeStatusBarInteractor.shouldShowOperatorName, + ) { + shouldStatusBarBeVisible, + hideStartSideContentForHeadsUp, + visibilityViaDisableFlags, + shouldShowOperator -> + shouldStatusBarBeVisible && + !hideStartSideContentForHeadsUp && + visibilityViaDisableFlags.isSystemInfoAllowed && + shouldShowOperator + } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = "", + columnName = COL_SHOW_OPERATOR_NAME, + initialValue = false, + ) override val isClockVisible: Flow<VisibilityModel> = combine( - shouldHomeStatusBarBeVisible, - hideStartSideContentForHeadsUp, - homeStatusBarInteractor.visibilityViaDisableFlags, - ) { shouldStatusBarBeVisible, hideStartSideContentForHeadsUp, visibilityViaDisableFlags -> - val showClock = - shouldStatusBarBeVisible && - visibilityViaDisableFlags.isClockAllowed && - !hideStartSideContentForHeadsUp - // Always use View.INVISIBLE here, so that animations work - VisibilityModel(showClock.toVisibleOrInvisible(), visibilityViaDisableFlags.animate) - } + shouldHomeStatusBarBeVisible, + hideStartSideContentForHeadsUp, + homeStatusBarInteractor.visibilityViaDisableFlags, + ) { shouldStatusBarBeVisible, hideStartSideContentForHeadsUp, visibilityViaDisableFlags + -> + val showClock = + shouldStatusBarBeVisible && + visibilityViaDisableFlags.isClockAllowed && + !hideStartSideContentForHeadsUp + // Always use View.INVISIBLE here, so that animations work + VisibilityModel(showClock.toVisibleOrInvisible(), visibilityViaDisableFlags.animate) + } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = COL_PREFIX_CLOCK, + initialValue = VisibilityModel(false.toVisibleOrInvisible(), false), + ) override val isNotificationIconContainerVisible: Flow<VisibilityModel> = combine( - shouldHomeStatusBarBeVisible, - isAnyChipVisible, - homeStatusBarInteractor.visibilityViaDisableFlags, - ) { shouldStatusBarBeVisible, anyChipVisible, visibilityViaDisableFlags -> - val showNotificationIconContainer = - if (anyChipVisible) { - false - } else { - shouldStatusBarBeVisible && - visibilityViaDisableFlags.areNotificationIconsAllowed - } - VisibilityModel( - showNotificationIconContainer.toVisibleOrGone(), - visibilityViaDisableFlags.animate, + shouldHomeStatusBarBeVisible, + isAnyChipVisible, + homeStatusBarInteractor.visibilityViaDisableFlags, + ) { shouldStatusBarBeVisible, anyChipVisible, visibilityViaDisableFlags -> + val showNotificationIconContainer = + if (anyChipVisible) { + false + } else { + shouldStatusBarBeVisible && + visibilityViaDisableFlags.areNotificationIconsAllowed + } + VisibilityModel( + showNotificationIconContainer.toVisibleOrGone(), + visibilityViaDisableFlags.animate, + ) + } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = COL_PREFIX_NOTIF_CONTAINER, + initialValue = VisibilityModel(false.toVisibleOrInvisible(), false), ) - } private val isSystemInfoVisible = combine(shouldHomeStatusBarBeVisible, homeStatusBarInteractor.visibilityViaDisableFlags) { @@ -372,18 +412,19 @@ constructor( override val systemInfoCombinedVis = combine(isSystemInfoVisible, animations.animationState) { sysInfoVisible, animationState -> - HomeStatusBarViewModel.SystemInfoCombinedVisibilityModel( - sysInfoVisible, - animationState, - ) + SystemInfoCombinedVisibilityModel(sysInfoVisible, animationState) } + .distinctUntilChanged() + .logDiffsForTable( + tableLogBuffer = tableLogger, + columnPrefix = COL_PREFIX_SYSTEM_INFO, + initialValue = + SystemInfoCombinedVisibilityModel(VisibilityModel(View.VISIBLE, false), Idle), + ) .stateIn( coroutineScope, SharingStarted.WhileSubscribed(), - HomeStatusBarViewModel.SystemInfoCombinedVisibilityModel( - VisibilityModel(View.VISIBLE, false), - Idle, - ), + SystemInfoCombinedVisibilityModel(VisibilityModel(View.VISIBLE, false), Idle), ) override val iconBlockList: Flow<List<String>> = @@ -408,6 +449,19 @@ constructor( HomeStatusBarViewModel.HomeStatusBarViewModelFactory { override fun create(displayId: Int): HomeStatusBarViewModelImpl } + + companion object { + private const val COL_LOCK_TO_OCCLUDED = "Lock->Occluded" + private const val COL_ALLOWED_BY_SCENE = "allowedByScene" + private const val COL_NOTIF_LIGHTS_OUT = "notifLightsOut" + private const val COL_SHOW_OPERATOR_NAME = "showOperatorName" + private const val COL_VISIBLE = "visible" + private const val COL_PREFIX_CLOCK = "clock" + private const val COL_PREFIX_NOTIF_CONTAINER = "notifContainer" + private const val COL_PREFIX_SYSTEM_INFO = "systemInfo" + + fun tableLogBufferName(displayId: Int) = "HomeStatusBarViewModel[$displayId]" + } } /** Lookup the color for a given view in the status bar */ diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt index db7e31bb2cb6..f8bf3c3fbbd9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt @@ -21,6 +21,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.log.table.tableLogBufferFactory import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor @@ -39,6 +40,7 @@ var Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by Kosmos.Fixture { HomeStatusBarViewModelImpl( testableContext.displayId, + tableLogBufferFactory, homeStatusBarInteractor, homeStatusBarIconBlockListInteractor, lightsOutInteractor, |