Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 1 | /* |
| 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 | */ |
| 16 | package com.android.settings.fuelgauge; |
| 17 | |
Fan Zhang | c7162cd | 2018-06-18 15:21:41 -0700 | [diff] [blame] | 18 | import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType; |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 19 | |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 20 | import android.app.Activity; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 21 | import android.content.Context; |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 22 | import android.os.BatteryUsageStats; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 23 | import android.os.Bundle; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 24 | import android.os.UserManager; |
ykhung | 454698d | 2021-09-29 00:44:11 +0800 | [diff] [blame] | 25 | import android.util.Log; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 26 | import android.view.Menu; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 27 | |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 28 | import androidx.annotation.NonNull; |
Fan Zhang | c7162cd | 2018-06-18 15:21:41 -0700 | [diff] [blame] | 29 | import androidx.annotation.VisibleForTesting; |
tmfang | 99cc23d | 2018-06-26 19:01:57 +0800 | [diff] [blame] | 30 | import androidx.loader.app.LoaderManager; |
| 31 | import androidx.loader.content.Loader; |
Fan Zhang | c7162cd | 2018-06-18 15:21:41 -0700 | [diff] [blame] | 32 | |
Fan Zhang | 23f8d59 | 2018-08-28 15:11:40 -0700 | [diff] [blame] | 33 | import com.android.settings.dashboard.DashboardFragment; |
| 34 | |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 35 | /** |
| 36 | * Common base class for things that need to show the battery usage graph. |
| 37 | */ |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 38 | public abstract class PowerUsageBase extends DashboardFragment { |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 39 | |
Salvador Martinez | 7961627 | 2017-07-19 17:14:21 -0700 | [diff] [blame] | 40 | private static final String TAG = "PowerUsageBase"; |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 41 | private static final String KEY_REFRESH_TYPE = "refresh_type"; |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 42 | private static final String KEY_INCLUDE_HISTORY = "include_history"; |
| 43 | |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 44 | private static final int LOADER_BATTERY_USAGE_STATS = 1; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 45 | |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 46 | @VisibleForTesting |
| 47 | BatteryUsageStats mBatteryUsageStats; |
| 48 | |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 49 | protected UserManager mUm; |
Mill Chen | ad99e2e | 2020-10-21 16:32:56 +0800 | [diff] [blame] | 50 | protected boolean mIsBatteryPresent = true; |
ykhung | cdd73e7 | 2021-04-09 11:43:22 +0800 | [diff] [blame] | 51 | private BatteryBroadcastReceiver mBatteryBroadcastReceiver; |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 52 | |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 53 | @VisibleForTesting |
| 54 | final BatteryUsageStatsLoaderCallbacks mBatteryUsageStatsLoaderCallbacks = |
| 55 | new BatteryUsageStatsLoaderCallbacks(); |
| 56 | |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 57 | @Override |
| 58 | public void onAttach(Activity activity) { |
| 59 | super.onAttach(activity); |
| 60 | mUm = (UserManager) activity.getSystemService(Context.USER_SERVICE); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | @Override |
| 64 | public void onCreate(Bundle icicle) { |
| 65 | super.onCreate(icicle); |
jackqdyulei | 6246fad | 2017-04-14 11:42:04 -0700 | [diff] [blame] | 66 | |
| 67 | mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext()); |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 68 | mBatteryBroadcastReceiver.setBatteryChangedListener(type -> { |
Mill Chen | ad99e2e | 2020-10-21 16:32:56 +0800 | [diff] [blame] | 69 | if (type == BatteryBroadcastReceiver.BatteryUpdateType.BATTERY_NOT_PRESENT) { |
| 70 | mIsBatteryPresent = false; |
| 71 | } |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 72 | restartBatteryStatsLoader(type); |
jackqdyulei | 6246fad | 2017-04-14 11:42:04 -0700 | [diff] [blame] | 73 | }); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 74 | } |
| 75 | |
| 76 | @Override |
| 77 | public void onStart() { |
| 78 | super.onStart(); |
jackqdyulei | 6246fad | 2017-04-14 11:42:04 -0700 | [diff] [blame] | 79 | mBatteryBroadcastReceiver.register(); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 80 | } |
| 81 | |
| 82 | @Override |
Raff Tsai | 5772406 | 2019-09-05 14:22:09 +0800 | [diff] [blame] | 83 | public void onStop() { |
| 84 | super.onStop(); |
jackqdyulei | 6246fad | 2017-04-14 11:42:04 -0700 | [diff] [blame] | 85 | mBatteryBroadcastReceiver.unRegister(); |
ykhung | c12b950 | 2022-04-28 22:41:24 +0800 | [diff] [blame] | 86 | closeBatteryUsageStatsIfNeeded(); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 87 | } |
| 88 | |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 89 | protected void restartBatteryStatsLoader(int refreshType) { |
| 90 | final Bundle bundle = new Bundle(); |
| 91 | bundle.putInt(KEY_REFRESH_TYPE, refreshType); |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 92 | bundle.putBoolean(KEY_INCLUDE_HISTORY, isBatteryHistoryNeeded()); |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 93 | getLoaderManager().restartLoader(LOADER_BATTERY_USAGE_STATS, bundle, |
| 94 | mBatteryUsageStatsLoaderCallbacks); |
| 95 | } |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 96 | |
ykhung | cdd73e7 | 2021-04-09 11:43:22 +0800 | [diff] [blame] | 97 | protected void onLoadFinished(@BatteryUpdateType int refreshType) { |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 98 | refreshUi(refreshType); |
jackqdyulei | 2b923ce | 2017-05-16 16:09:14 -0700 | [diff] [blame] | 99 | } |
| 100 | |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 101 | protected abstract void refreshUi(@BatteryUpdateType int refreshType); |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 102 | protected abstract boolean isBatteryHistoryNeeded(); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 103 | |
| 104 | protected void updatePreference(BatteryHistoryPreference historyPref) { |
Salvador Martinez | 7961627 | 2017-07-19 17:14:21 -0700 | [diff] [blame] | 105 | final long startTime = System.currentTimeMillis(); |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 106 | historyPref.setBatteryUsageStats(mBatteryUsageStats); |
Salvador Martinez | 7961627 | 2017-07-19 17:14:21 -0700 | [diff] [blame] | 107 | BatteryUtils.logRuntime(TAG, "updatePreference", startTime); |
Jason Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 108 | } |
| 109 | |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 110 | 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) { |
ykhung | c12b950 | 2022-04-28 22:41:24 +0800 | [diff] [blame] | 124 | closeBatteryUsageStatsIfNeeded(); |
Dmitri Plotnikov | 820bee8 | 2021-02-19 14:34:01 -0800 | [diff] [blame] | 125 | mBatteryUsageStats = batteryUsageStats; |
| 126 | PowerUsageBase.this.onLoadFinished(mRefreshType); |
| 127 | } |
| 128 | |
| 129 | @Override |
| 130 | public void onLoaderReset(Loader<BatteryUsageStats> loader) { |
Lei Yu | d2b295b | 2018-05-09 17:27:17 -0700 | [diff] [blame] | 131 | } |
jackqdyulei | 106dc45 | 2017-04-13 11:44:42 -0700 | [diff] [blame] | 132 | } |
ykhung | c12b950 | 2022-04-28 22:41:24 +0800 | [diff] [blame] | 133 | |
| 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 Monk | 1eb54eb | 2015-04-29 12:46:42 -0400 | [diff] [blame] | 146 | } |