1 /* <lambda>null2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.qs.tiles.impl.rotation.domain.interactor 18 19 import android.Manifest 20 import android.content.pm.PackageManager 21 import android.content.res.Resources 22 import android.os.UserHandle 23 import com.android.systemui.camera.data.repository.CameraAutoRotateRepository 24 import com.android.systemui.camera.data.repository.CameraSensorPrivacyRepository 25 import com.android.systemui.qs.tiles.base.domain.interactor.QSTileDataInteractor 26 import com.android.systemui.qs.tiles.base.domain.model.DataUpdateTrigger 27 import com.android.systemui.qs.tiles.impl.rotation.domain.model.RotationLockTileModel 28 import com.android.systemui.shade.ShadeDisplayAware 29 import com.android.systemui.statusbar.policy.BatteryController 30 import com.android.systemui.statusbar.policy.RotationLockController 31 import com.android.systemui.util.kotlin.isBatteryPowerSaveEnabled 32 import com.android.systemui.util.kotlin.isRotationLockEnabled 33 import javax.inject.Inject 34 import kotlinx.coroutines.flow.Flow 35 import kotlinx.coroutines.flow.combine 36 import kotlinx.coroutines.flow.flowOf 37 38 /** Observes rotation lock state changes providing the [RotationLockTileModel]. */ 39 class RotationLockTileDataInteractor 40 @Inject 41 constructor( 42 private val rotationLockController: RotationLockController, 43 private val batteryController: BatteryController, 44 private val cameraAutoRotateRepository: CameraAutoRotateRepository, 45 private val cameraSensorPrivacyRepository: CameraSensorPrivacyRepository, 46 private val packageManager: PackageManager, 47 @ShadeDisplayAware private val resources: Resources, 48 ) : QSTileDataInteractor<RotationLockTileModel> { 49 50 override fun tileData( 51 user: UserHandle, 52 triggers: Flow<DataUpdateTrigger>, 53 ): Flow<RotationLockTileModel> = 54 combine( 55 rotationLockController.isRotationLockEnabled(), 56 cameraSensorPrivacyRepository.isEnabled(user), 57 batteryController.isBatteryPowerSaveEnabled(), 58 cameraAutoRotateRepository.isCameraAutoRotateSettingEnabled(user), 59 ) { 60 isRotationLockEnabled, 61 isCamPrivacySensorEnabled, 62 isBatteryPowerSaveEnabled, 63 isCameraAutoRotateEnabled -> 64 RotationLockTileModel( 65 isRotationLockEnabled, 66 isCameraRotationEnabled( 67 isBatteryPowerSaveEnabled, 68 isCamPrivacySensorEnabled, 69 isCameraAutoRotateEnabled, 70 ), 71 ) 72 } 73 74 override fun availability(user: UserHandle): Flow<Boolean> = flowOf(true) 75 76 private fun hasSufficientPermission(): Boolean { 77 return packageManager.rotationResolverPackageName?.let { 78 packageManager.checkPermission(Manifest.permission.CAMERA, it) == 79 PackageManager.PERMISSION_GRANTED 80 } ?: false 81 } 82 83 private fun isCameraRotationEnabled( 84 isBatteryPowerSaverModeOn: Boolean, 85 isCameraSensorPrivacyEnabled: Boolean, 86 isCameraAutoRotateEnabled: Boolean, 87 ): Boolean = 88 resources.getBoolean(com.android.internal.R.bool.config_allowRotationResolver) && 89 !isBatteryPowerSaverModeOn && 90 !isCameraSensorPrivacyEnabled && 91 hasSufficientPermission() && 92 isCameraAutoRotateEnabled 93 } 94