Loading android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +28 −42 Original line number Diff line number Diff line Loading @@ -79,8 +79,7 @@ import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.csip.CsipSetCoordinatorService; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.hap.HapClientService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.mcp.McpService; Loading Loading @@ -149,7 +148,6 @@ public class LeAudioService extends ProfileService { private final ReentrantReadWriteLock mGroupReadWriteLock = new ReentrantReadWriteLock(); private final Lock mGroupReadLock = mGroupReadWriteLock.readLock(); private final Lock mGroupWriteLock = mGroupReadWriteLock.writeLock(); private FeatureFlags mFeatureFlags; ServiceFactory mServiceFactory = new ServiceFactory(); LeAudioNativeInterface mLeAudioNativeInterface; Loading Loading @@ -200,14 +198,12 @@ public class LeAudioService extends ProfileService { public LeAudioService(Context ctx) { super(ctx); mFeatureFlags = new FeatureFlagsImpl(); } @VisibleForTesting LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface, FeatureFlags featureFlags) { LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface) { super(ctx); mLeAudioNativeInterface = nativeInterface; mFeatureFlags = featureFlags; } private class LeAudioGroupDescriptor { Loading Loading @@ -467,7 +463,7 @@ public class LeAudioService extends ProfileService { sm.cleanup(); } } finally { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { // Upgrade to write lock groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ false); Loading Loading @@ -556,11 +552,6 @@ public class LeAudioService extends ProfileService { sLeAudioService = instance; } @VisibleForTesting void setFeatureFlags(FeatureFlags featureFlags) { mFeatureFlags = featureFlags; } VolumeControlService getVolumeControlService() { if (mVolumeControlService == null) { mVolumeControlService = mServiceFactory.getVolumeControlService(); Loading Loading @@ -650,7 +641,7 @@ public class LeAudioService extends ProfileService { return false; } if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { sm.sendMessage(LeAudioStateMachine.CONNECT); } Loading @@ -658,7 +649,7 @@ public class LeAudioService extends ProfileService { groupMutexUnlock(/* isReadOnly */ false); } if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { sm.sendMessage(LeAudioStateMachine.CONNECT); } Loading Loading @@ -707,7 +698,7 @@ public class LeAudioService extends ProfileService { * @return true if profile disconnected, false if device not connected over LE Audio */ public boolean disconnect(BluetoothDevice device) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { return disconnectV2(device); } Loading Loading @@ -995,7 +986,7 @@ public class LeAudioService extends ProfileService { Log.i(TAG, "Unicast group is active, queueing Broadcast creation, while the Unicast" + " group is deactivated."); mCreateBroadcastQueue.add(broadcastSettings); if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, true); } Loading Loading @@ -1150,7 +1141,7 @@ public class LeAudioService extends ProfileService { } if (DBG) Log.d(TAG, "destroyBroadcast"); if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, false); } mLeAudioBroadcasterNativeInterface.destroyBroadcast(broadcastId); Loading Loading @@ -1766,8 +1757,7 @@ public class LeAudioService extends ProfileService { if (notifyAndUpdateInactiveOutDeviceOnly && ((newSupportedAudioDirections & AUDIO_DIRECTION_INPUT_BIT) != 0)) { newInDevice = getLeadDeviceForTheGroup(groupId); } else if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && wasSetSinkListeningMode()) { } else if (Flags.leaudioBroadcastAudioHandoverPolicies() && wasSetSinkListeningMode()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, false); } Loading Loading @@ -1970,7 +1960,7 @@ public class LeAudioService extends ProfileService { return false; } if (!mFeatureFlags.audioRoutingCentralization()) { if (!Flags.audioRoutingCentralization()) { // If AUDIO_ROUTING_CENTRALIZATION, this will be checked inside AudioRoutingManager. if (Utils.isDualModeAudioEnabled()) { if (!mAdapterService.isAllSupportedClassicAudioProfilesActive(device)) { Loading Loading @@ -2176,7 +2166,7 @@ public class LeAudioService extends ProfileService { 1); break; case LeAudioStackEvent.HEALTH_RECOMMENDATION_ACTION_INACTIVATE_GROUP: if (mFeatureFlags.leaudioUnicastInactivateDeviceBasedOnContext()) { if (Flags.leaudioUnicastInactivateDeviceBasedOnContext()) { LeAudioGroupDescriptor groupDescriptor = getGroupDescriptor(groupId); if (groupDescriptor != null && groupDescriptor.mIsActive) { Log.i( Loading Loading @@ -2230,7 +2220,7 @@ public class LeAudioService extends ProfileService { */ boolean leaveConnectedInputDevice = false; Integer newDirections = AUDIO_DIRECTION_NONE; if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() if (Flags.leaudioBroadcastAudioHandoverPolicies() && (!mCreateBroadcastQueue.isEmpty() || mBroadcastIdDeactivatedForUnicastTransition.isPresent())) { leaveConnectedInputDevice = true; Loading Loading @@ -2928,7 +2918,7 @@ public class LeAudioService extends ProfileService { } // Notify broadcast assistant if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { if (bassClientService != null) { bassClientService.notifyBroadcastStateChanged(descriptor.mState, broadcastId); } Loading Loading @@ -2988,11 +2978,7 @@ public class LeAudioService extends ProfileService { sm = LeAudioStateMachine.make( device, this, mLeAudioNativeInterface, mStateMachinesThread.getLooper(), mFeatureFlags); device, this, mLeAudioNativeInterface, mStateMachinesThread.getLooper()); descriptor.mStateMachine = sm; return sm; } Loading Loading @@ -3049,14 +3035,14 @@ public class LeAudioService extends ProfileService { } } finally { // Reduce size of critical section when this feature is enabled if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { groupMutexUnlock(/* isReadOnly */ true); } } removeStateMachine(device); removeAuthorizationInfoForRelatedProfiles(device); } finally { if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { groupMutexUnlock(/* isReadOnly */ true); } } Loading Loading @@ -3086,7 +3072,7 @@ public class LeAudioService extends ProfileService { sm.cleanup(); descriptor.mStateMachine = null; } finally { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { // Upgrade to write lock groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ false); Loading Loading @@ -3232,7 +3218,7 @@ public class LeAudioService extends ProfileService { * Process a change for disconnection of a device. */ public synchronized void deviceDisconnected(BluetoothDevice device, boolean hasFallbackDevice) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { deviceDisconnectedV2(device, hasFallbackDevice); return; } Loading Loading @@ -3388,8 +3374,7 @@ public class LeAudioService extends ProfileService { } /* For setting inCall mode */ if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && inCall && !areBroadcastsAllStopped()) { if (Flags.leaudioBroadcastAudioHandoverPolicies() && inCall && !areBroadcastsAllStopped()) { mQueuedInCallValue = Optional.of(true); /* Request activation of unicast group */ Loading @@ -3402,7 +3387,8 @@ public class LeAudioService extends ProfileService { mLeAudioNativeInterface.setInCall(inCall); /* For clearing inCall mode */ if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && !inCall if (Flags.leaudioBroadcastAudioHandoverPolicies() && !inCall && mBroadcastIdDeactivatedForUnicastTransition.isPresent()) { handleUnicastStreamStatusChange( LeAudioStackEvent.DIRECTION_SINK, Loading Loading @@ -3640,7 +3626,7 @@ public class LeAudioService extends ProfileService { } void removeAuthorizationInfoForRelatedProfiles(BluetoothDevice device) { if (!mFeatureFlags.leaudioMcsTbsAuthorizationRebondFix()) { if (!Flags.leaudioMcsTbsAuthorizationRebondFix()) { Log.i(TAG, "leaudio_mcs_tbs_authorization_rebond_fix is disabled"); return; } Loading Loading @@ -3678,7 +3664,7 @@ public class LeAudioService extends ProfileService { return; } } finally { if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { // Keep previous behavior where a lock is released and acquired immediately groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ true); Loading Loading @@ -3821,7 +3807,7 @@ public class LeAudioService extends ProfileService { || Objects.equals(device, mActiveAudioInDevice)) { handleGroupTransitToInactive(groupId); } if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { mGroupDescriptors.remove(groupId); } Loading @@ -3834,7 +3820,7 @@ public class LeAudioService extends ProfileService { groupMutexUnlock(/* isReadOnly */ true); } if (isGroupEmpty && mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (isGroupEmpty && Flags.leaudioApiSynchronizedBlockFix()) { groupMutexLock(/* isReadOnly */ false); try { mGroupDescriptors.remove(groupId); Loading Loading @@ -4366,7 +4352,7 @@ public class LeAudioService extends ProfileService { Objects.requireNonNull(receiver, "receiver cannot be null"); LeAudioService service = getService(source); if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, receiver); } else { Loading Loading @@ -4977,7 +4963,7 @@ public class LeAudioService extends ProfileService { } private void groupMutexLock(boolean isReadOnly) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { if (isReadOnly) { mGroupReadLock.lock(); } else { Loading @@ -4989,7 +4975,7 @@ public class LeAudioService extends ProfileService { } private void groupMutexUnlock(boolean isReadOnly) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { if (isReadOnly) { mGroupReadLock.unlock(); } else { Loading android/app/src/com/android/bluetooth/le_audio/LeAudioStateMachine.java +6 −10 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ import android.os.Message; import android.util.Log; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.Flags; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.State; import com.android.internal.util.StateMachine; Loading Loading @@ -88,19 +88,16 @@ final class LeAudioStateMachine extends StateMachine { private LeAudioNativeInterface mNativeInterface; private final BluetoothDevice mDevice; private final FeatureFlags mFeatureFlags; LeAudioStateMachine( BluetoothDevice device, LeAudioService svc, LeAudioNativeInterface nativeInterface, Looper looper, FeatureFlags featureFlags) { Looper looper) { super(TAG, looper); mDevice = device; mService = svc; mNativeInterface = nativeInterface; mFeatureFlags = featureFlags; mDisconnected = new Disconnected(); mConnecting = new Connecting(); Loading @@ -119,11 +116,10 @@ final class LeAudioStateMachine extends StateMachine { BluetoothDevice device, LeAudioService svc, LeAudioNativeInterface nativeInterface, Looper looper, FeatureFlags featureFlags) { Looper looper) { Log.i(TAG, "make for device"); LeAudioStateMachine LeAudioSm = new LeAudioStateMachine(device, svc, nativeInterface, looper, featureFlags); new LeAudioStateMachine(device, svc, nativeInterface, looper); LeAudioSm.start(); return LeAudioSm; } Loading Loading @@ -151,7 +147,7 @@ final class LeAudioStateMachine extends StateMachine { // Don't broadcast during startup broadcastConnectionState(BluetoothProfile.STATE_DISCONNECTED, mLastConnectionState); if (mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { mService.deviceDisconnected(mDevice, false); } } Loading Loading @@ -441,7 +437,7 @@ final class LeAudioStateMachine extends StateMachine { + messageWhatToString(getCurrentMessage().what)); mConnectionState = BluetoothProfile.STATE_CONNECTED; removeDeferredMessages(CONNECT); if (mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { mService.deviceConnected(mDevice); } broadcastConnectionState(BluetoothProfile.STATE_CONNECTED, mLastConnectionState); Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java +9 −12 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.bluetooth.IBluetoothLeBroadcastCallback; import android.content.AttributionSource; import android.os.ParcelUuid; import android.os.RemoteCallbackList; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; Loading @@ -42,12 +43,12 @@ import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.x.com.android.modules.utils.SynchronousResultReceiver; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; Loading @@ -58,8 +59,9 @@ import java.util.UUID; public class LeAudioBinderTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private LeAudioService mLeAudioService; private FakeFeatureFlagsImpl mFakeFlagsImpl; @Mock private AdapterService mAdapterService; @Mock private LeAudioNativeInterface mNativeInterface; @Mock private DatabaseManager mDatabaseManager; Loading @@ -83,15 +85,10 @@ public class LeAudioBinderTest { doReturn(mDatabaseManager).when(mAdapterService).getDatabase(); doReturn(mAudioRoutingManager).when(mAdapterService).getActiveDeviceManager(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mLeAudioService = spy( new LeAudioService( InstrumentationRegistry.getTargetContext(), mNativeInterface, mFakeFlagsImpl)); InstrumentationRegistry.getTargetContext(), mNativeInterface)); mLeAudioService.start(); mAdapter = BluetoothAdapter.getDefaultAdapter(); mBinder = new LeAudioService.BluetoothLeAudioBinder(mLeAudioService); Loading Loading @@ -173,12 +170,12 @@ public class LeAudioBinderTest { BluetoothDevice device = TestUtils.getTestDevice(mAdapter, 0); AttributionSource source = new AttributionSource.Builder(0).build(); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(device, source, recv); verify(mLeAudioService).setActiveDevice(device); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(device, source, recv); verify(mAudioRoutingManager).activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, recv); Loading @@ -188,12 +185,12 @@ public class LeAudioBinderTest { public void setActiveDevice_withNullDevice_callsRemoveActiveDevice() { AttributionSource source = new AttributionSource.Builder(0).build(); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(null, source, recv); verify(mLeAudioService).removeActiveDevice(true); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(null, source, recv); verify(mAudioRoutingManager).activateDeviceProfile(null, BluetoothProfile.LE_AUDIO, recv); Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +10 −14 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.content.IntentFilter; import android.media.AudioManager; import android.os.Looper; import android.os.ParcelUuid; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.MediumTest; Loading @@ -39,12 +40,12 @@ import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.ActiveDeviceManager; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; Loading @@ -59,6 +60,9 @@ import java.util.concurrent.TimeoutException; @RunWith(AndroidJUnit4.class) public class LeAudioBroadcastServiceTest { private static final int TIMEOUT_MS = 1000; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private BluetoothAdapter mAdapter; private BluetoothDevice mDevice; private Context mTargetContext; Loading Loading @@ -106,7 +110,6 @@ public class LeAudioBroadcastServiceTest { private boolean mOnBroadcastUpdateFailedCalled = false; private boolean mOnBroadcastMetadataChangedCalled = false; private int mOnBroadcastStartFailedReason = BluetoothStatusCodes.SUCCESS; private FakeFeatureFlagsImpl mFakeFlagsImpl; private final IBluetoothLeBroadcastCallback mCallbacks = new IBluetoothLeBroadcastCallback.Stub() { Loading Loading @@ -188,13 +191,6 @@ public class LeAudioBroadcastServiceTest { LeAudioNativeInterface.setInstance(mLeAudioNativeInterface); startService(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, false); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mService.setFeatureFlags(mFakeFlagsImpl); mService.mAudioManager = mAudioManager; // Set up the State Changed receiver Loading Loading @@ -647,7 +643,7 @@ public class LeAudioBroadcastServiceTest { int groupId = 1; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); prepareConnectedUnicastDevice(groupId); Loading Loading @@ -733,8 +729,8 @@ public class LeAudioBroadcastServiceTest { int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES); mService.mBroadcastCallbacks.register(mCallbacks); Loading Loading @@ -846,8 +842,8 @@ public class LeAudioBroadcastServiceTest { int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES); mService.mBroadcastCallbacks.register(mCallbacks); Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java +9 −15 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.media.BluetoothProfileConnectionInfo; import android.os.Handler; import android.os.Looper; import android.os.ParcelUuid; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.MediumTest; Loading @@ -62,7 +63,6 @@ import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.csip.CsipSetCoordinatorService; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.hap.HapClientService; import com.android.bluetooth.hfp.HeadsetService; Loading @@ -72,6 +72,7 @@ import com.android.bluetooth.vc.VolumeControlService; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading @@ -97,6 +98,8 @@ public class LeAudioServiceTest { private static final int MAX_LE_AUDIO_CONNECTIONS = 5; private static final int LE_AUDIO_GROUP_ID_INVALID = -1; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private BluetoothAdapter mAdapter; private Context mTargetContext; private LeAudioService mService; Loading @@ -112,7 +115,6 @@ public class LeAudioServiceTest { private boolean onGroupStreamStatusCallbackCalled = false; private boolean onGroupCodecConfChangedCallbackCalled = false; private BluetoothLeAudioCodecStatus testCodecStatus = null; private FakeFeatureFlagsImpl mFakeFlagsImpl; private BroadcastReceiver mLeAudioIntentReceiver; Loading Loading @@ -195,14 +197,6 @@ public class LeAudioServiceTest { LeAudioNativeInterface.setInstance(mNativeInterface); startService(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, false); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mService.setFeatureFlags(mFakeFlagsImpl); mService.mAudioManager = mAudioManager; mService.mMcpService = mMcpService; mService.mTbsService = mTbsService; Loading Loading @@ -811,8 +805,8 @@ public class LeAudioServiceTest { /** Test that authorization info is removed from TBS and MCS after the device is unbond. */ @Test public void testAuthorizationInfoRemovedFromTbsMcsOnUnbondEvents() { mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX); // Update the device priority so okToConnect() returns true when(mDatabaseManager.getProfileConnectionPolicy(mLeftDevice, BluetoothProfile.LE_AUDIO)) Loading Loading @@ -942,7 +936,7 @@ public class LeAudioServiceTest { @Test public void testAuthorizationInfoRemovedFromTbsMcsOnUnbondEventsWithSynchBlockFixFlag() { mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, true); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX); testAuthorizationInfoRemovedFromTbsMcsOnUnbondEvents(); } Loading Loading @@ -1737,8 +1731,8 @@ public class LeAudioServiceTest { @Test public void testMediaContextUnavailableForAWhile() { mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, true); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); doReturn(true).when(mNativeInterface).connectLeAudio(any(BluetoothDevice.class)); connectTestDevice(mSingleDevice, testGroupId); Loading Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +28 −42 Original line number Diff line number Diff line Loading @@ -79,8 +79,7 @@ import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.csip.CsipSetCoordinatorService; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.FeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.hap.HapClientService; import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.mcp.McpService; Loading Loading @@ -149,7 +148,6 @@ public class LeAudioService extends ProfileService { private final ReentrantReadWriteLock mGroupReadWriteLock = new ReentrantReadWriteLock(); private final Lock mGroupReadLock = mGroupReadWriteLock.readLock(); private final Lock mGroupWriteLock = mGroupReadWriteLock.writeLock(); private FeatureFlags mFeatureFlags; ServiceFactory mServiceFactory = new ServiceFactory(); LeAudioNativeInterface mLeAudioNativeInterface; Loading Loading @@ -200,14 +198,12 @@ public class LeAudioService extends ProfileService { public LeAudioService(Context ctx) { super(ctx); mFeatureFlags = new FeatureFlagsImpl(); } @VisibleForTesting LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface, FeatureFlags featureFlags) { LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface) { super(ctx); mLeAudioNativeInterface = nativeInterface; mFeatureFlags = featureFlags; } private class LeAudioGroupDescriptor { Loading Loading @@ -467,7 +463,7 @@ public class LeAudioService extends ProfileService { sm.cleanup(); } } finally { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { // Upgrade to write lock groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ false); Loading Loading @@ -556,11 +552,6 @@ public class LeAudioService extends ProfileService { sLeAudioService = instance; } @VisibleForTesting void setFeatureFlags(FeatureFlags featureFlags) { mFeatureFlags = featureFlags; } VolumeControlService getVolumeControlService() { if (mVolumeControlService == null) { mVolumeControlService = mServiceFactory.getVolumeControlService(); Loading Loading @@ -650,7 +641,7 @@ public class LeAudioService extends ProfileService { return false; } if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { sm.sendMessage(LeAudioStateMachine.CONNECT); } Loading @@ -658,7 +649,7 @@ public class LeAudioService extends ProfileService { groupMutexUnlock(/* isReadOnly */ false); } if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { sm.sendMessage(LeAudioStateMachine.CONNECT); } Loading Loading @@ -707,7 +698,7 @@ public class LeAudioService extends ProfileService { * @return true if profile disconnected, false if device not connected over LE Audio */ public boolean disconnect(BluetoothDevice device) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { return disconnectV2(device); } Loading Loading @@ -995,7 +986,7 @@ public class LeAudioService extends ProfileService { Log.i(TAG, "Unicast group is active, queueing Broadcast creation, while the Unicast" + " group is deactivated."); mCreateBroadcastQueue.add(broadcastSettings); if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, true); } Loading Loading @@ -1150,7 +1141,7 @@ public class LeAudioService extends ProfileService { } if (DBG) Log.d(TAG, "destroyBroadcast"); if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, false); } mLeAudioBroadcasterNativeInterface.destroyBroadcast(broadcastId); Loading Loading @@ -1766,8 +1757,7 @@ public class LeAudioService extends ProfileService { if (notifyAndUpdateInactiveOutDeviceOnly && ((newSupportedAudioDirections & AUDIO_DIRECTION_INPUT_BIT) != 0)) { newInDevice = getLeadDeviceForTheGroup(groupId); } else if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && wasSetSinkListeningMode()) { } else if (Flags.leaudioBroadcastAudioHandoverPolicies() && wasSetSinkListeningMode()) { mLeAudioNativeInterface.setUnicastMonitorMode(LeAudioStackEvent.DIRECTION_SINK, false); } Loading Loading @@ -1970,7 +1960,7 @@ public class LeAudioService extends ProfileService { return false; } if (!mFeatureFlags.audioRoutingCentralization()) { if (!Flags.audioRoutingCentralization()) { // If AUDIO_ROUTING_CENTRALIZATION, this will be checked inside AudioRoutingManager. if (Utils.isDualModeAudioEnabled()) { if (!mAdapterService.isAllSupportedClassicAudioProfilesActive(device)) { Loading Loading @@ -2176,7 +2166,7 @@ public class LeAudioService extends ProfileService { 1); break; case LeAudioStackEvent.HEALTH_RECOMMENDATION_ACTION_INACTIVATE_GROUP: if (mFeatureFlags.leaudioUnicastInactivateDeviceBasedOnContext()) { if (Flags.leaudioUnicastInactivateDeviceBasedOnContext()) { LeAudioGroupDescriptor groupDescriptor = getGroupDescriptor(groupId); if (groupDescriptor != null && groupDescriptor.mIsActive) { Log.i( Loading Loading @@ -2230,7 +2220,7 @@ public class LeAudioService extends ProfileService { */ boolean leaveConnectedInputDevice = false; Integer newDirections = AUDIO_DIRECTION_NONE; if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() if (Flags.leaudioBroadcastAudioHandoverPolicies() && (!mCreateBroadcastQueue.isEmpty() || mBroadcastIdDeactivatedForUnicastTransition.isPresent())) { leaveConnectedInputDevice = true; Loading Loading @@ -2928,7 +2918,7 @@ public class LeAudioService extends ProfileService { } // Notify broadcast assistant if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies()) { if (Flags.leaudioBroadcastAudioHandoverPolicies()) { if (bassClientService != null) { bassClientService.notifyBroadcastStateChanged(descriptor.mState, broadcastId); } Loading Loading @@ -2988,11 +2978,7 @@ public class LeAudioService extends ProfileService { sm = LeAudioStateMachine.make( device, this, mLeAudioNativeInterface, mStateMachinesThread.getLooper(), mFeatureFlags); device, this, mLeAudioNativeInterface, mStateMachinesThread.getLooper()); descriptor.mStateMachine = sm; return sm; } Loading Loading @@ -3049,14 +3035,14 @@ public class LeAudioService extends ProfileService { } } finally { // Reduce size of critical section when this feature is enabled if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { groupMutexUnlock(/* isReadOnly */ true); } } removeStateMachine(device); removeAuthorizationInfoForRelatedProfiles(device); } finally { if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { groupMutexUnlock(/* isReadOnly */ true); } } Loading Loading @@ -3086,7 +3072,7 @@ public class LeAudioService extends ProfileService { sm.cleanup(); descriptor.mStateMachine = null; } finally { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { // Upgrade to write lock groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ false); Loading Loading @@ -3232,7 +3218,7 @@ public class LeAudioService extends ProfileService { * Process a change for disconnection of a device. */ public synchronized void deviceDisconnected(BluetoothDevice device, boolean hasFallbackDevice) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { deviceDisconnectedV2(device, hasFallbackDevice); return; } Loading Loading @@ -3388,8 +3374,7 @@ public class LeAudioService extends ProfileService { } /* For setting inCall mode */ if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && inCall && !areBroadcastsAllStopped()) { if (Flags.leaudioBroadcastAudioHandoverPolicies() && inCall && !areBroadcastsAllStopped()) { mQueuedInCallValue = Optional.of(true); /* Request activation of unicast group */ Loading @@ -3402,7 +3387,8 @@ public class LeAudioService extends ProfileService { mLeAudioNativeInterface.setInCall(inCall); /* For clearing inCall mode */ if (mFeatureFlags.leaudioBroadcastAudioHandoverPolicies() && !inCall if (Flags.leaudioBroadcastAudioHandoverPolicies() && !inCall && mBroadcastIdDeactivatedForUnicastTransition.isPresent()) { handleUnicastStreamStatusChange( LeAudioStackEvent.DIRECTION_SINK, Loading Loading @@ -3640,7 +3626,7 @@ public class LeAudioService extends ProfileService { } void removeAuthorizationInfoForRelatedProfiles(BluetoothDevice device) { if (!mFeatureFlags.leaudioMcsTbsAuthorizationRebondFix()) { if (!Flags.leaudioMcsTbsAuthorizationRebondFix()) { Log.i(TAG, "leaudio_mcs_tbs_authorization_rebond_fix is disabled"); return; } Loading Loading @@ -3678,7 +3664,7 @@ public class LeAudioService extends ProfileService { return; } } finally { if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { // Keep previous behavior where a lock is released and acquired immediately groupMutexUnlock(/* isReadOnly */ true); groupMutexLock(/* isReadOnly */ true); Loading Loading @@ -3821,7 +3807,7 @@ public class LeAudioService extends ProfileService { || Objects.equals(device, mActiveAudioInDevice)) { handleGroupTransitToInactive(groupId); } if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (!Flags.leaudioApiSynchronizedBlockFix()) { mGroupDescriptors.remove(groupId); } Loading @@ -3834,7 +3820,7 @@ public class LeAudioService extends ProfileService { groupMutexUnlock(/* isReadOnly */ true); } if (isGroupEmpty && mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (isGroupEmpty && Flags.leaudioApiSynchronizedBlockFix()) { groupMutexLock(/* isReadOnly */ false); try { mGroupDescriptors.remove(groupId); Loading Loading @@ -4366,7 +4352,7 @@ public class LeAudioService extends ProfileService { Objects.requireNonNull(receiver, "receiver cannot be null"); LeAudioService service = getService(source); if (service != null) { if (service.mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager()) .activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, receiver); } else { Loading Loading @@ -4977,7 +4963,7 @@ public class LeAudioService extends ProfileService { } private void groupMutexLock(boolean isReadOnly) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { if (isReadOnly) { mGroupReadLock.lock(); } else { Loading @@ -4989,7 +4975,7 @@ public class LeAudioService extends ProfileService { } private void groupMutexUnlock(boolean isReadOnly) { if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) { if (Flags.leaudioApiSynchronizedBlockFix()) { if (isReadOnly) { mGroupReadLock.unlock(); } else { Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioStateMachine.java +6 −10 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ import android.os.Message; import android.util.Log; import com.android.bluetooth.btservice.ProfileService; import com.android.bluetooth.flags.FeatureFlags; import com.android.bluetooth.flags.Flags; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.State; import com.android.internal.util.StateMachine; Loading Loading @@ -88,19 +88,16 @@ final class LeAudioStateMachine extends StateMachine { private LeAudioNativeInterface mNativeInterface; private final BluetoothDevice mDevice; private final FeatureFlags mFeatureFlags; LeAudioStateMachine( BluetoothDevice device, LeAudioService svc, LeAudioNativeInterface nativeInterface, Looper looper, FeatureFlags featureFlags) { Looper looper) { super(TAG, looper); mDevice = device; mService = svc; mNativeInterface = nativeInterface; mFeatureFlags = featureFlags; mDisconnected = new Disconnected(); mConnecting = new Connecting(); Loading @@ -119,11 +116,10 @@ final class LeAudioStateMachine extends StateMachine { BluetoothDevice device, LeAudioService svc, LeAudioNativeInterface nativeInterface, Looper looper, FeatureFlags featureFlags) { Looper looper) { Log.i(TAG, "make for device"); LeAudioStateMachine LeAudioSm = new LeAudioStateMachine(device, svc, nativeInterface, looper, featureFlags); new LeAudioStateMachine(device, svc, nativeInterface, looper); LeAudioSm.start(); return LeAudioSm; } Loading Loading @@ -151,7 +147,7 @@ final class LeAudioStateMachine extends StateMachine { // Don't broadcast during startup broadcastConnectionState(BluetoothProfile.STATE_DISCONNECTED, mLastConnectionState); if (mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { mService.deviceDisconnected(mDevice, false); } } Loading Loading @@ -441,7 +437,7 @@ final class LeAudioStateMachine extends StateMachine { + messageWhatToString(getCurrentMessage().what)); mConnectionState = BluetoothProfile.STATE_CONNECTED; removeDeferredMessages(CONNECT); if (mFeatureFlags.audioRoutingCentralization()) { if (Flags.audioRoutingCentralization()) { mService.deviceConnected(mDevice); } broadcastConnectionState(BluetoothProfile.STATE_CONNECTED, mLastConnectionState); Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBinderTest.java +9 −12 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.bluetooth.IBluetoothLeBroadcastCallback; import android.content.AttributionSource; import android.os.ParcelUuid; import android.os.RemoteCallbackList; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; Loading @@ -42,12 +43,12 @@ import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.AudioRoutingManager; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.x.com.android.modules.utils.SynchronousResultReceiver; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; Loading @@ -58,8 +59,9 @@ import java.util.UUID; public class LeAudioBinderTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private LeAudioService mLeAudioService; private FakeFeatureFlagsImpl mFakeFlagsImpl; @Mock private AdapterService mAdapterService; @Mock private LeAudioNativeInterface mNativeInterface; @Mock private DatabaseManager mDatabaseManager; Loading @@ -83,15 +85,10 @@ public class LeAudioBinderTest { doReturn(mDatabaseManager).when(mAdapterService).getDatabase(); doReturn(mAudioRoutingManager).when(mAdapterService).getActiveDeviceManager(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mLeAudioService = spy( new LeAudioService( InstrumentationRegistry.getTargetContext(), mNativeInterface, mFakeFlagsImpl)); InstrumentationRegistry.getTargetContext(), mNativeInterface)); mLeAudioService.start(); mAdapter = BluetoothAdapter.getDefaultAdapter(); mBinder = new LeAudioService.BluetoothLeAudioBinder(mLeAudioService); Loading Loading @@ -173,12 +170,12 @@ public class LeAudioBinderTest { BluetoothDevice device = TestUtils.getTestDevice(mAdapter, 0); AttributionSource source = new AttributionSource.Builder(0).build(); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(device, source, recv); verify(mLeAudioService).setActiveDevice(device); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(device, source, recv); verify(mAudioRoutingManager).activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, recv); Loading @@ -188,12 +185,12 @@ public class LeAudioBinderTest { public void setActiveDevice_withNullDevice_callsRemoveActiveDevice() { AttributionSource source = new AttributionSource.Builder(0).build(); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mSetFlagsRule.disableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); SynchronousResultReceiver<Boolean> recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(null, source, recv); verify(mLeAudioService).removeActiveDevice(true); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); recv = SynchronousResultReceiver.get(); mBinder.setActiveDevice(null, source, recv); verify(mAudioRoutingManager).activateDeviceProfile(null, BluetoothProfile.LE_AUDIO, recv); Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +10 −14 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.content.IntentFilter; import android.media.AudioManager; import android.os.Looper; import android.os.ParcelUuid; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.MediumTest; Loading @@ -39,12 +40,12 @@ import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.ActiveDeviceManager; import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; Loading @@ -59,6 +60,9 @@ import java.util.concurrent.TimeoutException; @RunWith(AndroidJUnit4.class) public class LeAudioBroadcastServiceTest { private static final int TIMEOUT_MS = 1000; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private BluetoothAdapter mAdapter; private BluetoothDevice mDevice; private Context mTargetContext; Loading Loading @@ -106,7 +110,6 @@ public class LeAudioBroadcastServiceTest { private boolean mOnBroadcastUpdateFailedCalled = false; private boolean mOnBroadcastMetadataChangedCalled = false; private int mOnBroadcastStartFailedReason = BluetoothStatusCodes.SUCCESS; private FakeFeatureFlagsImpl mFakeFlagsImpl; private final IBluetoothLeBroadcastCallback mCallbacks = new IBluetoothLeBroadcastCallback.Stub() { Loading Loading @@ -188,13 +191,6 @@ public class LeAudioBroadcastServiceTest { LeAudioNativeInterface.setInstance(mLeAudioNativeInterface); startService(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, false); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mService.setFeatureFlags(mFakeFlagsImpl); mService.mAudioManager = mAudioManager; // Set up the State Changed receiver Loading Loading @@ -647,7 +643,7 @@ public class LeAudioBroadcastServiceTest { int groupId = 1; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); prepareConnectedUnicastDevice(groupId); Loading Loading @@ -733,8 +729,8 @@ public class LeAudioBroadcastServiceTest { int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES); mService.mBroadcastCallbacks.register(mCallbacks); Loading Loading @@ -846,8 +842,8 @@ public class LeAudioBroadcastServiceTest { int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES); mService.mBroadcastCallbacks.register(mCallbacks); Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java +9 −15 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.media.BluetoothProfileConnectionInfo; import android.os.Handler; import android.os.Looper; import android.os.ParcelUuid; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.InstrumentationRegistry; import androidx.test.filters.MediumTest; Loading @@ -62,7 +63,6 @@ import com.android.bluetooth.btservice.AdapterService; import com.android.bluetooth.btservice.ServiceFactory; import com.android.bluetooth.btservice.storage.DatabaseManager; import com.android.bluetooth.csip.CsipSetCoordinatorService; import com.android.bluetooth.flags.FakeFeatureFlagsImpl; import com.android.bluetooth.flags.Flags; import com.android.bluetooth.hap.HapClientService; import com.android.bluetooth.hfp.HeadsetService; Loading @@ -72,6 +72,7 @@ import com.android.bluetooth.vc.VolumeControlService; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading @@ -97,6 +98,8 @@ public class LeAudioServiceTest { private static final int MAX_LE_AUDIO_CONNECTIONS = 5; private static final int LE_AUDIO_GROUP_ID_INVALID = -1; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private BluetoothAdapter mAdapter; private Context mTargetContext; private LeAudioService mService; Loading @@ -112,7 +115,6 @@ public class LeAudioServiceTest { private boolean onGroupStreamStatusCallbackCalled = false; private boolean onGroupCodecConfChangedCallbackCalled = false; private BluetoothLeAudioCodecStatus testCodecStatus = null; private FakeFeatureFlagsImpl mFakeFlagsImpl; private BroadcastReceiver mLeAudioIntentReceiver; Loading Loading @@ -195,14 +197,6 @@ public class LeAudioServiceTest { LeAudioNativeInterface.setInstance(mNativeInterface); startService(); mFakeFlagsImpl = new FakeFeatureFlagsImpl(); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, false); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_BROADCAST_AUDIO_HANDOVER_POLICIES, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX, false); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, false); mService.setFeatureFlags(mFakeFlagsImpl); mService.mAudioManager = mAudioManager; mService.mMcpService = mMcpService; mService.mTbsService = mTbsService; Loading Loading @@ -811,8 +805,8 @@ public class LeAudioServiceTest { /** Test that authorization info is removed from TBS and MCS after the device is unbond. */ @Test public void testAuthorizationInfoRemovedFromTbsMcsOnUnbondEvents() { mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX, true); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_MCS_TBS_AUTHORIZATION_REBOND_FIX); // Update the device priority so okToConnect() returns true when(mDatabaseManager.getProfileConnectionPolicy(mLeftDevice, BluetoothProfile.LE_AUDIO)) Loading Loading @@ -942,7 +936,7 @@ public class LeAudioServiceTest { @Test public void testAuthorizationInfoRemovedFromTbsMcsOnUnbondEventsWithSynchBlockFixFlag() { mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX, true); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_API_SYNCHRONIZED_BLOCK_FIX); testAuthorizationInfoRemovedFromTbsMcsOnUnbondEvents(); } Loading Loading @@ -1737,8 +1731,8 @@ public class LeAudioServiceTest { @Test public void testMediaContextUnavailableForAWhile() { mFakeFlagsImpl.setFlag(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT, true); mFakeFlagsImpl.setFlag(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION, true); mSetFlagsRule.enableFlags(Flags.FLAG_LEAUDIO_UNICAST_INACTIVATE_DEVICE_BASED_ON_CONTEXT); mSetFlagsRule.enableFlags(Flags.FLAG_AUDIO_ROUTING_CENTRALIZATION); doReturn(true).when(mNativeInterface).connectLeAudio(any(BluetoothDevice.class)); connectTestDevice(mSingleDevice, testGroupId); Loading