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.settings.display 18 19 import android.content.BroadcastReceiver 20 import android.content.Context 21 import android.content.Intent 22 import android.content.IntentFilter 23 import android.hardware.SensorPrivacyManager 24 import android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener 25 import android.hardware.SensorPrivacyManager.Sensors.CAMERA 26 import android.os.PowerManager 27 import android.os.UserManager 28 import android.provider.Settings 29 import com.android.settings.PreferenceRestrictionMixin 30 import com.android.settings.R 31 import com.android.settingslib.RestrictedSwitchPreference 32 import com.android.settingslib.datastore.KeyValueStore 33 import com.android.settingslib.datastore.KeyedObservableDelegate 34 import com.android.settingslib.datastore.SettingsSecureStore 35 import com.android.settingslib.datastore.SettingsStore 36 import com.android.settingslib.metadata.PreferenceAvailabilityProvider 37 import com.android.settingslib.metadata.PreferenceLifecycleContext 38 import com.android.settingslib.metadata.PreferenceLifecycleProvider 39 import com.android.settingslib.metadata.ReadWritePermit 40 import com.android.settingslib.metadata.SensitivityLevel 41 import com.android.settingslib.metadata.TwoStatePreference 42 import com.android.settingslib.preference.PreferenceBindingPlaceholder 43 import com.android.settingslib.preference.SwitchPreferenceBinding 44 45 // LINT.IfChange 46 class AdaptiveSleepPreference : 47 TwoStatePreference, 48 SwitchPreferenceBinding, 49 PreferenceLifecycleProvider, 50 PreferenceBindingPlaceholder, // not needed once controller class is cleaned up 51 PreferenceAvailabilityProvider, 52 PreferenceRestrictionMixin { 53 54 private var broadcastReceiver: BroadcastReceiver? = null 55 private var sensorPrivacyChangedListener: OnSensorPrivacyChangedListener? = null 56 57 override val key: String 58 get() = KEY 59 60 override val title: Int 61 get() = R.string.adaptive_sleep_title 62 63 override val summary: Int 64 get() = R.string.adaptive_sleep_description 65 66 override fun isIndexable(context: Context) = false 67 68 override fun isEnabled(context: Context) = 69 super<PreferenceRestrictionMixin>.isEnabled(context) && context.canBeEnabled() 70 71 override val restrictionKeys: Array<String> 72 get() = arrayOf(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT) 73 74 override fun isAvailable(context: Context) = context.isAdaptiveSleepSupported() 75 76 override fun createWidget(context: Context) = RestrictedSwitchPreference(context) 77 78 override fun storage(context: Context): KeyValueStore = Storage(context) 79 80 override fun getReadPermit(context: Context, myUid: Int, callingUid: Int) = 81 ReadWritePermit.ALLOW 82 83 override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) = 84 ReadWritePermit.ALLOW 85 86 override val sensitivityLevel 87 get() = SensitivityLevel.NO_SENSITIVITY 88 89 @Suppress("UNCHECKED_CAST") 90 private class Storage( 91 private val context: Context, 92 private val settingsStore: SettingsStore = SettingsSecureStore.get(context), 93 ) : KeyedObservableDelegate<String>(settingsStore), KeyValueStore { 94 95 override fun contains(key: String) = settingsStore.contains(key) 96 97 override fun <T : Any> getValue(key: String, valueType: Class<T>) = 98 (context.canBeEnabled() && settingsStore.getBoolean(key) == true) as T 99 100 override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) = 101 settingsStore.setBoolean(key, value as Boolean?) 102 } 103 104 override fun onStart(context: PreferenceLifecycleContext) { 105 val receiver = 106 object : BroadcastReceiver() { 107 override fun onReceive(receiverContext: Context, intent: Intent) { 108 context.notifyPreferenceChange(KEY) 109 } 110 } 111 context.registerReceiver( 112 receiver, 113 IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED), 114 ) 115 broadcastReceiver = receiver 116 117 val listener = OnSensorPrivacyChangedListener { _, _ -> 118 context.notifyPreferenceChange(KEY) 119 } 120 SensorPrivacyManager.getInstance(context).addSensorPrivacyListener(CAMERA, listener) 121 sensorPrivacyChangedListener = listener 122 } 123 124 override fun onStop(context: PreferenceLifecycleContext) { 125 broadcastReceiver?.let { context.unregisterReceiver(it) } 126 sensorPrivacyChangedListener?.let { 127 SensorPrivacyManager.getInstance(context).removeSensorPrivacyListener(it) 128 } 129 } 130 131 companion object { 132 const val KEY = Settings.Secure.ADAPTIVE_SLEEP 133 134 @Suppress("DEPRECATION") 135 private fun Context.canBeEnabled() = 136 AdaptiveSleepPreferenceController.hasSufficientPermission(packageManager) && 137 getSystemService(PowerManager::class.java)?.isPowerSaveMode != true && 138 !SensorPrivacyManager.getInstance(this).isSensorPrivacyEnabled(CAMERA) 139 } 140 } 141 // LINT.ThenChange(AdaptiveSleepPreferenceController.java) 142