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