summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt54
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt32
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelKosmos.kt2
4 files changed, 107 insertions, 0 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 eef5753cef8a..f8070e817a3e 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
@@ -16,7 +16,10 @@
package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel
+import android.graphics.Color
+import android.graphics.Rect
import android.view.View
+import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChipsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle
@@ -66,4 +69,20 @@ class FakeHomeStatusBarViewModel : HomeStatusBarViewModel {
)
override fun areNotificationsLightsOut(displayId: Int): Flow<Boolean> = areNotificationLightsOut
+
+ val darkRegions = mutableListOf<Rect>()
+
+ var darkIconTint = Color.BLACK
+ var lightIconTint = Color.WHITE
+
+ override fun areaTint(displayId: Int): Flow<StatusBarTintColor> =
+ MutableStateFlow(
+ StatusBarTintColor { viewBounds ->
+ if (DarkIconDispatcher.isInAreas(darkRegions, viewBounds)) {
+ lightIconTint
+ } else {
+ darkIconTint
+ }
+ }
+ )
}
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 5c1141b94bc8..2d09ab66b250 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
@@ -22,6 +22,7 @@ import android.app.StatusBarManager.DISABLE_CLOCK
import android.app.StatusBarManager.DISABLE_NONE
import android.app.StatusBarManager.DISABLE_NOTIFICATION_ICONS
import android.app.StatusBarManager.DISABLE_SYSTEM_INFO
+import android.graphics.Rect
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.View
@@ -45,6 +46,7 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.log.assertLogsWtf
import com.android.systemui.mediaprojection.data.model.MediaProjectionState
import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository
+import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.scene.data.repository.sceneContainerRepository
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.screenrecord.data.model.ScreenRecordModel
@@ -73,6 +75,8 @@ import com.android.systemui.statusbar.notification.headsup.PinnedStatus
import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
import com.android.systemui.statusbar.notification.stack.data.repository.headsUpNotificationRepository
+import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher
+import com.android.systemui.statusbar.phone.data.repository.fakeDarkIconRepository
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -930,6 +934,56 @@ class HomeStatusBarViewModelImplTest : SysuiTestCase() {
assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
}
+ @Test
+ fun areaTint_viewIsInDarkBounds_getsDarkTint() =
+ kosmos.runTest {
+ val displayId = 321
+ fakeDarkIconRepository.darkState(displayId).value =
+ SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC)
+
+ val areaTint by collectLastValue(underTest.areaTint(displayId))
+
+ val tint = areaTint?.tint(Rect(1, 1, 3, 3))
+
+ assertThat(tint).isEqualTo(0xAABBCC)
+ }
+
+ @Test
+ fun areaTint_viewIsNotInDarkBounds_getsDefaultTint() =
+ kosmos.runTest {
+ val displayId = 321
+ fakeDarkIconRepository.darkState(displayId).value =
+ SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC)
+
+ val areaTint by collectLastValue(underTest.areaTint(displayId))
+
+ val tint = areaTint?.tint(Rect(6, 6, 7, 7))
+
+ assertThat(tint).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
+ }
+
+ @Test
+ fun areaTint_viewIsInDarkBounds_darkBoundsChange_viewUpdates() =
+ kosmos.runTest {
+ val displayId = 321
+ fakeDarkIconRepository.darkState(displayId).value =
+ SysuiDarkIconDispatcher.DarkChange(listOf(Rect(0, 0, 5, 5)), 0f, 0xAABBCC)
+
+ val areaTint by collectLastValue(underTest.areaTint(displayId))
+
+ var tint = areaTint?.tint(Rect(1, 1, 3, 3))
+
+ assertThat(tint).isEqualTo(0xAABBCC)
+
+ // Dark region moves 5px to the right
+ fakeDarkIconRepository.darkState(displayId).value =
+ SysuiDarkIconDispatcher.DarkChange(listOf(Rect(5, 0, 10, 5)), 0f, 0xAABBCC)
+
+ tint = areaTint?.tint(Rect(1, 1, 3, 3))
+
+ assertThat(tint).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
+ }
+
private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) =
ActiveNotificationsStore.Builder()
.apply { notifications.forEach(::addIndividualNotif) }
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 6e9e1ec7253c..b472725b833f 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
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.pipeline.shared.ui.viewmodel
+import android.annotation.ColorInt
+import android.graphics.Rect
import android.view.View
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -27,6 +29,7 @@ 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.plugins.DarkIconDispatcher
import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
@@ -43,6 +46,7 @@ import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotif
import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor
import com.android.systemui.statusbar.notification.headsup.PinnedStatus
import com.android.systemui.statusbar.notification.shared.NotificationsLiveDataStoreRefactor
+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.CollapsedStatusBarInteractor
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel
@@ -52,6 +56,7 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filter
@@ -119,6 +124,12 @@ interface HomeStatusBarViewModel {
*/
fun areNotificationsLightsOut(displayId: Int): Flow<Boolean>
+ /**
+ * Given a displayId, returns a flow of [StatusBarTintColor], a functional interface that will
+ * allow a view to calculate its correct tint depending on location
+ */
+ fun areaTint(displayId: Int): Flow<StatusBarTintColor>
+
/** Models the current visibility for a specific child view of status bar. */
data class VisibilityModel(
@View.Visibility val visibility: Int,
@@ -140,6 +151,7 @@ constructor(
collapsedStatusBarInteractor: CollapsedStatusBarInteractor,
private val lightsOutInteractor: LightsOutInteractor,
private val notificationsInteractor: ActiveNotificationsInteractor,
+ private val darkIconInteractor: DarkIconInteractor,
headsUpNotificationInteractor: HeadsUpNotificationInteractor,
keyguardTransitionInteractor: KeyguardTransitionInteractor,
keyguardInteractor: KeyguardInteractor,
@@ -192,6 +204,21 @@ constructor(
.distinctUntilChanged()
}
+ override fun areaTint(displayId: Int): Flow<StatusBarTintColor> =
+ darkIconInteractor
+ .darkState(displayId)
+ .map { (areas: Collection<Rect>, tint: Int) ->
+ StatusBarTintColor { viewBounds: Rect ->
+ if (DarkIconDispatcher.isInAreas(areas, viewBounds)) {
+ tint
+ } else {
+ DarkIconDispatcher.DEFAULT_ICON_TINT
+ }
+ }
+ }
+ .conflate()
+ .distinctUntilChanged()
+
/**
* True if the current SysUI state can show the home status bar (aka this status bar), and false
* if we shouldn't be showing any part of the home status bar.
@@ -302,3 +329,8 @@ constructor(
@View.Visibility
private fun Boolean.toVisibleOrInvisible(): Int = if (this) View.VISIBLE else View.INVISIBLE
}
+
+/** Lookup the color for a given view in the status bar */
+fun interface StatusBarTintColor {
+ @ColorInt fun tint(viewBounds: Rect): Int
+}
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 eb17237afbb5..f46a6cc8c8ec 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
@@ -27,6 +27,7 @@ import com.android.systemui.statusbar.chips.ui.viewmodel.ongoingActivityChipsVie
import com.android.systemui.statusbar.events.domain.interactor.systemStatusEventAnimationInteractor
import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
+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.collapsedStatusBarInteractor
@@ -36,6 +37,7 @@ val Kosmos.homeStatusBarViewModel: HomeStatusBarViewModel by
collapsedStatusBarInteractor,
lightsOutInteractor,
activeNotificationsInteractor,
+ darkIconInteractor,
headsUpNotificationInteractor,
keyguardTransitionInteractor,
keyguardInteractor,