1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. 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 distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.tuner; 16 17 import static android.provider.Settings.System.SHOW_BATTERY_PERCENT; 18 19 import android.content.Context; 20 import android.provider.Settings; 21 import android.text.TextUtils; 22 import android.util.ArraySet; 23 import android.util.AttributeSet; 24 25 import androidx.preference.DropDownPreference; 26 27 import com.android.internal.logging.MetricsLogger; 28 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 29 import com.android.systemui.Dependency; 30 import com.android.systemui.statusbar.phone.StatusBarIconController; 31 32 public class BatteryPreference extends DropDownPreference implements TunerService.Tunable { 33 34 private static final String PERCENT = "percent"; 35 private static final String DEFAULT = "default"; 36 private static final String DISABLED = "disabled"; 37 38 private final String mBattery; 39 private boolean mBatteryEnabled; 40 private boolean mHasPercentage; 41 private ArraySet<String> mBlacklist; 42 private boolean mHasSetValue; 43 BatteryPreference(Context context, AttributeSet attrs)44 public BatteryPreference(Context context, AttributeSet attrs) { 45 super(context, attrs); 46 mBattery = context.getString(com.android.internal.R.string.status_bar_battery); 47 setEntryValues(new CharSequence[] {PERCENT, DEFAULT, DISABLED }); 48 } 49 50 @Override onAttached()51 public void onAttached() { 52 super.onAttached(); 53 mHasPercentage = Settings.System.getInt(getContext().getContentResolver(), 54 SHOW_BATTERY_PERCENT, 0) != 0; 55 Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST); 56 } 57 58 @Override onDetached()59 public void onDetached() { 60 Dependency.get(TunerService.class).removeTunable(this); 61 super.onDetached(); 62 } 63 64 @Override onTuningChanged(String key, String newValue)65 public void onTuningChanged(String key, String newValue) { 66 if (StatusBarIconController.ICON_BLACKLIST.equals(key)) { 67 mBlacklist = StatusBarIconController.getIconBlacklist(getContext(), newValue); 68 mBatteryEnabled = !mBlacklist.contains(mBattery); 69 } 70 if (!mHasSetValue) { 71 // Because of the complicated tri-state it can end up looping and setting state back to 72 // what the user didn't choose. To avoid this, just set the state once and rely on the 73 // preference to handle updates. 74 mHasSetValue = true; 75 if (mBatteryEnabled && mHasPercentage) { 76 setValue(PERCENT); 77 } else if (mBatteryEnabled) { 78 setValue(DEFAULT); 79 } else { 80 setValue(DISABLED); 81 } 82 } 83 } 84 85 @Override persistString(String value)86 protected boolean persistString(String value) { 87 final boolean v = PERCENT.equals(value); 88 MetricsLogger.action(getContext(), MetricsEvent.TUNER_BATTERY_PERCENTAGE, v); 89 Settings.System.putInt(getContext().getContentResolver(), SHOW_BATTERY_PERCENT, v ? 1 : 0); 90 if (DISABLED.equals(value)) { 91 mBlacklist.add(mBattery); 92 } else { 93 mBlacklist.remove(mBattery); 94 } 95 Dependency.get(TunerService.class).setValue(StatusBarIconController.ICON_BLACKLIST, 96 TextUtils.join(",", mBlacklist)); 97 return true; 98 } 99 } 100