blob: 6563155fb75b7ee16d6bcd0572644b64f8988e4e [file] [log] [blame]
Jason Monk1eb54eb2015-04-29 12:46:42 -04001/*
2 * Copyright (C) 2015 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 */
16package com.android.settings.fuelgauge;
17
Fan Zhangc7162cd2018-06-18 15:21:41 -070018import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType;
Lei Yud2b295b2018-05-09 17:27:17 -070019
Jason Monk1eb54eb2015-04-29 12:46:42 -040020import android.app.Activity;
Jason Monk1eb54eb2015-04-29 12:46:42 -040021import android.content.Context;
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080022import android.os.BatteryUsageStats;
Jason Monk1eb54eb2015-04-29 12:46:42 -040023import android.os.Bundle;
Jason Monk1eb54eb2015-04-29 12:46:42 -040024import android.os.UserManager;
ykhung454698d2021-09-29 00:44:11 +080025import android.util.Log;
Jason Monk1eb54eb2015-04-29 12:46:42 -040026import android.view.Menu;
Jason Monk1eb54eb2015-04-29 12:46:42 -040027
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080028import androidx.annotation.NonNull;
Fan Zhangc7162cd2018-06-18 15:21:41 -070029import androidx.annotation.VisibleForTesting;
tmfang99cc23d2018-06-26 19:01:57 +080030import androidx.loader.app.LoaderManager;
31import androidx.loader.content.Loader;
Fan Zhangc7162cd2018-06-18 15:21:41 -070032
Fan Zhang23f8d592018-08-28 15:11:40 -070033import com.android.settings.dashboard.DashboardFragment;
34
Jason Monk1eb54eb2015-04-29 12:46:42 -040035/**
36 * Common base class for things that need to show the battery usage graph.
37 */
Lei Yud2b295b2018-05-09 17:27:17 -070038public abstract class PowerUsageBase extends DashboardFragment {
Jason Monk1eb54eb2015-04-29 12:46:42 -040039
Salvador Martinez79616272017-07-19 17:14:21 -070040 private static final String TAG = "PowerUsageBase";
Lei Yud2b295b2018-05-09 17:27:17 -070041 private static final String KEY_REFRESH_TYPE = "refresh_type";
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080042 private static final String KEY_INCLUDE_HISTORY = "include_history";
43
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080044 private static final int LOADER_BATTERY_USAGE_STATS = 1;
Jason Monk1eb54eb2015-04-29 12:46:42 -040045
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080046 @VisibleForTesting
47 BatteryUsageStats mBatteryUsageStats;
48
Jason Monk1eb54eb2015-04-29 12:46:42 -040049 protected UserManager mUm;
Mill Chenad99e2e2020-10-21 16:32:56 +080050 protected boolean mIsBatteryPresent = true;
ykhungcdd73e72021-04-09 11:43:22 +080051 private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
Jason Monk1eb54eb2015-04-29 12:46:42 -040052
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080053 @VisibleForTesting
54 final BatteryUsageStatsLoaderCallbacks mBatteryUsageStatsLoaderCallbacks =
55 new BatteryUsageStatsLoaderCallbacks();
56
Jason Monk1eb54eb2015-04-29 12:46:42 -040057 @Override
58 public void onAttach(Activity activity) {
59 super.onAttach(activity);
60 mUm = (UserManager) activity.getSystemService(Context.USER_SERVICE);
Jason Monk1eb54eb2015-04-29 12:46:42 -040061 }
62
63 @Override
64 public void onCreate(Bundle icicle) {
65 super.onCreate(icicle);
jackqdyulei6246fad2017-04-14 11:42:04 -070066
67 mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
Lei Yud2b295b2018-05-09 17:27:17 -070068 mBatteryBroadcastReceiver.setBatteryChangedListener(type -> {
Mill Chenad99e2e2020-10-21 16:32:56 +080069 if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) {
70 mIsBatteryPresent = false;
71 }
Lei Yud2b295b2018-05-09 17:27:17 -070072 restartBatteryStatsLoader(type);
jackqdyulei6246fad2017-04-14 11:42:04 -070073 });
Jason Monk1eb54eb2015-04-29 12:46:42 -040074 }
75
76 @Override
77 public void onStart() {
78 super.onStart();
jackqdyulei6246fad2017-04-14 11:42:04 -070079 mBatteryBroadcastReceiver.register();
Jason Monk1eb54eb2015-04-29 12:46:42 -040080 }
81
82 @Override
Raff Tsai57724062019-09-05 14:22:09 +080083 public void onStop() {
84 super.onStop();
jackqdyulei6246fad2017-04-14 11:42:04 -070085 mBatteryBroadcastReceiver.unRegister();
ykhungc12b9502022-04-28 22:41:24 +080086 closeBatteryUsageStatsIfNeeded();
Jason Monk1eb54eb2015-04-29 12:46:42 -040087 }
88
Lei Yud2b295b2018-05-09 17:27:17 -070089 protected void restartBatteryStatsLoader(int refreshType) {
90 final Bundle bundle = new Bundle();
91 bundle.putInt(KEY_REFRESH_TYPE, refreshType);
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080092 bundle.putBoolean(KEY_INCLUDE_HISTORY, isBatteryHistoryNeeded());
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080093 getLoaderManager().restartLoader(LOADER_BATTERY_USAGE_STATS, bundle,
94 mBatteryUsageStatsLoaderCallbacks);
95 }
Lei Yud2b295b2018-05-09 17:27:17 -070096
ykhungcdd73e72021-04-09 11:43:22 +080097 protected void onLoadFinished(@BatteryUpdateType int refreshType) {
Dmitri Plotnikov820bee82021-02-19 14:34:01 -080098 refreshUi(refreshType);
jackqdyulei2b923ce2017-05-16 16:09:14 -070099 }
100
Lei Yud2b295b2018-05-09 17:27:17 -0700101 protected abstract void refreshUi(@BatteryUpdateType int refreshType);
Dmitri Plotnikov820bee82021-02-19 14:34:01 -0800102 protected abstract boolean isBatteryHistoryNeeded();
Jason Monk1eb54eb2015-04-29 12:46:42 -0400103
104 protected void updatePreference(BatteryHistoryPreference historyPref) {
Salvador Martinez79616272017-07-19 17:14:21 -0700105 final long startTime = System.currentTimeMillis();
Dmitri Plotnikov820bee82021-02-19 14:34:01 -0800106 historyPref.setBatteryUsageStats(mBatteryUsageStats);
Salvador Martinez79616272017-07-19 17:14:21 -0700107 BatteryUtils.logRuntime(TAG, "updatePreference", startTime);
Jason Monk1eb54eb2015-04-29 12:46:42 -0400108 }
109
Dmitri Plotnikov820bee82021-02-19 14:34:01 -0800110 private class BatteryUsageStatsLoaderCallbacks
111 implements LoaderManager.LoaderCallbacks<BatteryUsageStats> {
112 private int mRefreshType;
113
114 @Override
115 @NonNull
116 public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) {
117 mRefreshType = args.getInt(KEY_REFRESH_TYPE);
118 return new BatteryUsageStatsLoader(getContext(), args.getBoolean(KEY_INCLUDE_HISTORY));
119 }
120
121 @Override
122 public void onLoadFinished(Loader<BatteryUsageStats> loader,
123 BatteryUsageStats batteryUsageStats) {
ykhungc12b9502022-04-28 22:41:24 +0800124 closeBatteryUsageStatsIfNeeded();
Dmitri Plotnikov820bee82021-02-19 14:34:01 -0800125 mBatteryUsageStats = batteryUsageStats;
126 PowerUsageBase.this.onLoadFinished(mRefreshType);
127 }
128
129 @Override
130 public void onLoaderReset(Loader<BatteryUsageStats> loader) {
Lei Yud2b295b2018-05-09 17:27:17 -0700131 }
jackqdyulei106dc452017-04-13 11:44:42 -0700132 }
ykhungc12b9502022-04-28 22:41:24 +0800133
134 private void closeBatteryUsageStatsIfNeeded() {
135 if (mBatteryUsageStats == null) {
136 return;
137 }
138 try {
139 mBatteryUsageStats.close();
140 } catch (Exception e) {
141 Log.e(TAG, "BatteryUsageStats.close() failed", e);
142 } finally {
143 mBatteryUsageStats = null;
144 }
145 }
Jason Monk1eb54eb2015-04-29 12:46:42 -0400146}