Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 710e0daa authored by William Escande's avatar William Escande Committed by Gerrit Code Review
Browse files

Merge "Trunk Stable/LeAudio: Use static flagging" into main

parents d4358d1b c19c25aa
Loading
Loading
Loading
Loading
+28 −42
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 {
@@ -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);
@@ -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();
@@ -650,7 +641,7 @@ public class LeAudioService extends ProfileService {
                return false;
            }

            if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) {
            if (!Flags.leaudioApiSynchronizedBlockFix()) {
                sm.sendMessage(LeAudioStateMachine.CONNECT);
            }

@@ -658,7 +649,7 @@ public class LeAudioService extends ProfileService {
            groupMutexUnlock(/* isReadOnly */ false);
        }

        if (mFeatureFlags.leaudioApiSynchronizedBlockFix()) {
        if (Flags.leaudioApiSynchronizedBlockFix()) {
            sm.sendMessage(LeAudioStateMachine.CONNECT);
        }

@@ -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);
        }

@@ -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);
            }
@@ -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);
@@ -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);
            }
@@ -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)) {
@@ -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(
@@ -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;
@@ -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);
                }
@@ -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;
    }
@@ -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);
            }
        }
@@ -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);
@@ -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;
        }
@@ -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 */
@@ -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,
@@ -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;
        }
@@ -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);
@@ -3821,7 +3807,7 @@ public class LeAudioService extends ProfileService {
                        || Objects.equals(device, mActiveAudioInDevice)) {
                    handleGroupTransitToInactive(groupId);
                }
                if (!mFeatureFlags.leaudioApiSynchronizedBlockFix()) {
                if (!Flags.leaudioApiSynchronizedBlockFix()) {
                    mGroupDescriptors.remove(groupId);
                }

@@ -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);
@@ -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 {
@@ -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 {
@@ -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 {
+6 −10
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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;
    }
@@ -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);
                }
            }
@@ -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);
+9 −12
Original line number Diff line number Diff line
@@ -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;

@@ -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;
@@ -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;
@@ -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);
@@ -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);
@@ -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);
+10 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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() {
@@ -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
@@ -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);

@@ -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);

@@ -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);

+9 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;

@@ -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;
@@ -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))
@@ -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();
    }
@@ -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