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