• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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