1 /* 2 * Copyright (C) 2022 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 18 package com.android.systemui.keyguard.data.quickaffordance 19 20 import android.app.StatusBarManager 21 import android.app.admin.DevicePolicyManager 22 import android.content.Context 23 import android.content.pm.PackageManager 24 import com.android.systemui.res.R 25 import com.android.systemui.animation.Expandable 26 import com.android.systemui.camera.CameraGestureHelper 27 import com.android.systemui.common.shared.model.ContentDescription 28 import com.android.systemui.common.shared.model.Icon 29 import com.android.systemui.dagger.SysUISingleton 30 import com.android.systemui.dagger.qualifiers.Application 31 import com.android.systemui.dagger.qualifiers.Background 32 import com.android.systemui.settings.UserTracker 33 import dagger.Lazy 34 import javax.inject.Inject 35 import kotlinx.coroutines.CoroutineDispatcher 36 import kotlinx.coroutines.flow.Flow 37 import kotlinx.coroutines.flow.flow 38 import kotlinx.coroutines.withContext 39 40 @SysUISingleton 41 class CameraQuickAffordanceConfig 42 @Inject 43 constructor( 44 @Application private val context: Context, 45 private val packageManager: PackageManager, 46 private val cameraGestureHelper: Lazy<CameraGestureHelper>, 47 private val userTracker: UserTracker, 48 private val devicePolicyManager: DevicePolicyManager, 49 @Background private val backgroundDispatcher: CoroutineDispatcher, 50 ) : KeyguardQuickAffordanceConfig { 51 52 override val key: String 53 get() = BuiltInKeyguardQuickAffordanceKeys.CAMERA 54 pickerNamenull55 override fun pickerName(): String = context.getString(R.string.accessibility_camera_button) 56 57 override val pickerIconResourceId: Int 58 get() = R.drawable.ic_camera 59 60 override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> 61 get() = flow { 62 emit( 63 if (isLaunchable()) { 64 KeyguardQuickAffordanceConfig.LockScreenState.Visible( 65 icon = 66 Icon.Resource( 67 R.drawable.ic_camera, 68 ContentDescription.Resource(R.string.accessibility_camera_button) 69 ) 70 ) 71 } else { 72 KeyguardQuickAffordanceConfig.LockScreenState.Hidden 73 } 74 ) 75 } 76 getPickerScreenStatenull77 override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { 78 return if (isLaunchable()) { 79 super.getPickerScreenState() 80 } else { 81 KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice 82 } 83 } 84 onTriggerednull85 override fun onTriggered( 86 expandable: Expandable? 87 ): KeyguardQuickAffordanceConfig.OnTriggeredResult { 88 cameraGestureHelper 89 .get() 90 .launchCamera(StatusBarManager.CAMERA_LAUNCH_SOURCE_QUICK_AFFORDANCE) 91 return KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled 92 } 93 isLaunchablenull94 private suspend fun isLaunchable(): Boolean { 95 return packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) && 96 withContext(backgroundDispatcher) { 97 !devicePolicyManager.getCameraDisabled(null, userTracker.userId) && 98 devicePolicyManager.getKeyguardDisabledFeatures(null, userTracker.userId) and 99 DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA == 0 100 } 101 } 102 } 103