1 /* 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. 14 * 15 * 16 */ 17 18 package com.android.settings.fuelgauge; 19 20 import android.app.Activity; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.IntentFilter; 24 import android.icu.text.NumberFormat; 25 import android.os.BatteryManager; 26 import android.os.PowerManager; 27 import android.text.TextUtils; 28 import android.widget.TextView; 29 30 import androidx.annotation.VisibleForTesting; 31 import androidx.preference.PreferenceFragmentCompat; 32 import androidx.preference.PreferenceScreen; 33 34 import com.android.settings.R; 35 import com.android.settings.core.BasePreferenceController; 36 import com.android.settings.core.PreferenceControllerMixin; 37 import com.android.settings.widget.EntityHeaderController; 38 import com.android.settingslib.Utils; 39 import com.android.settingslib.core.lifecycle.Lifecycle; 40 import com.android.settingslib.core.lifecycle.LifecycleObserver; 41 import com.android.settingslib.core.lifecycle.events.OnStart; 42 import com.android.settingslib.widget.LayoutPreference; 43 44 /** 45 * Controller that update the battery header view 46 */ 47 public class BatteryHeaderPreferenceController extends BasePreferenceController 48 implements PreferenceControllerMixin, LifecycleObserver, OnStart { 49 @VisibleForTesting 50 static final String KEY_BATTERY_HEADER = "battery_header"; 51 52 @VisibleForTesting 53 BatteryMeterView mBatteryMeterView; 54 @VisibleForTesting 55 TextView mBatteryPercentText; 56 @VisibleForTesting 57 TextView mSummary1; 58 59 private Activity mActivity; 60 private PreferenceFragmentCompat mHost; 61 private Lifecycle mLifecycle; 62 private final PowerManager mPowerManager; 63 64 private LayoutPreference mBatteryLayoutPref; 65 BatteryHeaderPreferenceController(Context context, String key)66 public BatteryHeaderPreferenceController(Context context, String key) { 67 super(context, key); 68 mPowerManager = context.getSystemService(PowerManager.class); 69 } 70 setActivity(Activity activity)71 public void setActivity(Activity activity) { 72 mActivity = activity; 73 } 74 setFragment(PreferenceFragmentCompat fragment)75 public void setFragment(PreferenceFragmentCompat fragment) { 76 mHost = fragment; 77 } 78 setLifecycle(Lifecycle lifecycle)79 public void setLifecycle(Lifecycle lifecycle) { 80 mLifecycle = lifecycle; 81 } 82 83 @Override displayPreference(PreferenceScreen screen)84 public void displayPreference(PreferenceScreen screen) { 85 super.displayPreference(screen); 86 mBatteryLayoutPref = screen.findPreference(getPreferenceKey()); 87 mBatteryMeterView = mBatteryLayoutPref 88 .findViewById(R.id.battery_header_icon); 89 mBatteryPercentText = mBatteryLayoutPref.findViewById(R.id.battery_percent); 90 mSummary1 = mBatteryLayoutPref.findViewById(R.id.summary1); 91 92 quickUpdateHeaderPreference(); 93 } 94 95 @Override getAvailabilityStatus()96 public int getAvailabilityStatus() { 97 return AVAILABLE_UNSEARCHABLE; 98 } 99 100 @Override onStart()101 public void onStart() { 102 EntityHeaderController.newInstance(mActivity, mHost, 103 mBatteryLayoutPref.findViewById(R.id.battery_entity_header)) 104 .setRecyclerView(mHost.getListView(), mLifecycle) 105 .styleActionBar(mActivity); 106 } 107 updateHeaderPreference(BatteryInfo info)108 public void updateHeaderPreference(BatteryInfo info) { 109 mBatteryPercentText.setText(formatBatteryPercentageText(info.batteryLevel)); 110 if (info.remainingLabel == null) { 111 mSummary1.setText(info.statusLabel); 112 } else { 113 mSummary1.setText(info.remainingLabel); 114 } 115 116 mBatteryMeterView.setBatteryLevel(info.batteryLevel); 117 mBatteryMeterView.setCharging(!info.discharging); 118 mBatteryMeterView.setPowerSave(mPowerManager.isPowerSaveMode()); 119 } 120 quickUpdateHeaderPreference()121 public void quickUpdateHeaderPreference() { 122 Intent batteryBroadcast = mContext.registerReceiver(null, 123 new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 124 final int batteryLevel = Utils.getBatteryLevel(batteryBroadcast); 125 final boolean discharging = 126 batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0; 127 128 // Set battery level and charging status 129 mBatteryMeterView.setBatteryLevel(batteryLevel); 130 mBatteryMeterView.setCharging(!discharging); 131 mBatteryMeterView.setPowerSave(mPowerManager.isPowerSaveMode()); 132 mBatteryPercentText.setText(formatBatteryPercentageText(batteryLevel)); 133 } 134 formatBatteryPercentageText(int batteryLevel)135 private CharSequence formatBatteryPercentageText(int batteryLevel) { 136 return TextUtils.expandTemplate(mContext.getText(R.string.battery_header_title_alternate), 137 NumberFormat.getIntegerInstance().format(batteryLevel)); 138 } 139 } 140