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

Commit f6edd4df authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Switch LE HS when a play command comes from LE HS" am: a68bd181 am:...

Merge "Switch LE HS when a play command comes from LE HS" am: a68bd181 am: 4ffe2ae0 am: d2c0d937 am: 916f8459

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2078780



Change-Id: I72f763a2da110e42b94ea73091b9f33d895bf760
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 31265a08 916f8459
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -937,7 +937,9 @@ public class LeAudioService extends ProfileService {
        }
        }


        if (groupId == currentlyActiveGroupId) {
        if (groupId == currentlyActiveGroupId) {
            Log.w(TAG, "group is already active");
            if (groupId != LE_AUDIO_GROUP_ID_INVALID) {
                Log.w(TAG, "group is already active: device=" + device + ", groupId = " + groupId);
            }
            return;
            return;
        }
        }


+28 −2
Original line number Original line Diff line number Diff line
@@ -43,6 +43,10 @@ import android.os.Looper;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Pair;


import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.hearingaid.HearingAidService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;


import java.nio.ByteBuffer;
import java.nio.ByteBuffer;
@@ -52,6 +56,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.HashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.UUID;


/**
/**
@@ -134,6 +139,8 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
    private MediaState mCurrentMediaState = MediaState.INACTIVE;
    private MediaState mCurrentMediaState = MediaState.INACTIVE;
    private Map<BluetoothDevice, List<GattOpContext>> mPendingGattOperations = new HashMap<>();
    private Map<BluetoothDevice, List<GattOpContext>> mPendingGattOperations = new HashMap<>();
    private McpService mMcpService;
    private McpService mMcpService;
    private LeAudioService mLeAudioService;
    private AdapterService mAdapterService;


    private static class GattOpContext {
    private static class GattOpContext {
        public enum Operation {
        public enum Operation {
@@ -295,7 +302,7 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
                if (VDBG) {
                if (VDBG) {
                    Log.d(TAG, "MEDIA_CONTROL_POINT write request");
                    Log.d(TAG, "MEDIA_CONTROL_POINT write request");
                }
                }
                int status = handleMediaControlPointRequest(value);
                int status = handleMediaControlPointRequest(device, value);
                if (responseNeeded) {
                if (responseNeeded) {
                    mBluetoothGattServer.sendResponse(device, requestId, status, offset, value);
                    mBluetoothGattServer.sendResponse(device, requestId, status, offset, value);
                }
                }
@@ -784,6 +791,8 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
        mCcid = ccid;
        mCcid = ccid;


        mMcpService = mcpService;
        mMcpService = mcpService;
        mAdapterService =  Objects.requireNonNull(AdapterService.getAdapterService(),
                "AdapterService shouldn't be null when creating MediaControlCattService");
    }
    }


    protected boolean init(UUID scvUuid) {
    protected boolean init(UUID scvUuid) {
@@ -836,7 +845,7 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    int handleMediaControlPointRequest(byte[] value) {
    int handleMediaControlPointRequest(BluetoothDevice device, byte[] value) {
        if (DBG) {
        if (DBG) {
            Log.d(TAG, "handleMediaControlPointRequest");
            Log.d(TAG, "handleMediaControlPointRequest");
        }
        }
@@ -880,6 +889,18 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
            Log.d(TAG, "handleMediaControlPointRequest: sending request up");
            Log.d(TAG, "handleMediaControlPointRequest: sending request up");
        }
        }


        if (req.getOpcode() == Request.Opcodes.PLAY) {
            if (mAdapterService.getActiveDevices(BluetoothProfile.A2DP).size() > 0) {
                A2dpService.getA2dpService().setActiveDevice(null);
            }
            if (mAdapterService.getActiveDevices(BluetoothProfile.HEARING_AID).size() > 0) {
                HearingAidService.getHearingAidService().setActiveDevice(null);
            }
            if (mLeAudioService == null) {
                mLeAudioService = LeAudioService.getLeAudioService();
            }
            mLeAudioService.setActiveDevice(device);
        }
        mCallbacks.onMediaControlRequest(req);
        mCallbacks.onMediaControlRequest(req);


        return BluetoothGatt.GATT_SUCCESS;
        return BluetoothGatt.GATT_SUCCESS;
@@ -899,6 +920,11 @@ public class MediaControlGattService implements MediaControlGattServiceInterface
        mBluetoothGattServer = proxy;
        mBluetoothGattServer = proxy;
    }
    }


    @VisibleForTesting
    void setLeAudioServiceForTesting(LeAudioService leAudioService) {
        mLeAudioService = leAudioService;
    }

    private boolean initGattService(UUID serviceUuid) {
    private boolean initGattService(UUID serviceUuid) {
        if (DBG) {
        if (DBG) {
            Log.d(TAG, "initGattService uuid: " + serviceUuid);
            Log.d(TAG, "initGattService uuid: " + serviceUuid);
+16 −2
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.bluetooth.R;
import com.android.bluetooth.R;
import com.android.bluetooth.TestUtils;
import com.android.bluetooth.TestUtils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.le_audio.LeAudioService;


import org.junit.After;
import org.junit.After;
import org.junit.Assert;
import org.junit.Assert;
@@ -71,6 +72,7 @@ public class MediaControlGattServiceTest {
    @Mock private AdapterService mAdapterService;
    @Mock private AdapterService mAdapterService;
    @Mock private MediaControlGattService.BluetoothGattServerProxy mMockGattServer;
    @Mock private MediaControlGattService.BluetoothGattServerProxy mMockGattServer;
    @Mock private McpService mMockMcpService;
    @Mock private McpService mMockMcpService;
    @Mock private LeAudioService mMockLeAudioService;
    @Mock private MediaControlServiceCallbacks mMockMcsCallbacks;
    @Mock private MediaControlServiceCallbacks mMockMcsCallbacks;


    @Captor private ArgumentCaptor<BluetoothGattService> mGattServiceCaptor;
    @Captor private ArgumentCaptor<BluetoothGattService> mGattServiceCaptor;
@@ -92,6 +94,7 @@ public class MediaControlGattServiceTest {
        mMcpService = new MediaControlGattService(mMockMcpService, mMockMcsCallbacks, TEST_CCID);
        mMcpService = new MediaControlGattService(mMockMcpService, mMockMcsCallbacks, TEST_CCID);
        mMcpService.setBluetoothGattServerForTesting(mMockGattServer);
        mMcpService.setBluetoothGattServerForTesting(mMockGattServer);
        mMcpService.setServiceManagerForTesting(mMockMcpService);
        mMcpService.setServiceManagerForTesting(mMockMcpService);
        mMcpService.setLeAudioServiceForTesting(mMockLeAudioService);


        when(mMockMcpService.getDeviceAuthorization(any(BluetoothDevice.class))).thenReturn(
        when(mMockMcpService.getDeviceAuthorization(any(BluetoothDevice.class))).thenReturn(
                BluetoothDevice.ACCESS_ALLOWED);
                BluetoothDevice.ACCESS_ALLOWED);
@@ -103,6 +106,7 @@ public class MediaControlGattServiceTest {
        reset(mMockGattServer);
        reset(mMockGattServer);
        reset(mMockMcpService);
        reset(mMockMcpService);
        reset(mMockMcsCallbacks);
        reset(mMockMcsCallbacks);
        reset(mMockLeAudioService);
        TestUtils.clearAdapterService(mAdapterService);
        TestUtils.clearAdapterService(mAdapterService);
    }
    }


@@ -823,8 +827,8 @@ public class MediaControlGattServiceTest {
            bb.putInt(value);
            bb.putInt(value);
        }
        }


        Assert.assertEquals(
        Assert.assertEquals(expectedGattResult,
                expectedGattResult, mMcpService.handleMediaControlPointRequest(bb.array()));
                mMcpService.handleMediaControlPointRequest(mCurrentDevice, bb.array()));


        if (expectedGattResult == BluetoothGatt.GATT_SUCCESS) {
        if (expectedGattResult == BluetoothGatt.GATT_SUCCESS) {
            // Verify if callback comes to profile
            // Verify if callback comes to profile
@@ -931,6 +935,16 @@ public class MediaControlGattServiceTest {
                mMcpService.isOpcodeSupported(Request.Opcodes.PLAY));
                mMcpService.isOpcodeSupported(Request.Opcodes.PLAY));
    }
    }


    @Test
    public void testMediaControlPointeRequest_OpcodePlayCallLeAudioServiceSetActiveDevice() {
        BluetoothGattService service = initAllFeaturesGattService();
        prepareConnectedDevice();
        mMcpService.updateSupportedOpcodesChar(Request.SupportedOpcodes.PLAY, true);
        verifyMediaControlPointRequest(service, Request.Opcodes.PLAY, null,
                BluetoothGatt.GATT_SUCCESS, 1);
        verify(mMockLeAudioService).setActiveDevice(any(BluetoothDevice.class));
    }

    @Test
    @Test
    public void testPlaybackSpeedWrite() {
    public void testPlaybackSpeedWrite() {
        BluetoothGattService service = initAllFeaturesGattService();
        BluetoothGattService service = initAllFeaturesGattService();