diff --git a/media/java/android/media/AudioDeviceAttributes.java b/media/java/android/media/AudioDeviceAttributes.java
index 5a27435..af3c295 100644
--- a/media/java/android/media/AudioDeviceAttributes.java
+++ b/media/java/android/media/AudioDeviceAttributes.java
@@ -68,7 +68,7 @@
     /**
      * The unique address of the device. Some devices don't have addresses, only an empty string.
      */
-    private @NonNull String mAddress;
+    private final @NonNull String mAddress;
     /**
      * The non-unique name of the device. Some devices don't have names, only an empty string.
      * Should not be used as a unique identifier for a device.
@@ -188,21 +188,6 @@
 
     /**
      * @hide
-     * Copy Constructor.
-     * @param ada the copied AudioDeviceAttributes
-     */
-    public AudioDeviceAttributes(AudioDeviceAttributes ada) {
-        mRole = ada.getRole();
-        mType = ada.getType();
-        mAddress = ada.getAddress();
-        mName = ada.getName();
-        mNativeType = ada.getInternalType();
-        mAudioProfiles = ada.getAudioProfiles();
-        mAudioDescriptors = ada.getAudioDescriptors();
-    }
-
-    /**
-     * @hide
      * Returns the role of a device
      * @return the role
      */
@@ -233,15 +218,6 @@
 
     /**
      * @hide
-     * Sets the device address. Only used by audio service.
-     */
-    public void setAddress(@NonNull String address) {
-        Objects.requireNonNull(address);
-        mAddress = address;
-    }
-
-    /**
-     * @hide
      * Returns the name of the audio device, or an empty string for devices without one
      * @return the device name
      */
diff --git a/services/core/java/com/android/server/audio/AdiDeviceState.java b/services/core/java/com/android/server/audio/AdiDeviceState.java
index 81cc196..ba43c8d 100644
--- a/services/core/java/com/android/server/audio/AdiDeviceState.java
+++ b/services/core/java/com/android/server/audio/AdiDeviceState.java
@@ -165,8 +165,7 @@
 
     @Override
     public String toString() {
-        return "type: " + mDeviceType
-                + " internal type: 0x" + Integer.toHexString(mInternalDeviceType)
+        return "type: " + mDeviceType + "internal type: " + mInternalDeviceType
                 + " addr: " + mDeviceAddress + " bt audio type: "
                 + AudioManager.audioDeviceCategoryToString(mAudioDeviceCategory)
                 + " enabled: " + mSAEnabled + " HT: " + mHasHeadTracker
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 6ae5826..d2737e81 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1250,8 +1250,8 @@
     }
 
     /*package*/ void registerStrategyPreferredDevicesDispatcher(
-            @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) {
-        mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher, isPrivileged);
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
+        mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher);
     }
 
     /*package*/ void unregisterStrategyPreferredDevicesDispatcher(
@@ -1260,8 +1260,8 @@
     }
 
     /*package*/ void registerStrategyNonDefaultDevicesDispatcher(
-            @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher, boolean isPrivileged) {
-        mDeviceInventory.registerStrategyNonDefaultDevicesDispatcher(dispatcher, isPrivileged);
+            @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher) {
+        mDeviceInventory.registerStrategyNonDefaultDevicesDispatcher(dispatcher);
     }
 
     /*package*/ void unregisterStrategyNonDefaultDevicesDispatcher(
@@ -1279,8 +1279,8 @@
     }
 
     /*package*/ void registerCapturePresetDevicesRoleDispatcher(
-            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) {
-        mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher, isPrivileged);
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher);
     }
 
     /*package*/ void unregisterCapturePresetDevicesRoleDispatcher(
@@ -1288,11 +1288,6 @@
         mDeviceInventory.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);
     }
 
-    /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked(
-            List<AudioDeviceAttributes> devices) {
-        return mAudioService.anonymizeAudioDeviceAttributesListUnchecked(devices);
-    }
-
     /*package*/ void registerCommunicationDeviceDispatcher(
             @NonNull ICommunicationDeviceDispatcher dispatcher) {
         mCommDevDispatchers.register(dispatcher);
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index a1d2e14..e08fdd6 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -121,26 +121,6 @@
     }
 
     /**
-     * Adds a new entry in mDeviceInventory if the AudioDeviceAttributes passed is an sink
-     * Bluetooth device and no corresponding entry already exists.
-     * @param ada the device to add if needed
-     */
-    void addAudioDeviceInInventoryIfNeeded(AudioDeviceAttributes ada) {
-        if (!AudioSystem.isBluetoothOutDevice(ada.getInternalType())) {
-            return;
-        }
-        synchronized (mDeviceInventoryLock) {
-            if (findDeviceStateForAudioDeviceAttributes(ada, ada.getType()) != null) {
-                return;
-            }
-            AdiDeviceState ads = new AdiDeviceState(
-                    ada.getType(), ada.getInternalType(), ada.getAddress());
-            mDeviceInventory.put(ads.getDeviceId(), ads);
-        }
-        mDeviceBroker.persistAudioDeviceSettings();
-    }
-
-    /**
      * Adds a new AdiDeviceState or updates the audio device cateogory of the matching
      * AdiDeviceState in the {@link AudioDeviceInventory#mDeviceInventory} list.
      * @param deviceState the device to update
@@ -1012,8 +992,8 @@
 
 
     /*package*/ void registerStrategyPreferredDevicesDispatcher(
-            @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) {
-        mPrefDevDispatchers.register(dispatcher, isPrivileged);
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
+        mPrefDevDispatchers.register(dispatcher);
     }
 
     /*package*/ void unregisterStrategyPreferredDevicesDispatcher(
@@ -1022,8 +1002,8 @@
     }
 
     /*package*/ void registerStrategyNonDefaultDevicesDispatcher(
-            @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher, boolean isPrivileged) {
-        mNonDefDevDispatchers.register(dispatcher, isPrivileged);
+            @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher) {
+        mNonDefDevDispatchers.register(dispatcher);
     }
 
     /*package*/ void unregisterStrategyNonDefaultDevicesDispatcher(
@@ -1104,8 +1084,8 @@
     }
 
     /*package*/ void registerCapturePresetDevicesRoleDispatcher(
-            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) {
-        mDevRoleCapturePresetDispatchers.register(dispatcher, isPrivileged);
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDevRoleCapturePresetDispatchers.register(dispatcher);
     }
 
     /*package*/ void unregisterCapturePresetDevicesRoleDispatcher(
@@ -1434,8 +1414,6 @@
                     updateBluetoothPreferredModes_l(connect ? btDevice : null /*connectedDevice*/);
                     if (!connect) {
                         purgeDevicesRoles_l();
-                    } else {
-                        addAudioDeviceInInventoryIfNeeded(attributes);
                     }
                 }
                 mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record();
@@ -1724,7 +1702,6 @@
         setCurrentAudioRouteNameIfPossible(name, true /*fromA2dp*/);
 
         updateBluetoothPreferredModes_l(btInfo.mDevice /*connectedDevice*/);
-        addAudioDeviceInInventoryIfNeeded(ada);
     }
 
     static final int[] CAPTURE_PRESETS = new int[] {AudioSource.MIC, AudioSource.CAMCORDER,
@@ -2029,9 +2006,9 @@
         final int hearingAidVolIndex = mDeviceBroker.getVssVolumeForDevice(streamType,
                 AudioSystem.DEVICE_OUT_HEARING_AID);
         mDeviceBroker.postSetHearingAidVolumeIndex(hearingAidVolIndex, streamType);
-        AudioDeviceAttributes ada = new AudioDeviceAttributes(
-                AudioSystem.DEVICE_OUT_HEARING_AID, address, name);
-        mAudioSystem.setDeviceConnectionState(ada,
+
+        mAudioSystem.setDeviceConnectionState(new AudioDeviceAttributes(
+                AudioSystem.DEVICE_OUT_HEARING_AID, address, name),
                 AudioSystem.DEVICE_STATE_AVAILABLE,
                 AudioSystem.AUDIO_FORMAT_DEFAULT);
         mConnectedDevices.put(
@@ -2041,7 +2018,6 @@
         mDeviceBroker.postApplyVolumeOnDevice(streamType,
                 AudioSystem.DEVICE_OUT_HEARING_AID, "makeHearingAidDeviceAvailable");
         setCurrentAudioRouteNameIfPossible(name, false /*fromA2dp*/);
-        addAudioDeviceInInventoryIfNeeded(ada);
         new MediaMetrics.Item(mMetricsId + "makeHearingAidDeviceAvailable")
                 .set(MediaMetrics.Property.ADDRESS, address != null ? address : "")
                 .set(MediaMetrics.Property.DEVICE,
@@ -2152,7 +2128,6 @@
                             sensorUuid));
             mDeviceBroker.postAccessoryPlugMediaUnmute(device);
             setCurrentAudioRouteNameIfPossible(name, /*fromA2dp=*/false);
-            addAudioDeviceInInventoryIfNeeded(ada);
         }
 
         if (streamType == AudioSystem.STREAM_DEFAULT) {
@@ -2487,9 +2462,6 @@
         final int nbDispatchers = mPrefDevDispatchers.beginBroadcast();
         for (int i = 0; i < nbDispatchers; i++) {
             try {
-                if (!((Boolean) mPrefDevDispatchers.getBroadcastCookie(i))) {
-                    devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices);
-                }
                 mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDevicesChanged(
                         strategy, devices);
             } catch (RemoteException e) {
@@ -2503,9 +2475,6 @@
         final int nbDispatchers = mNonDefDevDispatchers.beginBroadcast();
         for (int i = 0; i < nbDispatchers; i++) {
             try {
-                if (!((Boolean) mNonDefDevDispatchers.getBroadcastCookie(i))) {
-                    devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices);
-                }
                 mNonDefDevDispatchers.getBroadcastItem(i).dispatchNonDefDevicesChanged(
                         strategy, devices);
             } catch (RemoteException e) {
@@ -2519,9 +2488,6 @@
         final int nbDispatchers = mDevRoleCapturePresetDispatchers.beginBroadcast();
         for (int i = 0; i < nbDispatchers; ++i) {
             try {
-                if (!((Boolean) mDevRoleCapturePresetDispatchers.getBroadcastCookie(i))) {
-                    devices = mDeviceBroker.anonymizeAudioDeviceAttributesListUnchecked(devices);
-                }
                 mDevRoleCapturePresetDispatchers.getBroadcastItem(i).dispatchDevicesRoleChanged(
                         capturePreset, role, devices);
             } catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index ad043aa..a6be434a 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -2842,11 +2842,8 @@
         if (devices == null) {
             return AudioSystem.ERROR;
         }
-
-        devices = retrieveBluetoothAddresses(devices);
-
         final String logString = String.format(
-                "setPreferredDevicesForStrategy u/pid:%d/%d strat:%d dev:%s",
+                "setPreferredDeviceForStrategy u/pid:%d/%d strat:%d dev:%s",
                 Binder.getCallingUid(), Binder.getCallingPid(), strategy,
                 devices.stream().map(e -> e.toString()).collect(Collectors.joining(",")));
         sDeviceLogger.enqueue(new EventLogger.StringEvent(logString).printLog(TAG));
@@ -2902,7 +2899,7 @@
                     status, strategy));
             return new ArrayList<AudioDeviceAttributes>();
         } else {
-            return anonymizeAudioDeviceAttributesList(devices);
+            return devices;
         }
     }
 
@@ -2917,9 +2914,6 @@
                                                 @NonNull AudioDeviceAttributes device) {
         super.setDeviceAsNonDefaultForStrategy_enforcePermission();
         Objects.requireNonNull(device);
-
-        device = retrieveBluetoothAddress(device);
-
         final String logString = String.format(
                 "setDeviceAsNonDefaultForStrategy u/pid:%d/%d strat:%d dev:%s",
                 Binder.getCallingUid(), Binder.getCallingPid(), strategy, device.toString());
@@ -2946,9 +2940,6 @@
                                                    AudioDeviceAttributes device) {
         super.removeDeviceAsNonDefaultForStrategy_enforcePermission();
         Objects.requireNonNull(device);
-
-        device = retrieveBluetoothAddress(device);
-
         final String logString = String.format(
                 "removeDeviceAsNonDefaultForStrategy strat:%d dev:%s", strategy, device.toString());
         sDeviceLogger.enqueue(new EventLogger.StringEvent(logString).printLog(TAG));
@@ -2983,7 +2974,7 @@
                     status, strategy));
             return new ArrayList<AudioDeviceAttributes>();
         } else {
-            return anonymizeAudioDeviceAttributesList(devices);
+            return devices;
         }
     }
 
@@ -2996,8 +2987,7 @@
             return;
         }
         enforceModifyAudioRoutingPermission();
-        mDeviceBroker.registerStrategyPreferredDevicesDispatcher(
-                dispatcher, isBluetoothPrividged());
+        mDeviceBroker.registerStrategyPreferredDevicesDispatcher(dispatcher);
     }
 
     /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener(
@@ -3021,8 +3011,7 @@
             return;
         }
         enforceModifyAudioRoutingPermission();
-        mDeviceBroker.registerStrategyNonDefaultDevicesDispatcher(
-                dispatcher, isBluetoothPrividged());
+        mDeviceBroker.registerStrategyNonDefaultDevicesDispatcher(dispatcher);
     }
 
     /** @see AudioManager#removeOnNonDefaultDevicesForStrategyChangedListener(
@@ -3038,7 +3027,7 @@
     }
 
     /**
-     * @see AudioManager#setPreferredDevicesForCapturePreset(int, AudioDeviceAttributes)
+     * @see AudioManager#setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes)
      */
     public int setPreferredDevicesForCapturePreset(
             int capturePreset, List<AudioDeviceAttributes> devices) {
@@ -3057,8 +3046,6 @@
             return AudioSystem.ERROR;
         }
 
-        devices = retrieveBluetoothAddresses(devices);
-
         final int status = mDeviceBroker.setPreferredDevicesForCapturePresetSync(
                 capturePreset, devices);
         if (status != AudioSystem.SUCCESS) {
@@ -3105,7 +3092,7 @@
                     status, capturePreset));
             return new ArrayList<AudioDeviceAttributes>();
         } else {
-            return anonymizeAudioDeviceAttributesList(devices);
+            return devices;
         }
     }
 
@@ -3119,8 +3106,7 @@
             return;
         }
         enforceModifyAudioRoutingPermission();
-        mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(
-                dispatcher, isBluetoothPrividged());
+        mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(dispatcher);
     }
 
     /**
@@ -3140,9 +3126,7 @@
     public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributes(
             @NonNull AudioAttributes attributes) {
         enforceQueryStateOrModifyRoutingPermission();
-
-        return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList(
-                getDevicesForAttributesInt(attributes, false /* forVolume */)));
+        return getDevicesForAttributesInt(attributes, false /* forVolume */);
     }
 
     /** @see AudioManager#getAudioDevicesForAttributes(AudioAttributes)
@@ -3152,8 +3136,7 @@
      */
     public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesUnprotected(
             @NonNull AudioAttributes attributes) {
-        return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList(
-                getDevicesForAttributesInt(attributes, false /* forVolume */)));
+        return getDevicesForAttributesInt(attributes, false /* forVolume */);
     }
 
     /**
@@ -7350,8 +7333,6 @@
         Objects.requireNonNull(device);
         AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior);
 
-        device = retrieveBluetoothAddress(device);
-
         sVolumeLogger.enqueue(new EventLogger.StringEvent("setDeviceVolumeBehavior: dev:"
                 + AudioSystem.getOutputDeviceName(device.getInternalType()) + " addr:"
                 + device.getAddress() + " behavior:"
@@ -7435,8 +7416,6 @@
         // verify parameters
         Objects.requireNonNull(device);
 
-        device = retrieveBluetoothAddress(device);
-
         return getDeviceVolumeBehaviorInt(device);
     }
 
@@ -7511,12 +7490,9 @@
     /**
      * see AudioManager.setWiredDeviceConnectionState()
      */
-    public void setWiredDeviceConnectionState(@NonNull AudioDeviceAttributes attributes,
+    public void setWiredDeviceConnectionState(AudioDeviceAttributes attributes,
             @ConnectionState int state, String caller) {
         super.setWiredDeviceConnectionState_enforcePermission();
-        Objects.requireNonNull(attributes);
-
-        attributes = retrieveBluetoothAddress(attributes);
 
         if (state != CONNECTION_STATE_CONNECTED
                 && state != CONNECTION_STATE_DISCONNECTED) {
@@ -7557,9 +7533,6 @@
             boolean connected) {
         Objects.requireNonNull(device);
         enforceModifyAudioRoutingPermission();
-
-        device = retrieveBluetoothAddress(device);
-
         mDeviceBroker.setTestDeviceConnectionState(device,
                 connected ? CONNECTION_STATE_CONNECTED : CONNECTION_STATE_DISCONNECTED);
         // simulate a routing update from native
@@ -10324,100 +10297,6 @@
         mSpatializerHelper.setFeatureEnabled(mHasSpatializerEffect);
     }
 
-    private boolean isBluetoothPrividged() {
-        return PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission(
-                android.Manifest.permission.BLUETOOTH_CONNECT)
-                || Binder.getCallingUid() == Process.SYSTEM_UID;
-    }
-
-    List<AudioDeviceAttributes> retrieveBluetoothAddresses(List<AudioDeviceAttributes> devices) {
-        if (isBluetoothPrividged()) {
-            return devices;
-        }
-
-        List<AudioDeviceAttributes> checkedDevices = new ArrayList<AudioDeviceAttributes>();
-        for (AudioDeviceAttributes ada : devices) {
-            if (ada == null) {
-                continue;
-            }
-            checkedDevices.add(retrieveBluetoothAddressUncheked(ada));
-        }
-        return checkedDevices;
-    }
-
-    AudioDeviceAttributes retrieveBluetoothAddress(@NonNull AudioDeviceAttributes ada) {
-        if (isBluetoothPrividged()) {
-            return ada;
-        }
-        return retrieveBluetoothAddressUncheked(ada);
-    }
-
-    AudioDeviceAttributes retrieveBluetoothAddressUncheked(@NonNull AudioDeviceAttributes ada) {
-        Objects.requireNonNull(ada);
-        if (AudioSystem.isBluetoothDevice(ada.getInternalType())) {
-            String anonymizedAddress = anonymizeBluetoothAddress(ada.getAddress());
-            for (AdiDeviceState ads : mDeviceBroker.getImmutableDeviceInventory()) {
-                if (!(AudioSystem.isBluetoothDevice(ads.getInternalDeviceType())
-                        && (ada.getInternalType() == ads.getInternalDeviceType())
-                        && anonymizedAddress.equals(anonymizeBluetoothAddress(
-                                ads.getDeviceAddress())))) {
-                    continue;
-                }
-                ada.setAddress(ads.getDeviceAddress());
-                break;
-            }
-        }
-        return ada;
-    }
-
-    /**
-     * Convert a Bluetooth MAC address to an anonymized one when exposed to a non privileged app
-     * Must match the implementation of BluetoothUtils.toAnonymizedAddress()
-     * @param address Mac address to be anonymized
-     * @return anonymized mac address
-     */
-    static String anonymizeBluetoothAddress(String address) {
-        if (address == null || address.length() != "AA:BB:CC:DD:EE:FF".length()) {
-            return null;
-        }
-        return "XX:XX:XX:XX" + address.substring("XX:XX:XX:XX".length());
-    }
-
-    private List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesList(
-                List<AudioDeviceAttributes> devices) {
-        if (isBluetoothPrividged()) {
-            return devices;
-        }
-        return anonymizeAudioDeviceAttributesListUnchecked(devices);
-    }
-
-    /* package */ List<AudioDeviceAttributes> anonymizeAudioDeviceAttributesListUnchecked(
-            List<AudioDeviceAttributes> devices) {
-        List<AudioDeviceAttributes> anonymizedDevices = new ArrayList<AudioDeviceAttributes>();
-        for (AudioDeviceAttributes ada : devices) {
-            anonymizedDevices.add(anonymizeAudioDeviceAttributesUnchecked(ada));
-        }
-        return anonymizedDevices;
-    }
-
-    private AudioDeviceAttributes anonymizeAudioDeviceAttributesUnchecked(
-            AudioDeviceAttributes ada) {
-        if (!AudioSystem.isBluetoothDevice(ada.getInternalType())) {
-            return ada;
-        }
-        AudioDeviceAttributes res = new AudioDeviceAttributes(ada);
-        res.setAddress(anonymizeBluetoothAddress(ada.getAddress()));
-        return res;
-    }
-
-    private AudioDeviceAttributes anonymizeAudioDeviceAttributes(AudioDeviceAttributes ada) {
-        if (isBluetoothPrividged()) {
-            return ada;
-        }
-
-        return anonymizeAudioDeviceAttributesUnchecked(ada);
-    }
-
     //==========================================================================================
 
     // camera sound is forced if any of the resources corresponding to one active SIM
@@ -10465,16 +10344,13 @@
         Objects.requireNonNull(usages);
         Objects.requireNonNull(device);
         enforceModifyAudioRoutingPermission();
-
-        final AudioDeviceAttributes ada = retrieveBluetoothAddress(device);
-
         if (timeOutMs <= 0 || usages.length == 0) {
             throw new IllegalArgumentException("Invalid timeOutMs/usagesToMute");
         }
         Log.i(TAG, "muteAwaitConnection dev:" + device + " timeOutMs:" + timeOutMs
                 + " usages:" + Arrays.toString(usages));
 
-        if (mDeviceBroker.isDeviceConnected(ada)) {
+        if (mDeviceBroker.isDeviceConnected(device)) {
             // not throwing an exception as there could be a race between a connection (server-side,
             // notification of connection in flight) and a mute operation (client-side)
             Log.i(TAG, "muteAwaitConnection ignored, device (" + device + ") already connected");
@@ -10486,19 +10362,12 @@
                         + mMutingExpectedDevice);
                 throw new IllegalStateException("muteAwaitConnection already in progress");
             }
-            mMutingExpectedDevice = ada;
+            mMutingExpectedDevice = device;
             mMutedUsagesAwaitingConnection = usages;
-            mPlaybackMonitor.muteAwaitConnection(usages, ada, timeOutMs);
+            mPlaybackMonitor.muteAwaitConnection(usages, device, timeOutMs);
         }
-        dispatchMuteAwaitConnection((cb, isPrivileged) -> {
-            try {
-                AudioDeviceAttributes dev = ada;
-                if (!isPrivileged) {
-                    dev = anonymizeAudioDeviceAttributesUnchecked(ada);
-                }
-                cb.dispatchOnMutedUntilConnection(dev, usages);
-            } catch (RemoteException e) { }
-        });
+        dispatchMuteAwaitConnection(cb -> { try {
+            cb.dispatchOnMutedUntilConnection(device, usages); } catch (RemoteException e) { } });
     }
 
     @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
@@ -10507,7 +10376,7 @@
         super.getMutingExpectedDevice_enforcePermission();
 
         synchronized (mMuteAwaitConnectionLock) {
-            return anonymizeAudioDeviceAttributes(mMutingExpectedDevice);
+            return mMutingExpectedDevice;
         }
     }
 
@@ -10516,9 +10385,6 @@
     public void cancelMuteAwaitConnection(@NonNull AudioDeviceAttributes device) {
         Objects.requireNonNull(device);
         enforceModifyAudioRoutingPermission();
-
-        final AudioDeviceAttributes ada = retrieveBluetoothAddress(device);
-
         Log.i(TAG, "cancelMuteAwaitConnection for device:" + device);
         final int[] mutedUsages;
         synchronized (mMuteAwaitConnectionLock) {
@@ -10528,7 +10394,7 @@
                 Log.i(TAG, "cancelMuteAwaitConnection ignored, no expected device");
                 return;
             }
-            if (!ada.equalTypeAddress(mMutingExpectedDevice)) {
+            if (!device.equalTypeAddress(mMutingExpectedDevice)) {
                 Log.e(TAG, "cancelMuteAwaitConnection ignored, got " + device
                         + "] but expected device is" + mMutingExpectedDevice);
                 throw new IllegalStateException("cancelMuteAwaitConnection for wrong device");
@@ -10538,14 +10404,8 @@
             mMutedUsagesAwaitingConnection = null;
             mPlaybackMonitor.cancelMuteAwaitConnection("cancelMuteAwaitConnection dev:" + device);
         }
-        dispatchMuteAwaitConnection((cb, isPrivileged) -> {
-            try {
-                AudioDeviceAttributes dev = ada;
-                if (!isPrivileged) {
-                    dev = anonymizeAudioDeviceAttributesUnchecked(ada);
-                }
-                cb.dispatchOnUnmutedEvent(
-                        AudioManager.MuteAwaitConnectionCallback.EVENT_CANCEL, dev, mutedUsages);
+        dispatchMuteAwaitConnection(cb -> { try { cb.dispatchOnUnmutedEvent(
+                    AudioManager.MuteAwaitConnectionCallback.EVENT_CANCEL, device, mutedUsages);
             } catch (RemoteException e) { } });
     }
 
@@ -10559,7 +10419,7 @@
         super.registerMuteAwaitConnectionDispatcher_enforcePermission();
 
         if (register) {
-            mMuteAwaitConnectionDispatchers.register(cb, isBluetoothPrividged());
+            mMuteAwaitConnectionDispatchers.register(cb);
         } else {
             mMuteAwaitConnectionDispatchers.unregister(cb);
         }
@@ -10583,14 +10443,8 @@
             mPlaybackMonitor.cancelMuteAwaitConnection(
                     "checkMuteAwaitConnection device " + device + " connected, unmuting");
         }
-        dispatchMuteAwaitConnection((cb, isPrivileged) -> {
-            try {
-                AudioDeviceAttributes ada = device;
-                if (!isPrivileged) {
-                    ada = anonymizeAudioDeviceAttributesUnchecked(device);
-                }
-                cb.dispatchOnUnmutedEvent(AudioManager.MuteAwaitConnectionCallback.EVENT_CONNECTION,
-                        ada, mutedUsages);
+        dispatchMuteAwaitConnection(cb -> { try { cb.dispatchOnUnmutedEvent(
+                AudioManager.MuteAwaitConnectionCallback.EVENT_CONNECTION, device, mutedUsages);
             } catch (RemoteException e) { } });
     }
 
@@ -10610,8 +10464,7 @@
             mMutingExpectedDevice = null;
             mMutedUsagesAwaitingConnection = null;
         }
-        dispatchMuteAwaitConnection((cb, isPrivileged) -> {
-            try {
+        dispatchMuteAwaitConnection(cb -> { try {
                 cb.dispatchOnUnmutedEvent(
                         AudioManager.MuteAwaitConnectionCallback.EVENT_TIMEOUT,
                         timedOutDevice, mutedUsages);
@@ -10619,14 +10472,13 @@
     }
 
     private void dispatchMuteAwaitConnection(
-            java.util.function.BiConsumer<IMuteAwaitConnectionCallback, Boolean> callback) {
+            java.util.function.Consumer<IMuteAwaitConnectionCallback> callback) {
         final int nbDispatchers = mMuteAwaitConnectionDispatchers.beginBroadcast();
         // lazy initialization as errors unlikely
         ArrayList<IMuteAwaitConnectionCallback> errorList = null;
         for (int i = 0; i < nbDispatchers; i++) {
             try {
-                callback.accept(mMuteAwaitConnectionDispatchers.getBroadcastItem(i),
-                        (Boolean) mMuteAwaitConnectionDispatchers.getBroadcastCookie(i));
+                callback.accept(mMuteAwaitConnectionDispatchers.getBroadcastItem(i));
             } catch (Exception e) {
                 if (errorList == null) {
                     errorList = new ArrayList<>(1);
@@ -13188,9 +13040,6 @@
             @NonNull AudioDeviceAttributes device, @IntRange(from = 0) long delayMillis) {
         Objects.requireNonNull(device, "device must not be null");
         enforceModifyAudioRoutingPermission();
-
-        device = retrieveBluetoothAddress(device);
-
         final String getterKey = "additional_output_device_delay="
                 + device.getInternalType() + "," + device.getAddress(); // "getter" key as an id.
         final String setterKey = getterKey + "," + delayMillis;     // append the delay for setter
@@ -13211,9 +13060,6 @@
     @IntRange(from = 0)
     public long getAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) {
         Objects.requireNonNull(device, "device must not be null");
-
-        device = retrieveBluetoothAddress(device);
-
         final String key = "additional_output_device_delay";
         final String reply = AudioSystem.getParameters(
                 key + "=" + device.getInternalType() + "," + device.getAddress());
@@ -13241,9 +13087,6 @@
     @IntRange(from = 0)
     public long getMaxAdditionalOutputDeviceDelay(@NonNull AudioDeviceAttributes device) {
         Objects.requireNonNull(device, "device must not be null");
-
-        device = retrieveBluetoothAddress(device);
-
         final String key = "max_additional_output_device_delay";
         final String reply = AudioSystem.getParameters(
                 key + "=" + device.getInternalType() + "," + device.getAddress());
