1 /* 2 * 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.fuelgauge 18 19 import android.app.settings.SettingsEnums.ACTION_BATTERY_LEVEL 20 import android.content.Context 21 import androidx.annotation.VisibleForTesting 22 import androidx.preference.Preference 23 import com.android.settings.R 24 import com.android.settings.contract.KEY_BATTERY_LEVEL 25 import com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT 26 import com.android.settings.metrics.PreferenceActionMetricsProvider 27 import com.android.settingslib.Utils 28 import com.android.settingslib.datastore.KeyValueStore 29 import com.android.settingslib.datastore.NoOpKeyedObservable 30 import com.android.settingslib.datastore.Permissions 31 import com.android.settingslib.fuelgauge.BatteryUtils 32 import com.android.settingslib.metadata.IntRangeValuePreference 33 import com.android.settingslib.metadata.PreferenceLifecycleContext 34 import com.android.settingslib.metadata.PreferenceLifecycleProvider 35 import com.android.settingslib.metadata.PreferenceMetadata 36 import com.android.settingslib.metadata.ReadWritePermit 37 import com.android.settingslib.metadata.SensitivityLevel 38 import com.android.settingslib.preference.PreferenceBinding 39 import com.android.settingslib.widget.UsageProgressBarPreference 40 41 // LINT.IfChange 42 class BatteryHeaderPreference : 43 IntRangeValuePreference, 44 PreferenceBinding, 45 PreferenceActionMetricsProvider, 46 PreferenceLifecycleProvider { 47 48 @VisibleForTesting var batteryBroadcastReceiver: BatteryBroadcastReceiver? = null 49 50 override val key: String 51 get() = KEY 52 53 override val title: Int 54 get() = R.string.summary_placeholder 55 56 override val preferenceActionMetrics: Int 57 get() = ACTION_BATTERY_LEVEL 58 tagsnull59 override fun tags(context: Context) = arrayOf(KEY_BATTERY_LEVEL) 60 61 override fun createWidget(context: Context) = UsageProgressBarPreference(context) 62 63 override fun bind(preference: Preference, metadata: PreferenceMetadata) { 64 super.bind(preference, metadata) 65 preference.isSelectable = false 66 if (preference is UsageProgressBarPreference) { 67 quickUpdateHeaderPreference(preference) 68 } 69 } 70 isIndexablenull71 override fun isIndexable(context: Context) = false 72 73 override fun onCreate(context: PreferenceLifecycleContext) { 74 super.onCreate(context) 75 batteryBroadcastReceiver = 76 BatteryBroadcastReceiver(context).apply { 77 setBatteryChangedListener { 78 if (it != BATTERY_NOT_PRESENT) { 79 context.notifyPreferenceChange(KEY) 80 } 81 } 82 } 83 } 84 onStartnull85 override fun onStart(context: PreferenceLifecycleContext) { 86 super.onStart(context) 87 batteryBroadcastReceiver?.register() 88 } 89 onStopnull90 override fun onStop(context: PreferenceLifecycleContext) { 91 super.onStop(context) 92 batteryBroadcastReceiver?.unRegister() 93 } 94 storagenull95 override fun storage(context: Context): KeyValueStore = 96 object : NoOpKeyedObservable<String>(), KeyValueStore { 97 override fun contains(key: String) = BatteryUtils.getBatteryIntent(context) != null 98 99 @Suppress("UNCHECKED_CAST") 100 override fun <T : Any> getValue(key: String, valueType: Class<T>): T? { 101 val batteryIntent = BatteryUtils.getBatteryIntent(context) ?: return null 102 return Utils.getBatteryLevel(batteryIntent) as T 103 } 104 105 override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) = 106 throw UnsupportedOperationException() 107 } 108 getMinValuenull109 override fun getMinValue(context: Context): Int = 0 110 111 override fun getMaxValue(context: Context): Int = 100 112 113 override fun getReadPermissions(context: Context) = Permissions.EMPTY 114 115 override fun getReadPermit(context: Context, callingPid: Int, callingUid: Int) = 116 ReadWritePermit.ALLOW 117 118 override fun getWritePermissions(context: Context) = Permissions.EMPTY 119 120 override fun getWritePermit(context: Context, callingPid: Int, callingUid: Int) = 121 ReadWritePermit.DISALLOW 122 123 override val sensitivityLevel: Int 124 get() = SensitivityLevel.NO_SENSITIVITY 125 126 companion object { 127 private const val KEY = "battery_header" 128 private const val BATTERY_MAX_LEVEL: Long = 100L 129 130 private fun quickUpdateHeaderPreference(preference: UsageProgressBarPreference) { 131 val batteryIntent = BatteryUtils.getBatteryIntent(preference.context) ?: return 132 val batteryLevel: Int = Utils.getBatteryLevel(batteryIntent) 133 preference.apply { 134 setUsageSummary(com.android.settings.Utils.formatPercentage(batteryLevel)) 135 setPercent(batteryLevel.toLong(), BATTERY_MAX_LEVEL) 136 setBottomSummary("") 137 } 138 } 139 } 140 } 141 // LINT.ThenChange(BatteryHeaderPreferenceController.java) 142