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 package com.android.systemui.smartspace.preconditions 17 18 import com.android.systemui.smartspace.SmartspacePrecondition 19 import com.android.systemui.statusbar.policy.DeviceProvisionedController 20 import com.android.systemui.util.concurrency.Execution 21 import javax.inject.Inject 22 23 /** 24 * {@link LockscreenPrecondition} covers the conditions that must be met before Smartspace can be 25 * used over lockscreen. These conditions include the device being provisioned with a setup user. 26 */ 27 class LockscreenPrecondition @Inject constructor( 28 private val deviceProvisionedController: DeviceProvisionedController, 29 private val execution: Execution 30 ) : SmartspacePrecondition { 31 private var listeners = mutableSetOf<SmartspacePrecondition.Listener>() 32 33 private val deviceProvisionedListener = 34 object : DeviceProvisionedController.DeviceProvisionedListener { onDeviceProvisionedChangednull35 override fun onDeviceProvisionedChanged() { 36 updateDeviceReadiness() 37 } 38 onUserSetupChangednull39 override fun onUserSetupChanged() { 40 updateDeviceReadiness() 41 } 42 } 43 44 init { 45 deviceProvisionedController.addCallback(deviceProvisionedListener) 46 } 47 48 var deviceReady: Boolean = false 49 private set 50 51 init { 52 updateDeviceReadiness() 53 } 54 updateDeviceReadinessnull55 private fun updateDeviceReadiness() { 56 if (deviceReady) { 57 return 58 } 59 60 deviceReady = deviceProvisionedController.isDeviceProvisioned && 61 deviceProvisionedController.isCurrentUserSetup 62 63 if (!deviceReady) { 64 return 65 } 66 67 deviceProvisionedController.removeCallback(deviceProvisionedListener) 68 synchronized(listeners) { 69 listeners.forEach { it.onCriteriaChanged() } 70 } 71 } 72 addListenernull73 override fun addListener(listener: SmartspacePrecondition.Listener) { 74 synchronized(listeners) { 75 listeners += listener 76 } 77 // Always trigger a targeted callback upon addition of listener. 78 listener.onCriteriaChanged() 79 } 80 removeListenernull81 override fun removeListener(listener: SmartspacePrecondition.Listener) { 82 synchronized(listeners) { 83 listeners -= listener 84 } 85 } 86 conditionsMetnull87 override fun conditionsMet(): Boolean { 88 execution.assertIsMainThread() 89 return deviceReady 90 } 91 } 92