Loading android/app/src/com/android/bluetooth/a2dp/A2dpService.java +13 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ import com.android.bluetooth.BluetoothMetricsProto; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; Loading Loading @@ -1479,15 +1480,22 @@ public class A2dpService extends ProfileService { SynchronousResultReceiver receiver) { try { A2dpService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.A2DP, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(false); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading android/app/src/com/android/bluetooth/btservice/AudioRoutingManager.java +13 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.bluetooth.btservice; import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; Loading Loading @@ -46,6 +47,7 @@ import com.android.bluetooth.hearingaid.HearingAidService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.le_audio.LeAudioService; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.utils.SynchronousResultReceiver; import java.util.ArrayList; import java.util.Collections; Loading Loading @@ -95,12 +97,19 @@ public class AudioRoutingManager extends ActiveDeviceManager { * * @param device The device to be activated. * @param profile The profile to be activated * @param receiver to post the results */ public void activateDeviceProfile(BluetoothDevice device, int profile) { public void activateDeviceProfile( BluetoothDevice device, int profile, @Nullable SynchronousResultReceiver receiver) { mHandler.post( () -> () -> { boolean result = mHandler.activateDeviceProfile( mHandler.getAudioRoutingDevice(device), profile)); mHandler.getAudioRoutingDevice(device), profile); if (receiver != null) { receiver.send(result); } }); } /** Loading android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java +22 −6 Original line number Diff line number Diff line Loading @@ -46,11 +46,13 @@ import com.android.bluetooth.BluetoothMetricsProto; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ProfileService.IProfileServiceBinder; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.utils.SynchronousResultReceiver; Loading @@ -76,6 +78,7 @@ public class HearingAidService extends ProfileService { private static final int MAX_HEARING_AID_STATE_MACHINES = 10; private static HearingAidService sHearingAidService; private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private AdapterService mAdapterService; private DatabaseManager mDatabaseManager; private HandlerThread mStateMachinesThread; Loading Loading @@ -724,6 +727,11 @@ public class HearingAidService extends ProfileService { sendBroadcast(intent, BLUETOOTH_CONNECT); } @VisibleForTesting void setFeatureFlags(FeatureFlags featureFlags) { mFeatureFlags = featureFlags; } /* Notifications of audio device disconnection events. */ private class AudioManagerOnAudioDevicesRemovedCallback extends AudioDeviceCallback { @Override Loading Loading @@ -1059,15 +1067,23 @@ public class HearingAidService extends ProfileService { SynchronousResultReceiver receiver) { try { HearingAidService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile( device, BluetoothProfile.HEARING_AID, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(false); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading android/app/src/com/android/bluetooth/hfp/HeadsetService.java +12 −3 Original line number Diff line number Diff line Loading @@ -55,10 +55,13 @@ import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.a2dp.A2dpService; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.bluetooth.hfpclient.HeadsetClientService; import com.android.bluetooth.hfpclient.HeadsetClientStateMachine; import com.android.bluetooth.le_audio.LeAudioService; Loading Loading @@ -123,6 +126,7 @@ public class HeadsetService extends ProfileService { // Timeout for state machine thread join, to prevent potential ANR. private static final int SM_THREAD_JOIN_TIMEOUT_MS = 1000; private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private int mMaxHeadsetConnections = 1; private BluetoothDevice mActiveDevice; private AdapterService mAdapterService; Loading Loading @@ -851,11 +855,16 @@ public class HeadsetService extends ProfileService { SynchronousResultReceiver receiver) { try { HeadsetService service = getService(source); boolean defaultValue = false; if (service != null) { defaultValue = service.setActiveDevice(device); if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.HEADSET, receiver); } else { receiver.send(service.setActiveDevice(device)); } } else { receiver.send(false); } receiver.send(defaultValue); } catch (RuntimeException e) { receiver.propagateException(e); } Loading android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +34 −9 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission; import static com.android.modules.utils.build.SdkLevel.isAtLeastU; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; Loading @@ -48,6 +49,7 @@ import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.content.AttributionSource; import android.content.Context; import android.content.Intent; import android.media.AudioDeviceCallback; import android.media.AudioDeviceInfo; Loading @@ -67,6 +69,7 @@ import android.util.Pair; import com.android.bluetooth.Utils; import com.android.bluetooth.bass_client.BassClientService; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; Loading Loading @@ -131,7 +134,7 @@ public class LeAudioService extends ProfileService { private BluetoothDevice mExposedActiveDevice; private LeAudioCodecConfig mLeAudioCodecConfig; private final Object mGroupLock = new Object(); private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private FeatureFlags mFeatureFlags; ServiceFactory mServiceFactory = new ServiceFactory(); LeAudioNativeInterface mLeAudioNativeInterface; Loading Loading @@ -179,6 +182,18 @@ public class LeAudioService extends ProfileService { /* When mScanCallback is not null, it means scan is started. */ ScanCallback mScanCallback; LeAudioService() { mFeatureFlags = new FeatureFlagsImpl(); } @VisibleForTesting LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface, FeatureFlags featureFlags) { attachBaseContext(ctx); mLeAudioNativeInterface = nativeInterface; mFeatureFlags = featureFlags; onCreate(); } private class LeAudioGroupDescriptor { LeAudioGroupDescriptor(boolean isInbandRingtonEnabled) { mIsConnected = false; Loading Loading @@ -293,8 +308,12 @@ public class LeAudioService extends ProfileService { mAdapterService = Objects.requireNonNull(AdapterService.getAdapterService(), "AdapterService cannot be null when LeAudioService starts"); mLeAudioNativeInterface = Objects.requireNonNull(LeAudioNativeInterface.getInstance(), if (mLeAudioNativeInterface == null) { mLeAudioNativeInterface = Objects.requireNonNull( LeAudioNativeInterface.getInstance(), "LeAudioNativeInterface cannot be null when LeAudioService starts"); } mDatabaseManager = Objects.requireNonNull(mAdapterService.getDatabase(), "DatabaseManager cannot be null when LeAudioService starts"); Loading Loading @@ -3882,17 +3901,23 @@ public class LeAudioService extends ProfileService { try { Objects.requireNonNull(source, "source cannot be null"); Objects.requireNonNull(receiver, "receiver cannot be null"); LeAudioService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(true); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading Loading
android/app/src/com/android/bluetooth/a2dp/A2dpService.java +13 −5 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ import com.android.bluetooth.BluetoothMetricsProto; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; Loading Loading @@ -1479,15 +1480,22 @@ public class A2dpService extends ProfileService { SynchronousResultReceiver receiver) { try { A2dpService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.A2DP, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(false); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading
android/app/src/com/android/bluetooth/btservice/AudioRoutingManager.java +13 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.bluetooth.btservice; import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; Loading Loading @@ -46,6 +47,7 @@ import com.android.bluetooth.hearingaid.HearingAidService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.le_audio.LeAudioService; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.utils.SynchronousResultReceiver; import java.util.ArrayList; import java.util.Collections; Loading Loading @@ -95,12 +97,19 @@ public class AudioRoutingManager extends ActiveDeviceManager { * * @param device The device to be activated. * @param profile The profile to be activated * @param receiver to post the results */ public void activateDeviceProfile(BluetoothDevice device, int profile) { public void activateDeviceProfile( BluetoothDevice device, int profile, @Nullable SynchronousResultReceiver receiver) { mHandler.post( () -> () -> { boolean result = mHandler.activateDeviceProfile( mHandler.getAudioRoutingDevice(device), profile)); mHandler.getAudioRoutingDevice(device), profile); if (receiver != null) { receiver.send(result); } }); } /** Loading
android/app/src/com/android/bluetooth/hearingaid/HearingAidService.java +22 −6 Original line number Diff line number Diff line Loading @@ -46,11 +46,13 @@ import com.android.bluetooth.BluetoothMetricsProto; import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ProfileService.IProfileServiceBinder; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.internal.annotations.VisibleForTesting; import com.android.modules.utils.SynchronousResultReceiver; Loading @@ -76,6 +78,7 @@ public class HearingAidService extends ProfileService { private static final int MAX_HEARING_AID_STATE_MACHINES = 10; private static HearingAidService sHearingAidService; private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private AdapterService mAdapterService; private DatabaseManager mDatabaseManager; private HandlerThread mStateMachinesThread; Loading Loading @@ -724,6 +727,11 @@ public class HearingAidService extends ProfileService { sendBroadcast(intent, BLUETOOTH_CONNECT); } @VisibleForTesting void setFeatureFlags(FeatureFlags featureFlags) { mFeatureFlags = featureFlags; } /* Notifications of audio device disconnection events. */ private class AudioManagerOnAudioDevicesRemovedCallback extends AudioDeviceCallback { @Override Loading Loading @@ -1059,15 +1067,23 @@ public class HearingAidService extends ProfileService { SynchronousResultReceiver receiver) { try { HearingAidService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile( device, BluetoothProfile.HEARING_AID, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(false); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading
android/app/src/com/android/bluetooth/hfp/HeadsetService.java +12 −3 Original line number Diff line number Diff line Loading @@ -55,10 +55,13 @@ import com.android.bluetooth.BluetoothStatsLog; import com.android.bluetooth.Utils; import com.android.bluetooth.a2dp.A2dpService; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.bluetooth.hfpclient.HeadsetClientService; import com.android.bluetooth.hfpclient.HeadsetClientStateMachine; import com.android.bluetooth.le_audio.LeAudioService; Loading Loading @@ -123,6 +126,7 @@ public class HeadsetService extends ProfileService { // Timeout for state machine thread join, to prevent potential ANR. private static final int SM_THREAD_JOIN_TIMEOUT_MS = 1000; private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private int mMaxHeadsetConnections = 1; private BluetoothDevice mActiveDevice; private AdapterService mAdapterService; Loading Loading @@ -851,11 +855,16 @@ public class HeadsetService extends ProfileService { SynchronousResultReceiver receiver) { try { HeadsetService service = getService(source); boolean defaultValue = false; if (service != null) { defaultValue = service.setActiveDevice(device); if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.HEADSET, receiver); } else { receiver.send(service.setActiveDevice(device)); } } else { receiver.send(false); } receiver.send(defaultValue); } catch (RuntimeException e) { receiver.propagateException(e); } Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +34 −9 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID; import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission; import static com.android.modules.utils.build.SdkLevel.isAtLeastU; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; Loading @@ -48,6 +49,7 @@ import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.content.AttributionSource; import android.content.Context; import android.content.Intent; import android.media.AudioDeviceCallback; import android.media.AudioDeviceInfo; Loading @@ -67,6 +69,7 @@ import android.util.Pair; import com.android.bluetooth.Utils; import com.android.bluetooth.bass_client.BassClientService; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.MetricsLogger; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; Loading Loading @@ -131,7 +134,7 @@ public class LeAudioService extends ProfileService { private BluetoothDevice mExposedActiveDevice; private LeAudioCodecConfig mLeAudioCodecConfig; private final Object mGroupLock = new Object(); private FeatureFlags mFeatureFlags = new FeatureFlagsImpl(); private FeatureFlags mFeatureFlags; ServiceFactory mServiceFactory = new ServiceFactory(); LeAudioNativeInterface mLeAudioNativeInterface; Loading Loading @@ -179,6 +182,18 @@ public class LeAudioService extends ProfileService { /* When mScanCallback is not null, it means scan is started. */ ScanCallback mScanCallback; LeAudioService() { mFeatureFlags = new FeatureFlagsImpl(); } @VisibleForTesting LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface, FeatureFlags featureFlags) { attachBaseContext(ctx); mLeAudioNativeInterface = nativeInterface; mFeatureFlags = featureFlags; onCreate(); } private class LeAudioGroupDescriptor { LeAudioGroupDescriptor(boolean isInbandRingtonEnabled) { mIsConnected = false; Loading Loading @@ -293,8 +308,12 @@ public class LeAudioService extends ProfileService { mAdapterService = Objects.requireNonNull(AdapterService.getAdapterService(), "AdapterService cannot be null when LeAudioService starts"); mLeAudioNativeInterface = Objects.requireNonNull(LeAudioNativeInterface.getInstance(), if (mLeAudioNativeInterface == null) { mLeAudioNativeInterface = Objects.requireNonNull( LeAudioNativeInterface.getInstance(), "LeAudioNativeInterface cannot be null when LeAudioService starts"); } mDatabaseManager = Objects.requireNonNull(mAdapterService.getDatabase(), "DatabaseManager cannot be null when LeAudioService starts"); Loading Loading @@ -3882,17 +3901,23 @@ public class LeAudioService extends ProfileService { try { Objects.requireNonNull(source, "source cannot be null"); Objects.requireNonNull(receiver, "receiver cannot be null"); LeAudioService service = getService(source); boolean result = false; if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, receiver); } else { boolean result; if (device == null) { result = service.removeActiveDevice(true); } else { result = service.setActiveDevice(device); } } receiver.send(result); } } else { receiver.send(false); } } catch (RuntimeException e) { receiver.propagateException(e); } Loading