OSDN Git Service

Remove Slice getter from BasePreferenceController
[android-x86/packages-apps-Settings.git] / src / com / android / settings / applications / appinfo / AppBatteryPreferenceController.java
1 /*
2  * Copyright (C) 2017 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.applications.appinfo;
18
19 import android.app.LoaderManager;
20 import android.content.Context;
21 import android.content.Loader;
22 import android.content.pm.PackageInfo;
23 import android.os.BatteryStats;
24 import android.os.Bundle;
25 import android.os.UserManager;
26 import android.support.annotation.VisibleForTesting;
27 import android.support.v7.preference.Preference;
28 import android.support.v7.preference.PreferenceScreen;
29
30 import com.android.internal.os.BatterySipper;
31 import com.android.internal.os.BatteryStatsHelper;
32 import com.android.settings.R;
33 import com.android.settings.SettingsActivity;
34 import com.android.settings.Utils;
35 import com.android.settings.applications.AppInfoDashboardFragment;
36 import com.android.settings.core.BasePreferenceController;
37 import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
38 import com.android.settings.fuelgauge.BatteryEntry;
39 import com.android.settings.fuelgauge.BatteryStatsHelperLoader;
40 import com.android.settings.fuelgauge.BatteryUtils;
41 import com.android.settingslib.core.lifecycle.Lifecycle;
42 import com.android.settingslib.core.lifecycle.LifecycleObserver;
43 import com.android.settingslib.core.lifecycle.events.OnPause;
44 import com.android.settingslib.core.lifecycle.events.OnResume;
45
46 import java.util.ArrayList;
47 import java.util.List;
48
49 public class AppBatteryPreferenceController extends BasePreferenceController
50         implements LoaderManager.LoaderCallbacks<BatteryStatsHelper>,
51         LifecycleObserver, OnResume, OnPause {
52
53     private static final String KEY_BATTERY = "battery";
54
55     @VisibleForTesting
56     BatterySipper mSipper;
57     @VisibleForTesting
58     BatteryStatsHelper mBatteryHelper;
59     @VisibleForTesting
60     BatteryUtils mBatteryUtils;
61
62     private Preference mPreference;
63     private final AppInfoDashboardFragment mParent;
64     private String mBatteryPercent;
65     private final String mPackageName;
66
67     public AppBatteryPreferenceController(Context context, AppInfoDashboardFragment parent,
68             String packageName, Lifecycle lifecycle) {
69         super(context, KEY_BATTERY);
70         mParent = parent;
71         mBatteryUtils = BatteryUtils.getInstance(mContext);
72         mPackageName = packageName;
73         if (lifecycle != null) {
74             lifecycle.addObserver(this);
75         }
76     }
77
78     @Override
79     public int getAvailabilityStatus() {
80         return AVAILABLE;
81     }
82
83     @Override
84     public void displayPreference(PreferenceScreen screen) {
85         super.displayPreference(screen);
86         mPreference = screen.findPreference(getPreferenceKey());
87         mPreference.setEnabled(false);
88     }
89
90     @Override
91     public boolean handlePreferenceTreeClick(Preference preference) {
92         if (!KEY_BATTERY.equals(preference.getKey())) {
93             return false;
94         }
95         if (isBatteryStatsAvailable()) {
96             final UserManager userManager =
97                     (UserManager) mContext.getSystemService(Context.USER_SERVICE);
98             final BatteryEntry entry = new BatteryEntry(mContext, null, userManager, mSipper);
99             entry.defaultPackageName = mPackageName;
100             AdvancedPowerUsageDetail.startBatteryDetailPage(
101                     (SettingsActivity) mParent.getActivity(), mParent, mBatteryHelper,
102                     BatteryStats.STATS_SINCE_CHARGED, entry, mBatteryPercent,
103                     null /* mAnomalies */);
104         } else {
105             AdvancedPowerUsageDetail.startBatteryDetailPage(
106                     (SettingsActivity) mParent.getActivity(), mParent, mPackageName);
107         }
108         return true;
109     }
110
111     @Override
112     public void onResume() {
113         mParent.getLoaderManager().restartLoader(
114                 mParent.LOADER_BATTERY, Bundle.EMPTY, this);
115     }
116
117     @Override
118     public void onPause() {
119         mParent.getLoaderManager().destroyLoader(mParent.LOADER_BATTERY);
120     }
121
122     @Override
123     public Loader<BatteryStatsHelper> onCreateLoader(int id, Bundle args) {
124         return new BatteryStatsHelperLoader(mContext);
125     }
126
127     @Override
128     public void onLoadFinished(Loader<BatteryStatsHelper> loader,
129             BatteryStatsHelper batteryHelper) {
130         mBatteryHelper = batteryHelper;
131         final PackageInfo packageInfo = mParent.getPackageInfo();
132         if (packageInfo != null) {
133             mSipper = findTargetSipper(batteryHelper, packageInfo.applicationInfo.uid);
134             if (mParent.getActivity() != null) {
135                 updateBattery();
136             }
137         }
138     }
139
140     @Override
141     public void onLoaderReset(Loader<BatteryStatsHelper> loader) {
142     }
143
144     @VisibleForTesting
145     void updateBattery() {
146         mPreference.setEnabled(true);
147         if (isBatteryStatsAvailable()) {
148             final int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount(
149                     BatteryStats.STATS_SINCE_CHARGED);
150
151             final List<BatterySipper> usageList = new ArrayList<>(mBatteryHelper.getUsageList());
152             final double hiddenAmount = mBatteryUtils.removeHiddenBatterySippers(usageList);
153             final int percentOfMax = (int) mBatteryUtils.calculateBatteryPercent(
154                     mSipper.totalPowerMah, mBatteryHelper.getTotalPower(), hiddenAmount,
155                     dischargeAmount);
156             mBatteryPercent = Utils.formatPercentage(percentOfMax);
157             mPreference.setSummary(mContext.getString(R.string.battery_summary, mBatteryPercent));
158         } else {
159             mPreference.setSummary(mContext.getString(R.string.no_battery_summary));
160         }
161     }
162
163     @VisibleForTesting
164     boolean isBatteryStatsAvailable() {
165         return mBatteryHelper != null && mSipper != null;
166     }
167
168     @VisibleForTesting
169     BatterySipper findTargetSipper(BatteryStatsHelper batteryHelper, int uid) {
170         final List<BatterySipper> usageList = batteryHelper.getUsageList();
171         for (int i = 0, size = usageList.size(); i < size; i++) {
172             final BatterySipper sipper = usageList.get(i);
173             if (sipper.getUid() == uid) {
174                 return sipper;
175             }
176         }
177         return null;
178     }
179
180 }