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