diff options
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java | 70 |
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(); + } + } + } } } |