blob: eab3cdc39107d2b8e2515c6e9f99ca1d6aeb683a [file] [log] [blame]
jackqdyulei605dbc62017-05-19 13:29:09 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
jackqdyulei605dbc62017-05-19 13:29:09 -070014 */
15
16package com.android.settings.fuelgauge;
17
18import android.content.Context;
19import android.content.Intent;
jackqdyulei19648752017-06-26 17:54:09 -070020import android.os.BatteryManager;
Weien Wang27e96172018-05-21 12:10:11 +080021import android.os.PowerManager;
ykhungc2341962023-05-03 18:03:59 +080022import android.util.Log;
jackqdyulei605dbc62017-05-19 13:29:09 -070023
Fan Zhang23f8d592018-08-28 15:11:40 -070024import androidx.annotation.VisibleForTesting;
Fan Zhang23f8d592018-08-28 15:11:40 -070025import androidx.preference.PreferenceScreen;
26
jackqdyulei605dbc62017-05-19 13:29:09 -070027import com.android.settings.R;
jackqdyulei076b6742018-07-24 10:49:05 -070028import com.android.settings.core.BasePreferenceController;
Tony Mantler1d583e12017-06-13 13:09:25 -070029import com.android.settings.core.PreferenceControllerMixin;
Wesley.CW Wang11d74e72021-04-06 15:14:59 +080030import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
Jeffrey Carlyle4e2071a2020-05-27 09:28:17 -070031import com.android.settings.overlay.FeatureFactory;
jackqdyulei605dbc62017-05-19 13:29:09 -070032import com.android.settingslib.Utils;
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +080033import com.android.settingslib.widget.UsageProgressBarPreference;
jackqdyulei605dbc62017-05-19 13:29:09 -070034
Jun Lancca804e2023-11-02 18:55:52 +080035/** Controller that update the battery header view */
jackqdyulei076b6742018-07-24 10:49:05 -070036public class BatteryHeaderPreferenceController extends BasePreferenceController
Chaohui Wang0aca2ff2023-08-24 14:01:54 +080037 implements PreferenceControllerMixin, BatteryPreferenceController {
ykhungc2341962023-05-03 18:03:59 +080038 private static final String TAG = "BatteryHeaderPreferenceController";
39
Jun Lancca804e2023-11-02 18:55:52 +080040 @VisibleForTesting static final String KEY_BATTERY_HEADER = "battery_header";
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +080041 private static final int BATTERY_MAX_LEVEL = 100;
Fan Zhangfe23da52017-06-03 17:17:27 -070042
Jun Lancca804e2023-11-02 18:55:52 +080043 @VisibleForTesting BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
44 @VisibleForTesting UsageProgressBarPreference mBatteryUsageProgressBarPref;
jackqdyulei605dbc62017-05-19 13:29:09 -070045
Weien Wang27e96172018-05-21 12:10:11 +080046 private final PowerManager mPowerManager;
Yiling Chuang37a35d52024-04-15 07:24:59 +000047 private final BatterySettingsFeatureProvider mBatterySettingsFeatureProvider;
48
49 private BatteryTip mBatteryTip;
Fan Zhangfe23da52017-06-03 17:17:27 -070050
jackqdyulei076b6742018-07-24 10:49:05 -070051 public BatteryHeaderPreferenceController(Context context, String key) {
52 super(context, key);
Weien Wang27e96172018-05-21 12:10:11 +080053 mPowerManager = context.getSystemService(PowerManager.class);
Jun Lancca804e2023-11-02 18:55:52 +080054 mBatteryStatusFeatureProvider =
55 FeatureFactory.getFeatureFactory().getBatteryStatusFeatureProvider();
Yiling Chuang37a35d52024-04-15 07:24:59 +000056 mBatterySettingsFeatureProvider =
57 FeatureFactory.getFeatureFactory().getBatterySettingsFeatureProvider();
jackqdyulei605dbc62017-05-19 13:29:09 -070058 }
59
60 @Override
61 public void displayPreference(PreferenceScreen screen) {
62 super.displayPreference(screen);
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +080063 mBatteryUsageProgressBarPref = screen.findPreference(getPreferenceKey());
Wesley Wang3ceffc32024-05-15 18:46:31 +080064 // Set up empty space text first to prevent layout flaky before info loaded.
65 mBatteryUsageProgressBarPref.setBottomSummary(" ");
jackqdyulei605dbc62017-05-19 13:29:09 -070066
Mill Chenad99e2e2020-10-21 16:32:56 +080067 if (com.android.settings.Utils.isBatteryPresent(mContext)) {
68 quickUpdateHeaderPreference();
69 } else {
Wesley.CW Wang756028a2021-04-08 18:01:15 +080070 mBatteryUsageProgressBarPref.setVisible(false);
Mill Chenad99e2e2020-10-21 16:32:56 +080071 }
jackqdyulei605dbc62017-05-19 13:29:09 -070072 }
73
74 @Override
jackqdyulei076b6742018-07-24 10:49:05 -070075 public int getAvailabilityStatus() {
76 return AVAILABLE_UNSEARCHABLE;
jackqdyulei605dbc62017-05-19 13:29:09 -070077 }
78
Stephane Leeb60870c2020-11-04 15:21:05 -080079 private CharSequence generateLabel(BatteryInfo info) {
Yiling Chuang7b777292024-05-06 03:57:22 +000080 if (Utils.containsIncompatibleChargers(mContext, TAG)) {
81 return mContext.getString(
82 com.android.settingslib.R.string.battery_info_status_not_charging);
83 }
84 if (BatteryUtils.isBatteryDefenderOn(info)) {
85 return mContext.getString(
86 com.android.settingslib.R.string.battery_info_status_charging_on_hold);
87 }
Yiling Chuang8bcaab72024-05-09 10:52:30 +000088 if (info.remainingLabel != null
89 && mBatterySettingsFeatureProvider.isChargingOptimizationMode(mContext)) {
90 return info.remainingLabel;
91 }
Yiling Chuang7b777292024-05-06 03:57:22 +000092 if (info.remainingLabel == null
93 || info.batteryStatus == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
94 return info.statusLabel;
95 }
Yiling Chuang37a35d52024-04-15 07:24:59 +000096 if (info.pluggedStatus == BatteryManager.BATTERY_PLUGGED_WIRELESS) {
97 final CharSequence wirelessChargingLabel =
98 mBatterySettingsFeatureProvider.getWirelessChargingLabel(mContext, info);
99 if (wirelessChargingLabel != null) {
Yiling Chuang6dc81932024-06-06 09:43:43 +0000100 mBatteryUsageProgressBarPref.setBottomSummaryContentDescription(
101 mBatterySettingsFeatureProvider
102 .getWirelessChargingContentDescription(mContext, info));
Yiling Chuang37a35d52024-04-15 07:24:59 +0000103 return wirelessChargingLabel;
104 }
105 }
Yiling Chuang7b777292024-05-06 03:57:22 +0000106 if (info.statusLabel != null && !info.discharging) {
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800107 // Charging state
Pajace Chen6f3c97f2024-04-06 09:17:59 +0800108 if (com.android.settingslib.fuelgauge.BatteryUtils.isChargingStringV2Enabled()) {
109 return info.isFastCharging
110 ? mContext.getString(
111 R.string.battery_state_and_duration,
112 info.statusLabel,
113 info.remainingLabel)
114 : info.remainingLabel;
115 }
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800116 return mContext.getString(
117 R.string.battery_state_and_duration, info.statusLabel, info.remainingLabel);
118 } else if (mPowerManager.isPowerSaveMode()) {
119 // Power save mode is on
Jun Lancca804e2023-11-02 18:55:52 +0800120 final String powerSaverOn =
121 mContext.getString(R.string.battery_tip_early_heads_up_done_title);
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800122 return mContext.getString(
123 R.string.battery_state_and_duration, powerSaverOn, info.remainingLabel);
Jun Lancca804e2023-11-02 18:55:52 +0800124 } else if (mBatteryTip != null && mBatteryTip.getType() == BatteryTip.TipType.LOW_BATTERY) {
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800125 // Low battery state
126 final String lowBattery = mContext.getString(R.string.low_battery_summary);
127 return mContext.getString(
128 R.string.battery_state_and_duration, lowBattery, info.remainingLabel);
Stephane Leeb60870c2020-11-04 15:21:05 -0800129 } else {
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800130 // Discharging state
Stephane Leeb60870c2020-11-04 15:21:05 -0800131 return info.remainingLabel;
132 }
133 }
134
jackqdyulei605dbc62017-05-19 13:29:09 -0700135 public void updateHeaderPreference(BatteryInfo info) {
Wesley.CW Wangd3243932021-04-07 20:00:59 +0800136 if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) {
137 mBatteryUsageProgressBarPref.setBottomSummary(generateLabel(info));
138 }
139
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +0800140 mBatteryUsageProgressBarPref.setUsageSummary(
141 formatBatteryPercentageText(info.batteryLevel));
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +0800142 mBatteryUsageProgressBarPref.setPercent(info.batteryLevel, BATTERY_MAX_LEVEL);
jackqdyulei605dbc62017-05-19 13:29:09 -0700143 }
jackqdyulei19648752017-06-26 17:54:09 -0700144
Jun Lancca804e2023-11-02 18:55:52 +0800145 /** Callback which receives text for the summary line. */
Stephane Leeb60870c2020-11-04 15:21:05 -0800146 public void updateBatteryStatus(String label, BatteryInfo info) {
ykhungc2341962023-05-03 18:03:59 +0800147 final CharSequence summary = label != null ? label : generateLabel(info);
148 mBatteryUsageProgressBarPref.setBottomSummary(summary);
149 Log.d(TAG, "updateBatteryStatus: " + label + " summary: " + summary);
Jeffrey Carlyle4e2071a2020-05-27 09:28:17 -0700150 }
151
jackqdyulei19648752017-06-26 17:54:09 -0700152 public void quickUpdateHeaderPreference() {
Jun Lancca804e2023-11-02 18:55:52 +0800153 Intent batteryBroadcast =
154 com.android.settingslib.fuelgauge.BatteryUtils.getBatteryIntent(mContext);
jackqdyulei19648752017-06-26 17:54:09 -0700155 final int batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
156 final boolean discharging =
157 batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
Jyotiraditya Panda7d6af242024-02-22 22:42:00 +0900158 final int chargeCounterUah =
159 batteryBroadcast.getIntExtra(BatteryManager.EXTRA_CHARGE_COUNTER, -1);
jackqdyulei19648752017-06-26 17:54:09 -0700160
Wesley.CW Wangf4bc3532021-02-04 16:44:55 +0800161 mBatteryUsageProgressBarPref.setUsageSummary(formatBatteryPercentageText(batteryLevel));
162 mBatteryUsageProgressBarPref.setPercent(batteryLevel, BATTERY_MAX_LEVEL);
Jyotiraditya Panda7d6af242024-02-22 22:42:00 +0900163
164 if (chargeCounterUah != -1) {
165 int chargeCounter = chargeCounterUah / 1_000;
166 mBatteryUsageProgressBarPref.setTotalSummary(
167 formatBatteryChargeCounterText(chargeCounter));
168 }
Mill Chenad99e2e2020-10-21 16:32:56 +0800169 }
170
Jun Lancca804e2023-11-02 18:55:52 +0800171 /** Update summary when battery tips changed. */
Wesley.CW Wang11d74e72021-04-06 15:14:59 +0800172 public void updateHeaderByBatteryTips(BatteryTip batteryTip, BatteryInfo batteryInfo) {
173 mBatteryTip = batteryTip;
174
175 if (mBatteryTip != null && batteryInfo != null) {
176 updateHeaderPreference(batteryInfo);
177 }
178 }
179
jackqdyuleifd0f48d2019-01-02 15:22:55 -0800180 private CharSequence formatBatteryPercentageText(int batteryLevel) {
mxyyiyi8ce68ba2024-03-20 13:42:57 +0800181 return com.android.settings.Utils.formatPercentage(batteryLevel);
jackqdyulei19648752017-06-26 17:54:09 -0700182 }
Jyotiraditya Panda7d6af242024-02-22 22:42:00 +0900183
184 private CharSequence formatBatteryChargeCounterText(int chargeCounter) {
185 return mContext.getString(R.string.battery_charge_counter_summary, chargeCounter);
186 }
jackqdyulei605dbc62017-05-19 13:29:09 -0700187}