Apply delivery group policies to ACTION_DISCOVERY_FINISHED.
- The "set-defer-until-active" policy is applied so that the
broadcast targeted to apps in the Cached state is deferred until
they come out of that state.
- The "deliver-most-recent" policy is applied so that if there are
already pending broadcasts waiting to be delivered when a new
broadcast is sent, the old ones are discarded.
Bug: 266474854
Test: atest CtsBluetoothTestCases
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:a44cb9326a83c85340fb96fd967486b5168fa0f7)
Merged-In: Iaa505809fdb2f67a440a9a568fd44a753814b0e2
Change-Id: Iaa505809fdb2f67a440a9a568fd44a753814b0e2
diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterProperties.java b/android/app/src/com/android/bluetooth/btservice/AdapterProperties.java
index 573057f..9e952fa 100644
--- a/android/app/src/com/android/bluetooth/btservice/AdapterProperties.java
+++ b/android/app/src/com/android/bluetooth/btservice/AdapterProperties.java
@@ -20,7 +20,9 @@
import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.Manifest.permission.BLUETOOTH_SCAN;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.app.BroadcastOptions;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothA2dpSink;
import android.bluetooth.BluetoothAdapter;
@@ -46,6 +48,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.os.Bundle;
import android.os.ParcelUuid;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -57,6 +60,7 @@
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.RemoteDevices.DeviceProperties;
+import com.android.modules.utils.build.SdkLevel;
import com.google.common.collect.EvictingQueue;
@@ -1168,7 +1172,7 @@
mDiscoveryEndMs = System.currentTimeMillis();
intent = new Intent(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
Utils.sendBroadcast(mService, intent, BLUETOOTH_SCAN,
- Utils.getTempAllowlistBroadcastOptions());
+ getBroadcastOptionsForDiscoveryFinished());
} else if (state == AbstractionLayer.BT_DISCOVERY_STARTED) {
mDiscovering = true;
mDiscoveryEndMs = System.currentTimeMillis() + DEFAULT_DISCOVERY_TIMEOUT_MS;
@@ -1179,6 +1183,18 @@
}
}
+ /**
+ * @return broadcast options for ACTION_DISCOVERY_FINISHED broadcast
+ */
+ private static @NonNull Bundle getBroadcastOptionsForDiscoveryFinished() {
+ final BroadcastOptions options = Utils.getTempBroadcastOptions();
+ if (SdkLevel.isAtLeastU()) {
+ options.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
+ options.setDeferUntilActive(true);
+ }
+ return options.toBundle();
+ }
+
@RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
writer.println(TAG);