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.dagger.qualifiers.Main 26 import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger 27 import com.android.systemui.qs.tiles.base.interactor.QSTileDataInteractor 28 import com.android.systemui.qs.tiles.impl.rotation.domain.model.RotationLockTileModel 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 @Main 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 -> 65 RotationLockTileModel( 66 isRotationLockEnabled, 67 isCameraRotationEnabled( 68 isBatteryPowerSaveEnabled, 69 isCamPrivacySensorEnabled, 70 isCameraAutoRotateEnabled 71 ), 72 ) 73 } 74 75 override fun availability(user: UserHandle): Flow<Boolean> = flowOf(true) 76 77 private fun hasSufficientPermission(): Boolean { 78 val rotationPackage: String = packageManager.rotationResolverPackageName 79 return rotationPackage != null && 80 packageManager.checkPermission(Manifest.permission.CAMERA, rotationPackage) == 81 PackageManager.PERMISSION_GRANTED 82 } 83 84 private fun isCameraRotationEnabled( 85 isBatteryPowerSaverModeOn: Boolean, 86 isCameraSensorPrivacyEnabled: Boolean, 87 isCameraAutoRotateEnabled: Boolean 88 ): Boolean = 89 resources.getBoolean(com.android.internal.R.bool.config_allowRotationResolver) && 90 !isBatteryPowerSaverModeOn && 91 !isCameraSensorPrivacyEnabled && 92 hasSufficientPermission() && 93 isCameraAutoRotateEnabled 94 } 95