summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java70
1 files changed, 65 insertions, 5 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
index 764a3a8b1ed9..4aaa9f449b4f 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
@@ -17,27 +17,48 @@
package com.android.server.tare;
import android.annotation.NonNull;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.util.IndentingPrintWriter;
+import android.util.Log;
+import android.util.Slog;
/** Modifier that makes things more expensive in adaptive and full battery saver are active. */
class PowerSaveModeModifier extends Modifier {
+ private static final String TAG = "TARE-" + PowerSaveModeModifier.class.getSimpleName();
+ private static final boolean DEBUG = InternalResourceService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
+
private final InternalResourceService mIrs;
- private final PowerManager mPowerManager;
+ private final PowerSaveModeTracker mPowerSaveModeTracker;
PowerSaveModeModifier(@NonNull InternalResourceService irs) {
super();
mIrs = irs;
- mPowerManager = irs.getContext().getSystemService(PowerManager.class);
+ mPowerSaveModeTracker = new PowerSaveModeTracker();
+ }
+
+ @Override
+ public void setup() {
+ mPowerSaveModeTracker.startTracking(mIrs.getContext());
+ }
+
+ @Override
+ public void tearDown() {
+ mPowerSaveModeTracker.stopTracking(mIrs.getContext());
}
@Override
long getModifiedCostToProduce(long ctp) {
- if (mPowerManager.isPowerSaveMode()) {
+ if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
return (long) (1.5 * ctp);
}
// TODO: get adaptive power save mode
- if (mPowerManager.isPowerSaveMode()) {
+ if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
return (long) (1.25 * ctp);
}
return ctp;
@@ -46,6 +67,45 @@ class PowerSaveModeModifier extends Modifier {
@Override
void dump(IndentingPrintWriter pw) {
pw.print("power save=");
- pw.println(mPowerManager.isPowerSaveMode());
+ pw.println(mPowerSaveModeTracker.mPowerSaveModeEnabled);
+ }
+
+ // TODO: migrate to relying on PowerSaveState and ServiceType.TARE
+ private final class PowerSaveModeTracker extends BroadcastReceiver {
+ private final PowerManager mPowerManager;
+ private volatile boolean mPowerSaveModeEnabled;
+
+ private PowerSaveModeTracker() {
+ mPowerManager = mIrs.getContext().getSystemService(PowerManager.class);
+ }
+
+ public void startTracking(@NonNull Context context) {
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+ context.registerReceiver(this, filter);
+
+ // Initialise tracker state.
+ mPowerSaveModeEnabled = mPowerManager.isPowerSaveMode();
+ }
+
+ public void stopTracking(@NonNull Context context) {
+ context.unregisterReceiver(this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
+ final boolean enabled = mPowerManager.isPowerSaveMode();
+ if (DEBUG) {
+ Slog.d(TAG, "Power save mode changed to " + enabled
+ + ", fired @ " + SystemClock.elapsedRealtime());
+ }
+ if (mPowerSaveModeEnabled != enabled) {
+ mPowerSaveModeEnabled = enabled;
+ mIrs.onDeviceStateChanged();
+ }
+ }
+ }
}
}