blob: 5adcf352e260dd86887d62578644c8e0976e0c93 [file] [log] [blame]
Makoto Onuki66a78122017-11-14 15:03:21 -08001/*
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 */
16package com.android.server.power.batterysaver;
17
18import android.Manifest;
Makoto Onukie098b7592017-11-27 17:50:41 -080019import android.app.ActivityManagerInternal;
Makoto Onuki66a78122017-11-14 15:03:21 -080020import android.content.BroadcastReceiver;
21import android.content.Context;
22import android.content.Intent;
23import android.content.IntentFilter;
24import android.hardware.power.V1_0.PowerHint;
Makoto Onuki076218b2018-01-26 10:26:36 -080025import android.os.BatteryManager;
Kweku Adams9f488e22019-01-14 16:25:08 -080026import android.os.BatterySaverPolicyConfig;
Makoto Onuki66a78122017-11-14 15:03:21 -080027import android.os.Handler;
28import android.os.Looper;
29import android.os.Message;
30import android.os.PowerManager;
Makoto Onuki3aaed292017-11-15 16:31:24 -080031import android.os.PowerManagerInternal;
Makoto Onuki66a78122017-11-14 15:03:21 -080032import android.os.PowerManagerInternal.LowPowerModeListener;
33import android.os.PowerSaveState;
34import android.os.UserHandle;
35import android.util.ArrayMap;
36import android.util.Slog;
Makoto Onuki66a78122017-11-14 15:03:21 -080037
38import com.android.internal.annotations.GuardedBy;
Kweku Adams7fb72a42019-01-08 16:08:49 -080039import com.android.internal.annotations.VisibleForTesting;
Makoto Onuki3aaed292017-11-15 16:31:24 -080040import com.android.internal.util.ArrayUtils;
Makoto Onuki66a78122017-11-14 15:03:21 -080041import com.android.internal.util.Preconditions;
Makoto Onuki85dd0852017-12-01 09:16:48 -080042import com.android.server.EventLogTags;
Makoto Onuki3aaed292017-11-15 16:31:24 -080043import com.android.server.LocalServices;
Makoto Onuki66a78122017-11-14 15:03:21 -080044import com.android.server.power.PowerManagerService;
Kweku Adams7fb72a42019-01-08 16:08:49 -080045import com.android.server.power.batterysaver.BatterySaverPolicy.BatterySaverPolicyListener;
Kweku Adams9f488e22019-01-14 16:25:08 -080046import com.android.server.power.batterysaver.BatterySaverPolicy.Policy;
Makoto Onuki076218b2018-01-26 10:26:36 -080047import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState;
48import com.android.server.power.batterysaver.BatterySavingStats.DozeState;
49import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState;
Makoto Onuki66a78122017-11-14 15:03:21 -080050
51import java.util.ArrayList;
52
53/**
54 * Responsible for battery saver mode transition logic.
Makoto Onukibd7a6252018-05-10 13:41:39 -070055 *
56 * IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy.
57 * Do not call out with the lock held. (Settings provider is okay.)
Makoto Onuki66a78122017-11-14 15:03:21 -080058 */
59public class BatterySaverController implements BatterySaverPolicyListener {
60 static final String TAG = "BatterySaverController";
61
Makoto Onukice643a32017-11-20 14:31:06 -080062 static final boolean DEBUG = BatterySaverPolicy.DEBUG;
Makoto Onuki66a78122017-11-14 15:03:21 -080063
Makoto Onukibd7a6252018-05-10 13:41:39 -070064 private final Object mLock;
Makoto Onuki66a78122017-11-14 15:03:21 -080065 private final Context mContext;
66 private final MyHandler mHandler;
67 private final FileUpdater mFileUpdater;
68
69 private PowerManager mPowerManager;
70
71 private final BatterySaverPolicy mBatterySaverPolicy;
72
Makoto Onuki076218b2018-01-26 10:26:36 -080073 private final BatterySavingStats mBatterySavingStats;
74
Makoto Onuki66a78122017-11-14 15:03:21 -080075 @GuardedBy("mLock")
76 private final ArrayList<LowPowerModeListener> mListeners = new ArrayList<>();
77
78 @GuardedBy("mLock")
Kweku Adams9f488e22019-01-14 16:25:08 -080079 private boolean mFullEnabled;
80
81 @GuardedBy("mLock")
82 private boolean mAdaptiveEnabled;
Makoto Onuki66a78122017-11-14 15:03:21 -080083
Makoto Onuki076218b2018-01-26 10:26:36 -080084 @GuardedBy("mLock")
85 private boolean mIsPluggedIn;
86
Makoto Onuki85dd0852017-12-01 09:16:48 -080087 /**
Kweku Adams9f488e22019-01-14 16:25:08 -080088 * Whether full was previously enabled or not; only for the event logging. Only use it from
Makoto Onuki85dd0852017-12-01 09:16:48 -080089 * {@link #handleBatterySaverStateChanged}.
90 */
Kweku Adams9f488e22019-01-14 16:25:08 -080091 private boolean mFullPreviouslyEnabled;
92
93 /**
94 * Whether adaptive was previously enabled or not; only for the event logging. Only use it from
95 * {@link #handleBatterySaverStateChanged}.
96 */
97 private boolean mAdaptivePreviouslyEnabled;
Makoto Onuki85dd0852017-12-01 09:16:48 -080098
Makoto Onuki2b186fa2017-11-29 13:51:01 -080099 @GuardedBy("mLock")
100 private boolean mIsInteractive;
101
102 /**
103 * Read-only list of plugins. No need for synchronization.
104 */
105 private final Plugin[] mPlugins;
106
Salvador Martinez04b98332018-10-02 11:28:39 -0700107 public static final int REASON_PERCENTAGE_AUTOMATIC_ON = 0;
108 public static final int REASON_PERCENTAGE_AUTOMATIC_OFF = 1;
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700109 public static final int REASON_MANUAL_ON = 2;
110 public static final int REASON_MANUAL_OFF = 3;
111 public static final int REASON_STICKY_RESTORE = 4;
112 public static final int REASON_INTERACTIVE_CHANGED = 5;
113 public static final int REASON_POLICY_CHANGED = 6;
114 public static final int REASON_PLUGGED_IN = 7;
115 public static final int REASON_SETTING_CHANGED = 8;
Salvador Martinez04b98332018-10-02 11:28:39 -0700116 public static final int REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_ON = 9;
117 public static final int REASON_DYNAMIC_POWER_SAVINGS_AUTOMATIC_OFF = 10;
Kweku Adams9f488e22019-01-14 16:25:08 -0800118 public static final int REASON_STICKY_RESTORE_OFF = 11;
119 public static final int REASON_ADAPTIVE_DYNAMIC_POWER_SAVINGS_CHANGED = 12;
120 public static final int REASON_TIMEOUT = 13;
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700121
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800122 /**
123 * Plugin interface. All methods are guaranteed to be called on the same (handler) thread.
124 */
125 public interface Plugin {
126 void onSystemReady(BatterySaverController caller);
127
128 void onBatterySaverChanged(BatterySaverController caller);
129 }
130
Makoto Onuki66a78122017-11-14 15:03:21 -0800131 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
132 @Override
133 public void onReceive(Context context, Intent intent) {
Makoto Onuki076218b2018-01-26 10:26:36 -0800134 if (DEBUG) {
135 Slog.d(TAG, "onReceive: " + intent);
136 }
Makoto Onuki66a78122017-11-14 15:03:21 -0800137 switch (intent.getAction()) {
138 case Intent.ACTION_SCREEN_ON:
139 case Intent.ACTION_SCREEN_OFF:
Kweku Adams9f488e22019-01-14 16:25:08 -0800140 if (!isPolicyEnabled()) {
Makoto Onuki076218b2018-01-26 10:26:36 -0800141 updateBatterySavingStats();
Makoto Onuki3aaed292017-11-15 16:31:24 -0800142 return; // No need to send it if not enabled.
143 }
144 // Don't send the broadcast, because we never did so in this case.
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700145 mHandler.postStateChanged(/*sendBroadcast=*/ false,
146 REASON_INTERACTIVE_CHANGED);
Makoto Onuki66a78122017-11-14 15:03:21 -0800147 break;
Makoto Onuki076218b2018-01-26 10:26:36 -0800148 case Intent.ACTION_BATTERY_CHANGED:
149 synchronized (mLock) {
150 mIsPluggedIn = (intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0);
151 }
152 // Fall-through.
153 case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED:
154 case PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED:
155 updateBatterySavingStats();
156 break;
Makoto Onuki66a78122017-11-14 15:03:21 -0800157 }
158 }
159 };
160
161 /**
162 * Constructor.
163 */
Makoto Onukibd7a6252018-05-10 13:41:39 -0700164 public BatterySaverController(Object lock, Context context, Looper looper,
165 BatterySaverPolicy policy, BatterySavingStats batterySavingStats) {
166 mLock = lock;
Makoto Onuki66a78122017-11-14 15:03:21 -0800167 mContext = context;
168 mHandler = new MyHandler(looper);
169 mBatterySaverPolicy = policy;
170 mBatterySaverPolicy.addListener(this);
171 mFileUpdater = new FileUpdater(context);
Makoto Onukibd7a6252018-05-10 13:41:39 -0700172 mBatterySavingStats = batterySavingStats;
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800173
174 // Initialize plugins.
Kweku Adams7fb72a42019-01-08 16:08:49 -0800175 mPlugins = new Plugin[] {
176 new BatterySaverLocationPlugin(mContext)
177 };
Makoto Onuki66a78122017-11-14 15:03:21 -0800178 }
179
180 /**
181 * Add a listener.
182 */
183 public void addListener(LowPowerModeListener listener) {
184 synchronized (mLock) {
185 mListeners.add(listener);
186 }
187 }
188
189 /**
Makoto Onukibd7a6252018-05-10 13:41:39 -0700190 * Called by {@link PowerManagerService} on system ready, *with no lock held*.
Makoto Onuki66a78122017-11-14 15:03:21 -0800191 */
192 public void systemReady() {
193 final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
194 filter.addAction(Intent.ACTION_SCREEN_OFF);
Makoto Onuki076218b2018-01-26 10:26:36 -0800195 filter.addAction(Intent.ACTION_BATTERY_CHANGED);
196 filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
197 filter.addAction(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED);
Makoto Onuki66a78122017-11-14 15:03:21 -0800198 mContext.registerReceiver(mReceiver, filter);
Makoto Onukie098b7592017-11-27 17:50:41 -0800199
200 mFileUpdater.systemReady(LocalServices.getService(ActivityManagerInternal.class)
201 .isRuntimeRestarted());
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800202 mHandler.postSystemReady();
Makoto Onuki66a78122017-11-14 15:03:21 -0800203 }
204
205 private PowerManager getPowerManager() {
206 if (mPowerManager == null) {
207 mPowerManager =
208 Preconditions.checkNotNull(mContext.getSystemService(PowerManager.class));
209 }
210 return mPowerManager;
211 }
212
213 @Override
214 public void onBatterySaverPolicyChanged(BatterySaverPolicy policy) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800215 if (!isPolicyEnabled()) {
Makoto Onuki3aaed292017-11-15 16:31:24 -0800216 return; // No need to send it if not enabled.
217 }
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700218 mHandler.postStateChanged(/*sendBroadcast=*/ true, REASON_POLICY_CHANGED);
Makoto Onuki66a78122017-11-14 15:03:21 -0800219 }
220
221 private class MyHandler extends Handler {
Makoto Onuki3aaed292017-11-15 16:31:24 -0800222 private static final int MSG_STATE_CHANGED = 1;
223
224 private static final int ARG_DONT_SEND_BROADCAST = 0;
225 private static final int ARG_SEND_BROADCAST = 1;
Makoto Onuki66a78122017-11-14 15:03:21 -0800226
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800227 private static final int MSG_SYSTEM_READY = 2;
228
Makoto Onuki66a78122017-11-14 15:03:21 -0800229 public MyHandler(Looper looper) {
230 super(looper);
231 }
232
Kweku Adams7fb72a42019-01-08 16:08:49 -0800233 void postStateChanged(boolean sendBroadcast, int reason) {
Makoto Onuki3aaed292017-11-15 16:31:24 -0800234 obtainMessage(MSG_STATE_CHANGED, sendBroadcast ?
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700235 ARG_SEND_BROADCAST : ARG_DONT_SEND_BROADCAST, reason).sendToTarget();
Makoto Onuki66a78122017-11-14 15:03:21 -0800236 }
237
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800238 public void postSystemReady() {
239 obtainMessage(MSG_SYSTEM_READY, 0, 0).sendToTarget();
240 }
241
Makoto Onuki66a78122017-11-14 15:03:21 -0800242 @Override
243 public void dispatchMessage(Message msg) {
244 switch (msg.what) {
245 case MSG_STATE_CHANGED:
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700246 handleBatterySaverStateChanged(
247 msg.arg1 == ARG_SEND_BROADCAST,
248 msg.arg2);
Makoto Onuki66a78122017-11-14 15:03:21 -0800249 break;
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800250
251 case MSG_SYSTEM_READY:
252 for (Plugin p : mPlugins) {
253 p.onSystemReady(BatterySaverController.this);
254 }
255 break;
Makoto Onuki66a78122017-11-14 15:03:21 -0800256 }
257 }
258 }
259
Kweku Adams7fb72a42019-01-08 16:08:49 -0800260 /** Enable or disable full battery saver. */
261 @VisibleForTesting
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700262 public void enableBatterySaver(boolean enable, int reason) {
Makoto Onuki66a78122017-11-14 15:03:21 -0800263 synchronized (mLock) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800264 if (mFullEnabled == enable) {
Makoto Onuki66a78122017-11-14 15:03:21 -0800265 return;
266 }
Kweku Adams9f488e22019-01-14 16:25:08 -0800267 mFullEnabled = enable;
Makoto Onuki66a78122017-11-14 15:03:21 -0800268
Kweku Adams9f488e22019-01-14 16:25:08 -0800269 if (updatePolicyLevelLocked()) {
270 mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
271 }
Makoto Onuki3aaed292017-11-15 16:31:24 -0800272 }
273 }
274
Kweku Adams9f488e22019-01-14 16:25:08 -0800275 private boolean updatePolicyLevelLocked() {
276 if (mFullEnabled) {
277 return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_FULL);
278 } else if (mAdaptiveEnabled) {
279 return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_ADAPTIVE);
280 } else {
281 return mBatterySaverPolicy.setPolicyLevel(BatterySaverPolicy.POLICY_LEVEL_OFF);
282 }
283 }
284
285 /**
286 * @return whether battery saver is enabled or not. This takes into
287 * account whether a policy says to advertise isEnabled so this can be propagated externally.
288 */
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800289 public boolean isEnabled() {
Makoto Onuki3aaed292017-11-15 16:31:24 -0800290 synchronized (mLock) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800291 return mFullEnabled
292 || (mAdaptiveEnabled && mBatterySaverPolicy.shouldAdvertiseIsEnabled());
Makoto Onuki66a78122017-11-14 15:03:21 -0800293 }
294 }
295
Kweku Adams9f488e22019-01-14 16:25:08 -0800296 /**
297 * @return whether battery saver policy is enabled or not. This does not take into account
298 * whether a policy says to advertise isEnabled, so this shouldn't be propagated externally.
299 */
300 private boolean isPolicyEnabled() {
301 synchronized (mLock) {
302 return mFullEnabled || mAdaptiveEnabled;
303 }
304 }
305
306 boolean isFullEnabled() {
307 synchronized (mLock) {
308 return mFullEnabled;
309 }
310 }
311
312 boolean isAdaptiveEnabled() {
313 synchronized (mLock) {
314 return mAdaptiveEnabled;
315 }
316 }
317
318 boolean setAdaptivePolicyLocked(String settings, String deviceSpecificSettings, int reason) {
319 return setAdaptivePolicyLocked(
320 BatterySaverPolicy.Policy.fromSettings(settings, deviceSpecificSettings),
321 reason);
322 }
323
324 boolean setAdaptivePolicyLocked(BatterySaverPolicyConfig config, int reason) {
325 return setAdaptivePolicyLocked(BatterySaverPolicy.Policy.fromConfig(config), reason);
326 }
327
328 boolean setAdaptivePolicyLocked(Policy policy, int reason) {
329 if (mBatterySaverPolicy.setAdaptivePolicyLocked(policy)) {
330 mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
331 return true;
332 }
333 return false;
334 }
335
336 boolean resetAdaptivePolicyLocked(int reason) {
337 if (mBatterySaverPolicy.resetAdaptivePolicyLocked()) {
338 mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
339 return true;
340 }
341 return false;
342 }
343
344 boolean setAdaptivePolicyEnabledLocked(boolean enabled, int reason) {
345 if (mAdaptiveEnabled == enabled) {
346 return false;
347 }
348 mAdaptiveEnabled = enabled;
349 if (updatePolicyLevelLocked()) {
350 mHandler.postStateChanged(/*sendBroadcast=*/ true, reason);
351 return true;
352 }
353 return false;
354 }
355
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800356 /** @return whether device is in interactive state. */
357 public boolean isInteractive() {
358 synchronized (mLock) {
359 return mIsInteractive;
360 }
361 }
362
363 /** @return Battery saver policy. */
364 public BatterySaverPolicy getBatterySaverPolicy() {
365 return mBatterySaverPolicy;
366 }
367
Makoto Onuki66a78122017-11-14 15:03:21 -0800368 /**
Makoto Onukia7d8c4d2017-11-20 15:20:16 -0800369 * @return true if launch boost should currently be disabled.
370 */
371 public boolean isLaunchBoostDisabled() {
Kweku Adams9f488e22019-01-14 16:25:08 -0800372 return isPolicyEnabled() && mBatterySaverPolicy.isLaunchBoostDisabled();
Makoto Onukia7d8c4d2017-11-20 15:20:16 -0800373 }
374
375 /**
Makoto Onuki66a78122017-11-14 15:03:21 -0800376 * Dispatch power save events to the listeners.
377 *
Makoto Onuki3aaed292017-11-15 16:31:24 -0800378 * This method is always called on the handler thread.
379 *
380 * This method is called only in the following cases:
381 * - When battery saver becomes activated.
382 * - When battery saver becomes deactivated.
Kweku Adams602374e2018-10-01 13:12:05 -0700383 * - When battery saver is on and the interactive state changes.
384 * - When battery saver is on and the battery saver policy changes.
Kweku Adams9f488e22019-01-14 16:25:08 -0800385 * - When adaptive battery saver becomes activated.
386 * - When adaptive battery saver becomes deactivated.
Kweku Adams4fb074e2019-02-01 16:03:27 -0800387 * - When adaptive battery saver is active (and full is off) and the policy changes.
Makoto Onuki66a78122017-11-14 15:03:21 -0800388 */
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700389 void handleBatterySaverStateChanged(boolean sendBroadcast, int reason) {
Makoto Onuki66a78122017-11-14 15:03:21 -0800390 final LowPowerModeListener[] listeners;
391
Makoto Onuki66a78122017-11-14 15:03:21 -0800392 final boolean enabled;
Makoto Onuki3aaed292017-11-15 16:31:24 -0800393 final boolean isInteractive = getPowerManager().isInteractive();
Makoto Onuki66a78122017-11-14 15:03:21 -0800394 final ArrayMap<String, String> fileValues;
395
396 synchronized (mLock) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800397 enabled = mFullEnabled || mAdaptiveEnabled;
398
Makoto Onuki85dd0852017-12-01 09:16:48 -0800399 EventLogTags.writeBatterySaverMode(
Kweku Adams9f488e22019-01-14 16:25:08 -0800400 mFullPreviouslyEnabled ? 1 : 0, // Previously off or on.
401 mAdaptivePreviouslyEnabled ? 1 : 0, // Previously off or on.
402 mFullEnabled ? 1 : 0, // Now off or on.
403 mAdaptiveEnabled ? 1 : 0, // Now off or on.
Makoto Onuki85dd0852017-12-01 09:16:48 -0800404 isInteractive ? 1 : 0, // Device interactive state.
Kweku Adams9f488e22019-01-14 16:25:08 -0800405 enabled ? mBatterySaverPolicy.toEventLogString() : "",
Makoto Onuki0f8617a2018-04-30 10:26:21 -0700406 reason);
Kweku Adams9f488e22019-01-14 16:25:08 -0800407
408 mFullPreviouslyEnabled = mFullEnabled;
409 mAdaptivePreviouslyEnabled = mAdaptiveEnabled;
Makoto Onuki66a78122017-11-14 15:03:21 -0800410
Kweku Adams7fb72a42019-01-08 16:08:49 -0800411 listeners = mListeners.toArray(new LowPowerModeListener[0]);
Makoto Onuki85dd0852017-12-01 09:16:48 -0800412
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800413 mIsInteractive = isInteractive;
Makoto Onuki66a78122017-11-14 15:03:21 -0800414
415 if (enabled) {
Makoto Onuki3aaed292017-11-15 16:31:24 -0800416 fileValues = mBatterySaverPolicy.getFileValues(isInteractive);
Makoto Onuki66a78122017-11-14 15:03:21 -0800417 } else {
418 fileValues = null;
419 }
420 }
421
Makoto Onuki3aaed292017-11-15 16:31:24 -0800422 final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
423 if (pmi != null) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800424 pmi.powerHint(PowerHint.LOW_POWER, isEnabled() ? 1 : 0);
Makoto Onuki3aaed292017-11-15 16:31:24 -0800425 }
Makoto Onuki66a78122017-11-14 15:03:21 -0800426
Makoto Onuki076218b2018-01-26 10:26:36 -0800427 updateBatterySavingStats();
428
Makoto Onuki3aaed292017-11-15 16:31:24 -0800429 if (ArrayUtils.isEmpty(fileValues)) {
Makoto Onuki66a78122017-11-14 15:03:21 -0800430 mFileUpdater.restoreDefault();
431 } else {
432 mFileUpdater.writeFiles(fileValues);
433 }
434
Makoto Onuki2b186fa2017-11-29 13:51:01 -0800435 for (Plugin p : mPlugins) {
436 p.onBatterySaverChanged(this);
437 }
438
Makoto Onuki3aaed292017-11-15 16:31:24 -0800439 if (sendBroadcast) {
Makoto Onuki1ecaf7c2017-11-27 14:05:53 -0800440
Makoto Onuki66a78122017-11-14 15:03:21 -0800441 if (DEBUG) {
Kweku Adams9f488e22019-01-14 16:25:08 -0800442 Slog.i(TAG, "Sending broadcasts for mode: " + isEnabled());
Makoto Onuki66a78122017-11-14 15:03:21 -0800443 }
444
445 // Send the broadcasts and notify the listeners. We only do this when the battery saver
446 // mode changes, but not when only the screen state changes.
447 Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)
Kweku Adams9f488e22019-01-14 16:25:08 -0800448 .putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, isEnabled())
Makoto Onuki66a78122017-11-14 15:03:21 -0800449 .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
Makoto Onuki217f5ab2018-02-28 16:56:21 -0800450 mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
Makoto Onuki66a78122017-11-14 15:03:21 -0800451
452 intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
453 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
454 mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
455
456 // Send internal version that requires signature permission.
457 intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL);
458 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
459 mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
460 Manifest.permission.DEVICE_POWER);
461
Makoto Onuki66a78122017-11-14 15:03:21 -0800462 for (LowPowerModeListener listener : listeners) {
463 final PowerSaveState result =
Kweku Adams9f488e22019-01-14 16:25:08 -0800464 mBatterySaverPolicy.getBatterySaverPolicy(listener.getServiceType());
Makoto Onuki66a78122017-11-14 15:03:21 -0800465 listener.onLowPowerModeChanged(result);
466 }
467 }
Makoto Onuki66a78122017-11-14 15:03:21 -0800468 }
Makoto Onuki036cc812017-11-29 17:46:36 -0800469
Makoto Onuki076218b2018-01-26 10:26:36 -0800470 private void updateBatterySavingStats() {
471 final PowerManager pm = getPowerManager();
472 if (pm == null) {
473 Slog.wtf(TAG, "PowerManager not initialized");
474 return;
475 }
476 final boolean isInteractive = pm.isInteractive();
477 final int dozeMode =
478 pm.isDeviceIdleMode() ? DozeState.DEEP
479 : pm.isLightDeviceIdleMode() ? DozeState.LIGHT
480 : DozeState.NOT_DOZING;
481
482 synchronized (mLock) {
483 if (mIsPluggedIn) {
484 mBatterySavingStats.startCharging();
485 return;
486 }
487 mBatterySavingStats.transitionState(
Kweku Adams9f488e22019-01-14 16:25:08 -0800488 mFullEnabled ? BatterySaverState.ON :
489 (mAdaptiveEnabled ? BatterySaverState.ADAPTIVE : BatterySaverState.OFF),
Makoto Onuki076218b2018-01-26 10:26:36 -0800490 isInteractive ? InteractiveState.INTERACTIVE : InteractiveState.NON_INTERACTIVE,
491 dozeMode);
492 }
493 }
Makoto Onuki66a78122017-11-14 15:03:21 -0800494}