Apply "most-recent" delivery policy to certain broadcasts.

Applying the policy to DEVICE_IDLE_MODE_CHANGED and
LIGHT_DEVICE_IDLE_MODE_CHANGED broadcasts so that when dispatching
these broadcasts, we can discard any older broadcasts waiting
to be delivered and deliver only the most recent to the receivers.

Bug: 256597171
Bug: 256597397
Test: atest ./tests/tests/batterysaving/src/android/os/cts/deviceidle/DeviceIdleTest.java
Change-Id: Icfade7cd207d525d29856bb050ca4377085dbbc1
This commit is contained in:
Sudheer Shanka
2022-11-29 17:37:34 -08:00
parent 90cef8f473
commit ced7d76ee0

View File

@@ -29,6 +29,7 @@ import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.BroadcastOptions;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IIntentReceiver;
@@ -314,7 +315,9 @@ public class DeviceIdleController extends SystemService
private Sensor mMotionSensor;
private LocationRequest mLocationRequest;
private Intent mIdleIntent;
private Bundle mIdleIntentOptions;
private Intent mLightIdleIntent;
private Bundle mLightIdleIntentOptions;
private AnyMotionDetector mAnyMotionDetector;
private final AppStateTrackerImpl mAppStateTracker;
@GuardedBy("this")
@@ -1798,10 +1801,12 @@ public class DeviceIdleController extends SystemService
} catch (RemoteException e) {
}
if (deepChanged) {
getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL,
null /* receiverPermission */, mIdleIntentOptions);
}
if (lightChanged) {
getContext().sendBroadcastAsUser(mLightIdleIntent, UserHandle.ALL);
getContext().sendBroadcastAsUser(mLightIdleIntent, UserHandle.ALL,
null /* receiverPermission */, mLightIdleIntentOptions);
}
EventLogTags.writeDeviceIdleOnComplete();
mGoingIdleWakeLock.release();
@@ -1821,13 +1826,13 @@ public class DeviceIdleController extends SystemService
incActiveIdleOps();
mLocalActivityManager.broadcastIntentWithCallback(mIdleIntent,
mIdleStartedDoneReceiver, null, UserHandle.USER_ALL,
null, null, null);
null, null, mIdleIntentOptions);
}
if (lightChanged) {
incActiveIdleOps();
mLocalActivityManager.broadcastIntentWithCallback(mLightIdleIntent,
mIdleStartedDoneReceiver, null, UserHandle.USER_ALL,
null, null, null);
null, null, mLightIdleIntentOptions);
}
// Always start with one active op for the message being sent here.
// Now we are done!
@@ -1849,10 +1854,12 @@ public class DeviceIdleController extends SystemService
} catch (RemoteException e) {
}
if (deepChanged) {
getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL,
null /* receiverPermission */, mIdleIntentOptions);
}
if (lightChanged) {
getContext().sendBroadcastAsUser(mLightIdleIntent, UserHandle.ALL);
getContext().sendBroadcastAsUser(mLightIdleIntent, UserHandle.ALL,
null /* receiverPermission */, mLightIdleIntentOptions);
}
EventLogTags.writeDeviceIdleOffComplete();
} break;
@@ -2531,6 +2538,9 @@ public class DeviceIdleController extends SystemService
mLightIdleIntent = new Intent(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED);
mLightIdleIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
| Intent.FLAG_RECEIVER_FOREGROUND);
final BroadcastOptions options = BroadcastOptions.makeBasic();
options.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
mIdleIntentOptions = mLightIdleIntentOptions = options.toBundle();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);