From 9dd718547b3c11b44698fd42a28551145f1bda2a Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 18 Mar 2022 20:22:13 +0000 Subject: [PATCH] Avoid crash when resetting defaults. Tearing down means unregistering receivers, but if the receiver isn't registered, then the system will crash. Now, we make sure the receivers were registered before trying to unregister them. Bug: 158300259 Test: manual via developer options Change-Id: I3a022002e2f1286718e08fe1dddf83deda6290de --- .../com/android/server/tare/ChargingModifier.java | 13 +++++++++++++ .../com/android/server/tare/DeviceIdleModifier.java | 12 ++++++++++++ .../android/server/tare/PowerSaveModeModifier.java | 13 +++++++++++++ 3 files changed, 38 insertions(+) diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java index 712e13eb14e24..2b48d49e30520 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java @@ -76,6 +76,8 @@ class ChargingModifier extends Modifier { } private final class ChargingTracker extends BroadcastReceiver { + private boolean mIsSetup = false; + /** * Track whether we're "charging", where charging means that we're ready to commit to * doing work. @@ -83,6 +85,10 @@ class ChargingModifier extends Modifier { private volatile boolean mCharging; public void startTracking(@NonNull Context context) { + if (mIsSetup) { + return; + } + final IntentFilter filter = new IntentFilter(); filter.addAction(BatteryManager.ACTION_CHARGING); filter.addAction(BatteryManager.ACTION_DISCHARGING); @@ -91,10 +97,17 @@ class ChargingModifier extends Modifier { // Initialise tracker state. final BatteryManager batteryManager = context.getSystemService(BatteryManager.class); mCharging = batteryManager.isCharging(); + + mIsSetup = true; } public void stopTracking(@NonNull Context context) { + if (!mIsSetup) { + return; + } + context.unregisterReceiver(this); + mIsSetup = false; } @Override diff --git a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java index 8a64238f1f179..47ff307deda6a 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java @@ -72,6 +72,7 @@ class DeviceIdleModifier extends Modifier { } private final class DeviceIdleTracker extends BroadcastReceiver { + private boolean mIsSetup = false; private volatile boolean mDeviceIdle; private volatile boolean mDeviceLightIdle; @@ -80,6 +81,10 @@ class DeviceIdleModifier extends Modifier { } void startTracking(@NonNull Context context) { + if (mIsSetup) { + return; + } + IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); filter.addAction(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED); @@ -88,10 +93,17 @@ class DeviceIdleModifier extends Modifier { // Initialise tracker state. mDeviceIdle = mPowerManager.isDeviceIdleMode(); mDeviceLightIdle = mPowerManager.isLightDeviceIdleMode(); + + mIsSetup = true; } void stopTracking(@NonNull Context context) { + if (!mIsSetup) { + return; + } + context.unregisterReceiver(this); + mIsSetup = false; } @Override 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 4aaa9f449b4fb..542bfd12e5c71 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java @@ -72,6 +72,8 @@ class PowerSaveModeModifier extends Modifier { // TODO: migrate to relying on PowerSaveState and ServiceType.TARE private final class PowerSaveModeTracker extends BroadcastReceiver { + private boolean mIsSetup = false; + private final PowerManager mPowerManager; private volatile boolean mPowerSaveModeEnabled; @@ -80,16 +82,27 @@ class PowerSaveModeModifier extends Modifier { } public void startTracking(@NonNull Context context) { + if (mIsSetup) { + return; + } + final IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); context.registerReceiver(this, filter); // Initialise tracker state. mPowerSaveModeEnabled = mPowerManager.isPowerSaveMode(); + + mIsSetup = true; } public void stopTracking(@NonNull Context context) { + if (!mIsSetup) { + return; + } + context.unregisterReceiver(this); + mIsSetup = false; } @Override