summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt7
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt16
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt23
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt41
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt35
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/shared/model/BrightnessLog.kt (renamed from packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.kt)17
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/shared/model/GammaBrightness.kt50
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/shared/model/LinearBrightness.kt65
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt14
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt2
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt11
14 files changed, 254 insertions, 70 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt
index e39ad4f0b405..a676c7db4290 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/data/repository/ScreenBrightnessDisplayManagerRepositoryTest.kt
@@ -25,15 +25,18 @@ import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.shared.model.LinearBrightness
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
+import com.android.systemui.log.core.FakeLogBuffer
+import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -74,6 +77,8 @@ class ScreenBrightnessDisplayManagerRepositoryTest : SysuiTestCase() {
ScreenBrightnessDisplayManagerRepository(
displayId,
displayManager,
+ FakeLogBuffer.Factory.create(),
+ mock<TableLogBuffer>(),
kosmos.applicationCoroutineScope,
kosmos.testDispatcher,
)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt
index 33c44f8a331e..b6616bf0c8de 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorTest.kt
@@ -20,13 +20,16 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.display.BrightnessUtils
import com.android.systemui.SysuiTestCase
-import com.android.systemui.brightness.data.model.LinearBrightness
import com.android.systemui.brightness.data.repository.fakeScreenBrightnessRepository
import com.android.systemui.brightness.data.repository.screenBrightnessRepository
-import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.shared.model.GammaBrightness
+import com.android.systemui.brightness.shared.model.LinearBrightness
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
+import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
@@ -41,7 +44,14 @@ class ScreenBrightnessInteractorTest : SysuiTestCase() {
private val kosmos = testKosmos()
- private val underTest = ScreenBrightnessInteractor(kosmos.screenBrightnessRepository)
+ private val underTest =
+ with(kosmos) {
+ ScreenBrightnessInteractor(
+ screenBrightnessRepository,
+ applicationCoroutineScope,
+ mock<TableLogBuffer>()
+ )
+ }
@Test
fun gammaBrightness() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
index 0058ee4a9c4e..8402676dbd6b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelTest.kt
@@ -20,15 +20,16 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.display.BrightnessUtils
import com.android.systemui.SysuiTestCase
-import com.android.systemui.brightness.data.model.LinearBrightness
import com.android.systemui.brightness.data.repository.fakeScreenBrightnessRepository
import com.android.systemui.brightness.domain.interactor.brightnessPolicyEnforcementInteractor
import com.android.systemui.brightness.domain.interactor.screenBrightnessInteractor
-import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.shared.model.GammaBrightness
+import com.android.systemui.brightness.shared.model.LinearBrightness
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.testKosmos
@@ -52,6 +53,7 @@ class BrightnessSliderViewModelTest : SysuiTestCase() {
BrightnessSliderViewModel(
screenBrightnessInteractor,
brightnessPolicyEnforcementInteractor,
+ applicationCoroutineScope,
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt b/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt
index 2b9fc73458d8..7a9429e56c88 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/dagger/ScreenBrightnessModule.kt
@@ -20,8 +20,15 @@ import com.android.systemui.brightness.data.repository.BrightnessPolicyRepositor
import com.android.systemui.brightness.data.repository.BrightnessPolicyRepositoryImpl
import com.android.systemui.brightness.data.repository.ScreenBrightnessDisplayManagerRepository
import com.android.systemui.brightness.data.repository.ScreenBrightnessRepository
+import com.android.systemui.brightness.shared.model.BrightnessLog
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.LogBufferFactory
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.log.table.TableLogBufferFactory
import dagger.Binds
import dagger.Module
+import dagger.Provides
@Module
interface ScreenBrightnessModule {
@@ -33,4 +40,20 @@ interface ScreenBrightnessModule {
@Binds
fun bindPolicyRepository(impl: BrightnessPolicyRepositoryImpl): BrightnessPolicyRepository
+
+ companion object {
+ @Provides
+ @SysUISingleton
+ @BrightnessLog
+ fun providesBrightnessTableLog(factory: TableLogBufferFactory): TableLogBuffer {
+ return factory.create("BrightnessTableLog", 50)
+ }
+
+ @Provides
+ @SysUISingleton
+ @BrightnessLog
+ fun providesBrightnessLog(factory: LogBufferFactory): LogBuffer {
+ return factory.create("BrightnessLog", 50)
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt
deleted file mode 100644
index 608f301da85d..000000000000
--- a/packages/SystemUI/src/com/android/systemui/brightness/data/model/LinearBrightness.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2024 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.brightness.data.model
-
-@JvmInline
-value class LinearBrightness(val floatValue: Float) {
- fun clamp(min: LinearBrightness, max: LinearBrightness): LinearBrightness {
- return if (floatValue < min.floatValue) {
- min
- } else if (floatValue > max.floatValue) {
- max
- } else {
- this
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt
index 9ed11d13d4d4..37d1887730b9 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt
@@ -19,12 +19,18 @@ package com.android.systemui.brightness.data.repository
import android.annotation.SuppressLint
import android.hardware.display.BrightnessInfo
import android.hardware.display.DisplayManager
-import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.shared.model.BrightnessLog
+import com.android.systemui.brightness.shared.model.LinearBrightness
+import com.android.systemui.brightness.shared.model.formatBrightness
+import com.android.systemui.brightness.shared.model.logDiffForTable
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.DisplayId
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.table.TableLogBuffer
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineScope
@@ -32,13 +38,13 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
-import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -78,6 +84,8 @@ class ScreenBrightnessDisplayManagerRepository
constructor(
@DisplayId private val displayId: Int,
private val displayManager: DisplayManager,
+ @BrightnessLog private val logBuffer: LogBuffer,
+ @BrightnessLog private val tableBuffer: TableLogBuffer,
@Application private val applicationScope: CoroutineScope,
@Background private val backgroundContext: CoroutineContext,
) : ScreenBrightnessRepository {
@@ -100,6 +108,7 @@ constructor(
displayManager.setBrightness(displayId, value)
}
}
+ logBrightnessChange(call is SetBrightnessMethod.Permanent, value)
}
}
}
@@ -147,13 +156,15 @@ constructor(
brightnessInfo
.filterNotNull()
.map { LinearBrightness(it.brightnessMinimum) }
- .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+ .logDiffForTable(tableBuffer, TABLE_PREFIX_LINEAR, TABLE_COLUMN_MIN, null)
+ .stateIn(applicationScope, SharingStarted.WhileSubscribed(), LinearBrightness(0f))
- override val maxLinearBrightness =
+ override val maxLinearBrightness: SharedFlow<LinearBrightness> =
brightnessInfo
.filterNotNull()
.map { LinearBrightness(it.brightnessMaximum) }
- .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+ .logDiffForTable(tableBuffer, TABLE_PREFIX_LINEAR, TABLE_COLUMN_MAX, null)
+ .stateIn(applicationScope, SharingStarted.WhileSubscribed(), LinearBrightness(1f))
override suspend fun getMinMaxLinearBrightness(): Pair<LinearBrightness, LinearBrightness> {
val brightnessInfo = brightnessInfo.value ?: brightnessInfoValue()
@@ -166,7 +177,8 @@ constructor(
brightnessInfo
.filterNotNull()
.map { LinearBrightness(it.brightness) }
- .shareIn(applicationScope, SharingStarted.WhileSubscribed())
+ .logDiffForTable(tableBuffer, TABLE_PREFIX_LINEAR, TABLE_COLUMN_BRIGHTNESS, null)
+ .stateIn(applicationScope, SharingStarted.WhileSubscribed(), LinearBrightness(0f))
override fun setTemporaryBrightness(value: LinearBrightness) {
apiQueue.trySend(SetBrightnessMethod.Temporary(value))
@@ -183,4 +195,21 @@ constructor(
@JvmInline
value class Permanent(override val value: LinearBrightness) : SetBrightnessMethod
}
+
+ private fun logBrightnessChange(permanent: Boolean, value: Float) {
+ logBuffer.log(
+ LOG_BUFFER_BRIGHTNESS_CHANGE_TAG,
+ if (permanent) LogLevel.DEBUG else LogLevel.VERBOSE,
+ { str1 = value.formatBrightness() },
+ { "Change requested: $str1" }
+ )
+ }
+
+ private companion object {
+ const val TABLE_COLUMN_BRIGHTNESS = "brightness"
+ const val TABLE_COLUMN_MIN = "min"
+ const val TABLE_COLUMN_MAX = "max"
+ const val TABLE_PREFIX_LINEAR = "linear"
+ const val LOG_BUFFER_BRIGHTNESS_CHANGE_TAG = "BrightnessChange"
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt
index 799a0a14c99d..5647f521762f 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractor.kt
@@ -17,12 +17,20 @@
package com.android.systemui.brightness.domain.interactor
import com.android.settingslib.display.BrightnessUtils
-import com.android.systemui.brightness.data.model.LinearBrightness
import com.android.systemui.brightness.data.repository.ScreenBrightnessRepository
-import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.shared.model.BrightnessLog
+import com.android.systemui.brightness.shared.model.GammaBrightness
+import com.android.systemui.brightness.shared.model.LinearBrightness
+import com.android.systemui.brightness.shared.model.logDiffForTable
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.log.table.TableLogBuffer
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.stateIn
/**
* Converts between [GammaBrightness] and [LinearBrightness].
@@ -34,6 +42,8 @@ class ScreenBrightnessInteractor
@Inject
constructor(
private val screenBrightnessRepository: ScreenBrightnessRepository,
+ @Application private val applicationScope: CoroutineScope,
+ @BrightnessLog private val tableBuffer: TableLogBuffer,
) {
/** Maximum value in the Gamma space for brightness */
val maxGammaBrightness = GammaBrightness(BrightnessUtils.GAMMA_SPACE_MAX)
@@ -45,15 +55,17 @@ constructor(
* Brightness in the Gamma space for the current display. It will always represent a value
* between [minGammaBrightness] and [maxGammaBrightness]
*/
- val gammaBrightness =
+ val gammaBrightness: Flow<GammaBrightness> =
with(screenBrightnessRepository) {
combine(
- linearBrightness,
- minLinearBrightness,
- maxLinearBrightness,
- ) { brightness, min, max ->
- brightness.toGammaBrightness(min, max)
- }
+ linearBrightness,
+ minLinearBrightness,
+ maxLinearBrightness,
+ ) { brightness, min, max ->
+ brightness.toGammaBrightness(min, max)
+ }
+ .logDiffForTable(tableBuffer, TABLE_PREFIX_GAMMA, TABLE_COLUMN_BRIGHTNESS, null)
+ .stateIn(applicationScope, SharingStarted.WhileSubscribed(), GammaBrightness(0))
}
/** Sets the brightness temporarily, while the user is changing it. */
@@ -91,4 +103,9 @@ constructor(
BrightnessUtils.convertLinearToGammaFloat(floatValue, min.floatValue, max.floatValue)
)
}
+
+ private companion object {
+ const val TABLE_COLUMN_BRIGHTNESS = "brightness"
+ const val TABLE_PREFIX_GAMMA = "gamma"
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/BrightnessLog.kt
index e20d003bb989..b514fefbff0e 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/shared/GammaBrightness.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/BrightnessLog.kt
@@ -14,16 +14,11 @@
* limitations under the License.
*/
-package com.android.systemui.brightness.shared
+package com.android.systemui.brightness.shared.model
-import androidx.annotation.IntRange
-import com.android.settingslib.display.BrightnessUtils
+import javax.inject.Qualifier
-@JvmInline
-value class GammaBrightness(
- @IntRange(
- from = BrightnessUtils.GAMMA_SPACE_MIN.toLong(),
- to = BrightnessUtils.GAMMA_SPACE_MAX.toLong()
- )
- val value: Int
-)
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class BrightnessLog()
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/shared/model/GammaBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/GammaBrightness.kt
new file mode 100644
index 000000000000..7eba6268869c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/GammaBrightness.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 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.brightness.shared.model
+
+import androidx.annotation.IntRange
+import com.android.settingslib.display.BrightnessUtils
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.util.kotlin.pairwiseBy
+import kotlinx.coroutines.flow.Flow
+
+@JvmInline
+value class GammaBrightness(
+ @IntRange(
+ from = BrightnessUtils.GAMMA_SPACE_MIN.toLong(),
+ to = BrightnessUtils.GAMMA_SPACE_MAX.toLong()
+ )
+ val value: Int
+)
+
+internal fun Flow<GammaBrightness>.logDiffForTable(
+ tableLogBuffer: TableLogBuffer,
+ columnPrefix: String,
+ columnName: String,
+ initialValue: GammaBrightness?,
+): Flow<GammaBrightness> {
+ val initialValueFun = {
+ tableLogBuffer.logChange(columnPrefix, columnName, initialValue?.value, isInitial = true)
+ initialValue
+ }
+ return this.pairwiseBy(initialValueFun) { prevVal: GammaBrightness?, newVal: GammaBrightness ->
+ if (prevVal != newVal) {
+ tableLogBuffer.logChange(columnPrefix, columnName, newVal.value)
+ }
+ newVal
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/shared/model/LinearBrightness.kt b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/LinearBrightness.kt
new file mode 100644
index 000000000000..1c886e6b1477
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/brightness/shared/model/LinearBrightness.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2024 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.brightness.shared.model
+
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.util.kotlin.pairwiseBy
+import kotlinx.coroutines.flow.Flow
+
+@JvmInline
+value class LinearBrightness(val floatValue: Float) {
+ fun clamp(min: LinearBrightness, max: LinearBrightness): LinearBrightness {
+ return if (floatValue < min.floatValue) {
+ min
+ } else if (floatValue > max.floatValue) {
+ max
+ } else {
+ this
+ }
+ }
+
+ val loggableString: String
+ get() = floatValue.formatBrightness()
+}
+
+fun Float.formatBrightness(): String {
+ return "%.3f".format(this)
+}
+
+internal fun Flow<LinearBrightness>.logDiffForTable(
+ tableLogBuffer: TableLogBuffer,
+ columnPrefix: String,
+ columnName: String,
+ initialValue: LinearBrightness?,
+): Flow<LinearBrightness> {
+ val initialValueFun = {
+ tableLogBuffer.logChange(
+ columnPrefix,
+ columnName,
+ initialValue?.loggableString,
+ isInitial = true
+ )
+ initialValue
+ }
+ return this.pairwiseBy(initialValueFun) { prevVal: LinearBrightness?, newVal: LinearBrightness
+ ->
+ if (prevVal != newVal) {
+ tableLogBuffer.logChange(columnPrefix, columnName, newVal.loggableString)
+ }
+ newVal
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
index a51d8ff4faa5..f991d5b8405f 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt
@@ -33,14 +33,13 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.PlatformSlider
-import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.shared.model.GammaBrightness
import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel
import com.android.systemui.brightness.ui.viewmodel.Drag
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.utils.PolicyRestriction
-import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
@Composable
@@ -107,8 +106,8 @@ fun BrightnessSliderContainer(
viewModel: BrightnessSliderViewModel,
modifier: Modifier = Modifier,
) {
- val gamma: Int by
- viewModel.currentBrightness.map { it.value }.collectAsStateWithLifecycle(initialValue = 0)
+ val state by viewModel.currentBrightness.collectAsStateWithLifecycle()
+ val gamma = state.value
val coroutineScope = rememberCoroutineScope()
val restriction by
viewModel.policyRestriction.collectAsStateWithLifecycle(
diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
index f0988ba96bcd..16a1dcc0aef5 100644
--- a/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModel.kt
@@ -18,14 +18,18 @@ package com.android.systemui.brightness.ui.viewmodel
import com.android.systemui.brightness.domain.interactor.BrightnessPolicyEnforcementInteractor
import com.android.systemui.brightness.domain.interactor.ScreenBrightnessInteractor
-import com.android.systemui.brightness.shared.GammaBrightness
+import com.android.systemui.brightness.shared.model.GammaBrightness
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.res.R
import com.android.systemui.utils.PolicyRestriction
import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.stateIn
@SysUISingleton
class BrightnessSliderViewModel
@@ -33,8 +37,14 @@ class BrightnessSliderViewModel
constructor(
private val screenBrightnessInteractor: ScreenBrightnessInteractor,
private val brightnessPolicyEnforcementInteractor: BrightnessPolicyEnforcementInteractor,
+ @Application private val applicationScope: CoroutineScope,
) {
- val currentBrightness = screenBrightnessInteractor.gammaBrightness
+ val currentBrightness =
+ screenBrightnessInteractor.gammaBrightness.stateIn(
+ applicationScope,
+ SharingStarted.WhileSubscribed(),
+ GammaBrightness(0)
+ )
val maxBrightness = screenBrightnessInteractor.maxGammaBrightness
val minBrightness = screenBrightnessInteractor.minGammaBrightness
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt
index a05b5e65ce9d..ad5242e2e036 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/data/repository/FakeScreenBrightnessRepository.kt
@@ -19,7 +19,7 @@ package com.android.systemui.brightness.data.repository
import android.hardware.display.BrightnessInfo
import android.hardware.display.BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE
import android.hardware.display.BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF
-import com.android.systemui.brightness.data.model.LinearBrightness
+import com.android.systemui.brightness.shared.model.LinearBrightness
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.map
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt
index 22784e47d277..0e8427310895 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/domain/interactor/ScreenBrightnessInteractorKosmos.kt
@@ -18,6 +18,15 @@ package com.android.systemui.brightness.domain.interactor
import com.android.systemui.brightness.data.repository.screenBrightnessRepository
import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.util.mockito.mock
val Kosmos.screenBrightnessInteractor by
- Kosmos.Fixture { ScreenBrightnessInteractor(screenBrightnessRepository) }
+ Kosmos.Fixture {
+ ScreenBrightnessInteractor(
+ screenBrightnessRepository,
+ applicationCoroutineScope,
+ mock<TableLogBuffer>(),
+ )
+ }