Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0234daad authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[Battery] Use existing repository flows for new QS tiles.

Now that we've defined a BatteryRepository, we can update the new QS
tiles to use the repository instead of re-creating the battery flows.

Bug: 434194794
Flag: com.android.systemui.qs_new_tiles
Test: With flag enabled, verify battery saver tile still works
Test: atest BatterySaverTileDataInteractorTest
RotationLockTileDataInteractorTest

Change-Id: I39994bff70a2ee4812916e9f367d81d96fea4943
parent b6abfde6
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.qs.tiles.impl.battery.doman.interactor

import android.os.UserHandle
import android.testing.LeakCheck
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -25,8 +24,10 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.tiles.base.domain.model.DataUpdateTrigger
import com.android.systemui.qs.tiles.impl.battery.domain.interactor.BatterySaverTileDataInteractor
import com.android.systemui.statusbar.pipeline.battery.data.repository.batteryRepository
import com.android.systemui.statusbar.policy.batteryController
import com.android.systemui.statusbar.policy.fake
import com.android.systemui.testKosmos
import com.android.systemui.utils.leaks.FakeBatteryController
import com.google.common.truth.Truth
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.toCollection
@@ -40,10 +41,9 @@ import org.junit.runner.RunWith
class BatterySaverTileDataInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val batteryController = FakeBatteryController(LeakCheck())
    private val batteryController = kosmos.batteryController.fake
    private val testUser = UserHandle.of(1)
    private val underTest =
        BatterySaverTileDataInteractor(testScope.testScheduler, batteryController)
    private val underTest = BatterySaverTileDataInteractor(kosmos.batteryRepository)

    @Test
    fun availability_isTrue() =
@@ -85,11 +85,11 @@ class BatterySaverTileDataInteractorTest : SysuiTestCase() {
            runCurrent()
            Truth.assertThat(data!!.isPluggedIn).isFalse()

            batteryController.isPluggedIn = true
            batteryController.fake._isPluggedIn = true
            runCurrent()
            Truth.assertThat(data!!.isPluggedIn).isTrue()

            batteryController.isPluggedIn = false
            batteryController.fake._isPluggedIn = false
            runCurrent()
            Truth.assertThat(data!!.isPluggedIn).isFalse()
        }
+6 −6
Original line number Diff line number Diff line
@@ -29,10 +29,11 @@ import com.android.systemui.camera.data.repository.fakeCameraSensorPrivacyReposi
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.tiles.base.domain.model.DataUpdateTrigger
import com.android.systemui.statusbar.pipeline.battery.data.repository.batteryRepository
import com.android.systemui.statusbar.policy.batteryController
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.whenever
import com.android.systemui.utils.leaks.FakeBatteryController
import com.android.systemui.utils.leaks.FakeRotationLockController
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.flowOf
@@ -48,7 +49,6 @@ import org.junit.runner.RunWith
class RotationLockTileDataInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val batteryController = FakeBatteryController(LeakCheck())
    private val rotationController = FakeRotationLockController(LeakCheck())
    private val fakeCameraAutoRotateRepository = kosmos.fakeCameraAutoRotateRepository
    private val fakeCameraSensorPrivacyRepository = kosmos.fakeCameraSensorPrivacyRepository
@@ -71,7 +71,7 @@ class RotationLockTileDataInteractorTest : SysuiTestCase() {
        underTest =
            RotationLockTileDataInteractor(
                rotationController,
                batteryController,
                kosmos.batteryRepository,
                fakeCameraAutoRotateRepository,
                fakeCameraSensorPrivacyRepository,
                packageManager,
@@ -124,11 +124,11 @@ class RotationLockTileDataInteractorTest : SysuiTestCase() {
            runCurrent()
            assertThat(data!!.isCameraRotationEnabled).isTrue()

            batteryController.setPowerSaveMode(true)
            kosmos.batteryController.setPowerSaveMode(true)
            runCurrent()
            assertThat(data!!.isCameraRotationEnabled).isFalse()

            batteryController.setPowerSaveMode(false)
            kosmos.batteryController.setPowerSaveMode(false)
            runCurrent()
            assertThat(data!!.isCameraRotationEnabled).isTrue()
        }
@@ -211,7 +211,7 @@ class RotationLockTileDataInteractorTest : SysuiTestCase() {

    private fun setupControllersToEnableCameraRotation() {
        rotationController.setRotationLocked(true, CALLER)
        batteryController.setPowerSaveMode(false)
        kosmos.batteryController.setPowerSaveMode(false)
        fakeCameraSensorPrivacyRepository.setEnabled(testUser, false)
        fakeCameraAutoRotateRepository.setEnabled(testUser, true)
    }
+6 −18
Original line number Diff line number Diff line
@@ -17,41 +17,29 @@
package com.android.systemui.qs.tiles.impl.battery.domain.interactor

import android.os.UserHandle
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.qs.tiles.base.domain.interactor.QSTileDataInteractor
import com.android.systemui.qs.tiles.base.domain.model.DataUpdateTrigger
import com.android.systemui.qs.tiles.impl.battery.domain.model.BatterySaverTileModel
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.util.kotlin.getBatteryLevel
import com.android.systemui.util.kotlin.isBatteryPowerSaveEnabled
import com.android.systemui.util.kotlin.isDevicePluggedIn
import com.android.systemui.statusbar.pipeline.battery.data.repository.BatteryRepository
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn

/** Observes BatterySaver mode state changes providing the [BatterySaverTileModel.Standard]. */
open class BatterySaverTileDataInteractor
@Inject
constructor(
    @Background private val bgCoroutineContext: CoroutineContext,
    private val batteryController: BatteryController,
) : QSTileDataInteractor<BatterySaverTileModel> {
constructor(private val batteryRepository: BatteryRepository) :
    QSTileDataInteractor<BatterySaverTileModel> {

    override fun tileData(
        user: UserHandle,
        triggers: Flow<DataUpdateTrigger>,
    ): Flow<BatterySaverTileModel> =
        combine(
            batteryController.isDevicePluggedIn().distinctUntilChanged().flowOn(bgCoroutineContext),
            batteryController
                .isBatteryPowerSaveEnabled()
                .distinctUntilChanged()
                .flowOn(bgCoroutineContext),
            batteryController.getBatteryLevel().distinctUntilChanged().flowOn(bgCoroutineContext),
            batteryRepository.isPluggedIn,
            batteryRepository.isPowerSaveEnabled,
            batteryRepository.level,
        ) {
            isPluggedIn: Boolean,
            isPowerSaverEnabled: Boolean,
+3 −4
Original line number Diff line number Diff line
@@ -26,9 +26,8 @@ import com.android.systemui.qs.tiles.base.domain.interactor.QSTileDataInteractor
import com.android.systemui.qs.tiles.base.domain.model.DataUpdateTrigger
import com.android.systemui.qs.tiles.impl.rotation.domain.model.RotationLockTileModel
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.pipeline.battery.data.repository.BatteryRepository
import com.android.systemui.statusbar.policy.RotationLockController
import com.android.systemui.util.kotlin.isBatteryPowerSaveEnabled
import com.android.systemui.util.kotlin.isRotationLockEnabled
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
@@ -40,7 +39,7 @@ class RotationLockTileDataInteractor
@Inject
constructor(
    private val rotationLockController: RotationLockController,
    private val batteryController: BatteryController,
    private val batteryRepository: BatteryRepository,
    private val cameraAutoRotateRepository: CameraAutoRotateRepository,
    private val cameraSensorPrivacyRepository: CameraSensorPrivacyRepository,
    private val packageManager: PackageManager,
@@ -54,7 +53,7 @@ constructor(
        combine(
            rotationLockController.isRotationLockEnabled(),
            cameraSensorPrivacyRepository.isEnabled(user),
            batteryController.isBatteryPowerSaveEnabled(),
            batteryRepository.isPowerSaveEnabled,
            cameraAutoRotateRepository.isCameraAutoRotateSettingEnabled(user),
        ) {
            isRotationLockEnabled,
+5 −34
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package com.android.systemui.util.kotlin

import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.onStart

@Deprecated(
    "Use com.android.systemui.statusbar.pipeline.battery.data.repository.BatteryRepository.isPluggedIn instead"
)
fun BatteryController.isDevicePluggedIn(): Flow<Boolean> {
    return conflatedCallbackFlow {
            val batteryCallback =
@@ -29,7 +32,7 @@ fun BatteryController.isDevicePluggedIn(): Flow<Boolean> {
                    override fun onBatteryLevelChanged(
                        level: Int,
                        pluggedIn: Boolean,
                        charging: Boolean
                        charging: Boolean,
                    ) {
                        trySend(pluggedIn)
                    }
@@ -40,38 +43,6 @@ fun BatteryController.isDevicePluggedIn(): Flow<Boolean> {
        .onStart { emit(isPluggedIn) }
}

fun BatteryController.isBatteryPowerSaveEnabled(): Flow<Boolean> {
    return conflatedCallbackFlow {
            val batteryCallback =
                object : BatteryController.BatteryStateChangeCallback {
                    override fun onPowerSaveChanged(isPowerSave: Boolean) {
                        trySend(isPowerSave)
                    }
                }
            addCallback(batteryCallback)
            awaitClose { removeCallback(batteryCallback) }
        }
        .onStart { emit(isPowerSave) }
}

fun BatteryController.getBatteryLevel(): Flow<Int> {
    return conflatedCallbackFlow {
            val batteryCallback =
                object : BatteryController.BatteryStateChangeCallback {
                    override fun onBatteryLevelChanged(
                        level: Int,
                        pluggedIn: Boolean,
                        charging: Boolean
                    ) {
                        trySend(level)
                    }
                }
            addCallback(batteryCallback)
            awaitClose { removeCallback(batteryCallback) }
        }
        .onStart { emit(0) }
}

fun BatteryController.isExtremePowerSaverEnabled(): Flow<Boolean> {
    return conflatedCallbackFlow {
            val batteryCallback =