From 1071a661258abe56c9bbf67dc40108f080518097 Mon Sep 17 00:00:00 2001 From: Eric Laurent <elaurent@google.com> Date: Fri, 15 Mar 2024 16:01:21 +0000 Subject: [PATCH] RESTRICT AUTOMERGE - Revert "AudioService: anonymize Bluetooth MAC addresses" Revert submission 25188138-anon_bt_address_udc_dev Reason for revert: b/329515274 Reverted changes: /q/submissionid:25188138-anon_bt_address_udc_dev Change-Id: I76e24a7e981c01e71464db1ce65b1f32ffb08fbc Merged-In: Icd435c99c8a4f2d1e6053f35cd509b3f8f34ae24 --- .../android/media/AudioDeviceAttributes.java | 26 +-- .../android/server/audio/AdiDeviceState.java | 11 +- .../server/audio/AudioDeviceBroker.java | 17 +- .../server/audio/AudioDeviceInventory.java | 100 +++------ .../android/server/audio/AudioService.java | 209 +++--------------- 5 files changed, 62 insertions(+), 301 deletions(-) diff --git a/media/java/android/media/AudioDeviceAttributes.java b/media/java/android/media/AudioDeviceAttributes.java index 5a274353f68e..af3c295b8d6c 100644 --- a/media/java/android/media/AudioDeviceAttributes.java +++ b/media/java/android/media/AudioDeviceAttributes.java @@ -68,7 +68,7 @@ public final class AudioDeviceAttributes implements Parcelable { /** * 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. @@ -186,21 +186,6 @@ public final class AudioDeviceAttributes implements Parcelable { mAudioDescriptors = new ArrayList<>(); } - /** - * @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 @@ -231,15 +216,6 @@ public final class AudioDeviceAttributes implements Parcelable { return mAddress; } - /** - * @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 diff --git a/services/core/java/com/android/server/audio/AdiDeviceState.java b/services/core/java/com/android/server/audio/AdiDeviceState.java index 1c456a781f7a..683b3eb7a92e 100644 --- a/services/core/java/com/android/server/audio/AdiDeviceState.java +++ b/services/core/java/com/android/server/audio/AdiDeviceState.java @@ -25,7 +25,6 @@ import android.media.AudioDeviceAttributes; import android.media.AudioDeviceInfo; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; import java.util.Objects; @@ -44,8 +43,6 @@ import java.util.Objects; private final int mInternalDeviceType; @NonNull private final String mDeviceAddress; - /** Unique device id from internal device type and address. */ - private final Pair<Integer, String> mDeviceId; private boolean mSAEnabled; private boolean mHasHeadTracker = false; private boolean mHeadTrackerEnabled; @@ -71,11 +68,6 @@ import java.util.Objects; } mDeviceAddress = isBluetoothDevice(mInternalDeviceType) ? Objects.requireNonNull( address) : ""; - mDeviceId = new Pair<>(mInternalDeviceType, mDeviceAddress); - } - - public Pair<Integer, String> getDeviceId() { - return mDeviceId; } @AudioDeviceInfo.AudioDeviceType @@ -146,8 +138,7 @@ import java.util.Objects; @Override public String toString() { - return "type: " + mDeviceType - + " internal type: 0x" + Integer.toHexString(mInternalDeviceType) + return "type: " + mDeviceType + "internal type: " + mInternalDeviceType + " addr: " + mDeviceAddress + " enabled: " + mSAEnabled + " HT: " + mHasHeadTracker + " HTenabled: " + mHeadTrackerEnabled; } diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 054a26f9c0fb..bba85fd76127 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -1153,8 +1153,8 @@ public class AudioDeviceBroker { } /*package*/ void registerStrategyPreferredDevicesDispatcher( - @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { - mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher, isPrivileged); + @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { + mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher); } /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -1163,8 +1163,8 @@ public class AudioDeviceBroker { } /*package*/ void registerStrategyNonDefaultDevicesDispatcher( - @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher, boolean isPrivileged) { - mDeviceInventory.registerStrategyNonDefaultDevicesDispatcher(dispatcher, isPrivileged); + @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher) { + mDeviceInventory.registerStrategyNonDefaultDevicesDispatcher(dispatcher); } /*package*/ void unregisterStrategyNonDefaultDevicesDispatcher( @@ -1182,8 +1182,8 @@ public class AudioDeviceBroker { } /*package*/ void registerCapturePresetDevicesRoleDispatcher( - @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { - mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher, isPrivileged); + @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { + mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher); } /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -1191,11 +1191,6 @@ public class AudioDeviceBroker { 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 5332acae13ad..387646cccd7c 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -61,7 +61,6 @@ import com.google.android.collect.Sets; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -92,59 +91,31 @@ public class AudioDeviceInventory { private final Object mDeviceInventoryLock = new Object(); @GuardedBy("mDeviceInventoryLock") - private final HashMap<Pair<Integer, String>, AdiDeviceState> mDeviceInventory = new HashMap<>(); + private final ArrayList<AdiDeviceState> mDeviceInventory = new ArrayList<>(0); + List<AdiDeviceState> getImmutableDeviceInventory() { synchronized (mDeviceInventoryLock) { - return new ArrayList<AdiDeviceState>(mDeviceInventory.values()); + return List.copyOf(mDeviceInventory); } } void addDeviceStateToInventory(AdiDeviceState deviceState) { synchronized (mDeviceInventoryLock) { - mDeviceInventory.put(deviceState.getDeviceId(), deviceState); + mDeviceInventory.add(deviceState); } } - /** - * 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(); - } - - /** - * Finds the device state that matches the passed {@link AudioDeviceAttributes} and device - * type. Note: currently this method only returns a valid device for A2DP and BLE devices. - * - * @param ada attributes of device to match - * @param canonicalDeviceType external device type to match - * @return the found {@link AdiDeviceState} matching a cached A2DP or BLE device or - * {@code null} otherwise. - */ - @Nullable AdiDeviceState findDeviceStateForAudioDeviceAttributes(AudioDeviceAttributes ada, int canonicalDeviceType) { final boolean isWireless = isBluetoothDevice(ada.getInternalType()); + synchronized (mDeviceInventoryLock) { - for (AdiDeviceState deviceState : mDeviceInventory.values()) { - if (deviceState.getDeviceType() == canonicalDeviceType + for (AdiDeviceState deviceSetting : mDeviceInventory) { + if (deviceSetting.getDeviceType() == canonicalDeviceType && (!isWireless || ada.getAddress().equals( - deviceState.getDeviceAddress()))) { - return deviceState; + deviceSetting.getDeviceAddress()))) { + return deviceSetting; } } } @@ -416,7 +387,7 @@ public class AudioDeviceInventory { + " role:" + key.second + " devices:" + devices); }); pw.println("\ndevices:\n"); synchronized (mDeviceInventoryLock) { - for (AdiDeviceState device : mDeviceInventory.values()) { + for (AdiDeviceState device : mDeviceInventory) { pw.println("\t" + device + "\n"); } } @@ -963,8 +934,8 @@ public class AudioDeviceInventory { /*package*/ void registerStrategyPreferredDevicesDispatcher( - @NonNull IStrategyPreferredDevicesDispatcher dispatcher, boolean isPrivileged) { - mPrefDevDispatchers.register(dispatcher, isPrivileged); + @NonNull IStrategyPreferredDevicesDispatcher dispatcher) { + mPrefDevDispatchers.register(dispatcher); } /*package*/ void unregisterStrategyPreferredDevicesDispatcher( @@ -973,8 +944,8 @@ public class AudioDeviceInventory { } /*package*/ void registerStrategyNonDefaultDevicesDispatcher( - @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher, boolean isPrivileged) { - mNonDefDevDispatchers.register(dispatcher, isPrivileged); + @NonNull IStrategyNonDefaultDevicesDispatcher dispatcher) { + mNonDefDevDispatchers.register(dispatcher); } /*package*/ void unregisterStrategyNonDefaultDevicesDispatcher( @@ -1055,8 +1026,8 @@ public class AudioDeviceInventory { } /*package*/ void registerCapturePresetDevicesRoleDispatcher( - @NonNull ICapturePresetDevicesRoleDispatcher dispatcher, boolean isPrivileged) { - mDevRoleCapturePresetDispatchers.register(dispatcher, isPrivileged); + @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) { + mDevRoleCapturePresetDispatchers.register(dispatcher); } /*package*/ void unregisterCapturePresetDevicesRoleDispatcher( @@ -1383,8 +1354,6 @@ public class AudioDeviceInventory { updateBluetoothPreferredModes_l(connect ? btDevice : null /*connectedDevice*/); if (!connect) { purgeDevicesRoles_l(); - } else { - addAudioDeviceInInventoryIfNeeded(attributes); } } mmi.set(MediaMetrics.Property.STATE, MediaMetrics.Value.CONNECTED).record(); @@ -1651,7 +1620,6 @@ public class AudioDeviceInventory { setCurrentAudioRouteNameIfPossible(name, true /*fromA2dp*/); updateBluetoothPreferredModes_l(btInfo.mDevice /*connectedDevice*/); - addAudioDeviceInInventoryIfNeeded(ada); } static final int[] CAPTURE_PRESETS = new int[] {AudioSource.MIC, AudioSource.CAMCORDER, @@ -1951,9 +1919,9 @@ public class AudioDeviceInventory { 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( @@ -1963,7 +1931,6 @@ public class AudioDeviceInventory { 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, @@ -2066,7 +2033,6 @@ public class AudioDeviceInventory { sensorUuid)); mDeviceBroker.postAccessoryPlugMediaUnmute(device); setCurrentAudioRouteNameIfPossible(name, /*fromA2dp=*/false); - addAudioDeviceInInventoryIfNeeded(ada); } if (streamType == AudioSystem.STREAM_DEFAULT) { @@ -2397,9 +2363,6 @@ public class AudioDeviceInventory { 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) { @@ -2413,9 +2376,6 @@ public class AudioDeviceInventory { 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) { @@ -2429,9 +2389,6 @@ public class AudioDeviceInventory { 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) { @@ -2456,20 +2413,19 @@ public class AudioDeviceInventory { int deviceCatalogSize = 0; synchronized (mDeviceInventoryLock) { deviceCatalogSize = mDeviceInventory.size(); - - final StringBuilder settingsBuilder = new StringBuilder( + } + final StringBuilder settingsBuilder = new StringBuilder( deviceCatalogSize * AdiDeviceState.getPeristedMaxSize()); - Iterator<AdiDeviceState> iterator = mDeviceInventory.values().iterator(); - if (iterator.hasNext()) { - settingsBuilder.append(iterator.next().toPersistableString()); - } - while (iterator.hasNext()) { - settingsBuilder.append(SETTING_DEVICE_SEPARATOR_CHAR); - settingsBuilder.append(iterator.next().toPersistableString()); + synchronized (mDeviceInventoryLock) { + for (int i = 0; i < mDeviceInventory.size(); i++) { + settingsBuilder.append(mDeviceInventory.get(i).toPersistableString()); + if (i != mDeviceInventory.size() - 1) { + settingsBuilder.append(SETTING_DEVICE_SEPARATOR_CHAR); + } } - return settingsBuilder.toString(); } + return settingsBuilder.toString(); } /*package*/ void setDeviceSettings(String settings) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d82cef546315..e2e979e79898 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2831,11 +2831,8 @@ public class AudioService extends IAudioService.Stub 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)); @@ -2891,7 +2888,7 @@ public class AudioService extends IAudioService.Stub status, strategy)); return new ArrayList<AudioDeviceAttributes>(); } else { - return anonymizeAudioDeviceAttributesList(devices); + return devices; } } @@ -2906,9 +2903,6 @@ public class AudioService extends IAudioService.Stub @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()); @@ -2935,9 +2929,6 @@ public class AudioService extends IAudioService.Stub 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)); @@ -2972,7 +2963,7 @@ public class AudioService extends IAudioService.Stub status, strategy)); return new ArrayList<AudioDeviceAttributes>(); } else { - return anonymizeAudioDeviceAttributesList(devices); + return devices; } } @@ -2985,8 +2976,7 @@ public class AudioService extends IAudioService.Stub return; } enforceModifyAudioRoutingPermission(); - mDeviceBroker.registerStrategyPreferredDevicesDispatcher( - dispatcher, isBluetoothPrividged()); + mDeviceBroker.registerStrategyPreferredDevicesDispatcher(dispatcher); } /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener( @@ -3010,8 +3000,7 @@ public class AudioService extends IAudioService.Stub return; } enforceModifyAudioRoutingPermission(); - mDeviceBroker.registerStrategyNonDefaultDevicesDispatcher( - dispatcher, isBluetoothPrividged()); + mDeviceBroker.registerStrategyNonDefaultDevicesDispatcher(dispatcher); } /** @see AudioManager#removeOnNonDefaultDevicesForStrategyChangedListener( @@ -3027,7 +3016,7 @@ public class AudioService extends IAudioService.Stub } /** - * @see AudioManager#setPreferredDevicesForCapturePreset(int, AudioDeviceAttributes) + * @see AudioManager#setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes) */ public int setPreferredDevicesForCapturePreset( int capturePreset, List<AudioDeviceAttributes> devices) { @@ -3046,8 +3035,6 @@ public class AudioService extends IAudioService.Stub return AudioSystem.ERROR; } - devices = retrieveBluetoothAddresses(devices); - final int status = mDeviceBroker.setPreferredDevicesForCapturePresetSync( capturePreset, devices); if (status != AudioSystem.SUCCESS) { @@ -3094,7 +3081,7 @@ public class AudioService extends IAudioService.Stub status, capturePreset)); return new ArrayList<AudioDeviceAttributes>(); } else { - return anonymizeAudioDeviceAttributesList(devices); + return devices; } } @@ -3108,8 +3095,7 @@ public class AudioService extends IAudioService.Stub return; } enforceModifyAudioRoutingPermission(); - mDeviceBroker.registerCapturePresetDevicesRoleDispatcher( - dispatcher, isBluetoothPrividged()); + mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(dispatcher); } /** @@ -3129,9 +3115,7 @@ public class AudioService extends IAudioService.Stub 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) @@ -3141,8 +3125,7 @@ public class AudioService extends IAudioService.Stub */ public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesUnprotected( @NonNull AudioAttributes attributes) { - return new ArrayList<AudioDeviceAttributes>(anonymizeAudioDeviceAttributesList( - getDevicesForAttributesInt(attributes, false /* forVolume */))); + return getDevicesForAttributesInt(attributes, false /* forVolume */); } /** @@ -7335,8 +7318,6 @@ public class AudioService extends IAudioService.Stub Objects.requireNonNull(device); AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior); - device = retrieveBluetoothAddress(device); - sVolumeLogger.enqueue(new EventLogger.StringEvent("setDeviceVolumeBehavior: dev:" + AudioSystem.getOutputDeviceName(device.getInternalType()) + " addr:" + device.getAddress() + " behavior:" @@ -7420,8 +7401,6 @@ public class AudioService extends IAudioService.Stub // verify parameters Objects.requireNonNull(device); - device = retrieveBluetoothAddress(device); - return getDeviceVolumeBehaviorInt(device); } @@ -7496,12 +7475,9 @@ public class AudioService extends IAudioService.Stub /** * 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) { @@ -7542,9 +7518,6 @@ public class AudioService extends IAudioService.Stub 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 @@ -10301,100 +10274,6 @@ public class AudioService extends IAudioService.Stub 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 @@ -10442,16 +10321,13 @@ public class AudioService extends IAudioService.Stub 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"); @@ -10463,19 +10339,12 @@ public class AudioService extends IAudioService.Stub + 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) @@ -10484,7 +10353,7 @@ public class AudioService extends IAudioService.Stub super.getMutingExpectedDevice_enforcePermission(); synchronized (mMuteAwaitConnectionLock) { - return anonymizeAudioDeviceAttributes(mMutingExpectedDevice); + return mMutingExpectedDevice; } } @@ -10493,9 +10362,6 @@ public class AudioService extends IAudioService.Stub 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) { @@ -10505,7 +10371,7 @@ public class AudioService extends IAudioService.Stub 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"); @@ -10515,14 +10381,8 @@ public class AudioService extends IAudioService.Stub 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) { } }); } @@ -10536,7 +10396,7 @@ public class AudioService extends IAudioService.Stub super.registerMuteAwaitConnectionDispatcher_enforcePermission(); if (register) { - mMuteAwaitConnectionDispatchers.register(cb, isBluetoothPrividged()); + mMuteAwaitConnectionDispatchers.register(cb); } else { mMuteAwaitConnectionDispatchers.unregister(cb); } @@ -10560,14 +10420,8 @@ public class AudioService extends IAudioService.Stub 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) { } }); } @@ -10587,8 +10441,7 @@ public class AudioService extends IAudioService.Stub mMutingExpectedDevice = null; mMutedUsagesAwaitingConnection = null; } - dispatchMuteAwaitConnection((cb, isPrivileged) -> { - try { + dispatchMuteAwaitConnection(cb -> { try { cb.dispatchOnUnmutedEvent( AudioManager.MuteAwaitConnectionCallback.EVENT_TIMEOUT, timedOutDevice, mutedUsages); @@ -10596,14 +10449,13 @@ public class AudioService extends IAudioService.Stub } 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); @@ -13069,9 +12921,6 @@ public class AudioService extends IAudioService.Stub @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 @@ -13092,9 +12941,6 @@ public class AudioService extends IAudioService.Stub @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()); @@ -13122,9 +12968,6 @@ public class AudioService extends IAudioService.Stub @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()); -- GitLab