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

Commit c6f4b866 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 10958510 from c2cd75fa to 24Q1-release

Change-Id: Ibbd94329b92b8a81d90576c25c2c8d3a5dab3d10
parents cc621b4f c2cd75fa
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -17,10 +17,12 @@
package com.android.bluetooth.a2dp;

import static android.Manifest.permission.BLUETOOTH_CONNECT;

import static com.android.bluetooth.Utils.checkCallerTargetSdk;
import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission;
import static com.android.bluetooth.Utils.enforceCdmAssociation;
import static com.android.bluetooth.Utils.hasBluetoothPrivilegedPermission;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
@@ -57,6 +59,7 @@ import android.util.Log;

import com.android.bluetooth.BluetoothMetricsProto;
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.Flags;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.MetricsLogger;
@@ -1341,11 +1344,13 @@ public class A2dpService extends ProfileService {
        if (toState == BluetoothProfile.STATE_CONNECTED) {
            MetricsLogger.logProfileConnectionEvent(BluetoothMetricsProto.ProfileId.A2DP);
        }
        if (!Flags.audioRoutingCentralization()) {
            // Set the active device if only one connected device is supported and it was connected
            if (toState == BluetoothProfile.STATE_CONNECTED && (mMaxConnectedAudioDevices == 1)) {
                setActiveDevice(device);
            }
            // When disconnected, ActiveDeviceManager will call setActiveDevice(null)
        }

        // Check if the device is disconnected - if unbond, remove the state machine
        if (toState == BluetoothProfile.STATE_DISCONNECTED) {
+5 −1
Original line number Diff line number Diff line
@@ -263,7 +263,11 @@ public class HeadsetClientService extends ProfileService {
        }
    };

    private static BluetoothHeadsetClientCall toLegacyCall(HfpClientCall call) {
    /**
     * Convert {@code HfpClientCall} to legacy {@code BluetoothHeadsetClientCall} still used by some
     * clients.
     */
    static BluetoothHeadsetClientCall toLegacyCall(HfpClientCall call) {
        if (call == null) return null;
        return new BluetoothHeadsetClientCall(call.getDevice(), call.getId(), call.getUUID(),
                call.getState(), call.getNumber(), call.isMultiParty(), call.isOutgoing(),
+13 −2
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ package com.android.bluetooth.hfpclient;

import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.Manifest.permission.BLUETOOTH_PRIVILEGED;
import static android.content.pm.PackageManager.FEATURE_WATCH;

import static java.util.Objects.requireNonNull;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
@@ -389,7 +392,15 @@ public class HeadsetClientStateMachine extends StateMachine {
        logD("sendCallChangedIntent " + c);
        Intent intent = new Intent(BluetoothHeadsetClient.ACTION_CALL_CHANGED);
        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

        if (mService.getPackageManager().hasSystemFeature(FEATURE_WATCH)) {
            logD("Send legacy call");
            intent.putExtra(
                    BluetoothHeadsetClient.EXTRA_CALL, HeadsetClientService.toLegacyCall(c));
        } else {
            intent.putExtra(BluetoothHeadsetClient.EXTRA_CALL, c);
        }

        Utils.sendBroadcast(mService, intent, BLUETOOTH_CONNECT,
                Utils.getTempAllowlistBroadcastOptions());
        HfpClientConnectionService.onCallChanged(c.getDevice(), c);
@@ -872,7 +883,7 @@ public class HeadsetClientStateMachine extends StateMachine {
    HeadsetClientStateMachine(HeadsetClientService context, HeadsetService headsetService,
                              Looper looper, NativeInterface nativeInterface) {
        super(TAG, looper);
        mService = context;
        mService = requireNonNull(context);
        mNativeInterface = nativeInterface;
        mAudioManager = mService.getAudioManager();
        mHeadsetService = headsetService;
+9 −2
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ public class HapClientStateMachineTest {
    private HapClientStateMachine mHapClientStateMachine;
    private BluetoothDevice mTestDevice;
    private static final int TIMEOUT_MS = 1000;
    boolean mIsAdapterServiceSet;

    @Mock
    private AdapterService mAdapterService;
@@ -70,6 +71,7 @@ public class HapClientStateMachineTest {
        // Set up mocks and test assets
        MockitoAnnotations.initMocks(this);
        TestUtils.setAdapterService(mAdapterService);
        mIsAdapterServiceSet = true;

        mAdapter = BluetoothAdapter.getDefaultAdapter();

@@ -88,8 +90,13 @@ public class HapClientStateMachineTest {

    @After
    public void tearDown() throws Exception {
        if (!mIsAdapterServiceSet) {
            return;
        }
        if (mHapClientStateMachine != null) {
            mHapClientStateMachine.doQuit();
            mHandlerThread.quit();
        }
        TestUtils.clearAdapterService(mAdapterService);
    }

+22 −11
Original line number Diff line number Diff line
@@ -105,6 +105,8 @@ public class HeadsetServiceAndStateMachineTest {
    private HeadsetIntentReceiver mHeadsetIntentReceiver;
    private int mOriginalVrTimeoutMs = 5000;
    private PowerManager.WakeLock mVoiceRecognitionWakeLock;
    boolean mIsAdapterServiceSet;
    boolean mIsHeadsetServiceStarted;

    @Mock private HeadsetNativeInterface mNativeInterface;

@@ -166,6 +168,7 @@ public class HeadsetServiceAndStateMachineTest {
        mVoiceRecognitionWakeLock =
                powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VoiceRecognitionTest");
        TestUtils.setAdapterService(mAdapterService);
        mIsAdapterServiceSet = true;
        doReturn(MAX_HEADSET_CONNECTIONS).when(mAdapterService).getMaxConnectedAudioDevices();
        doReturn(new ParcelUuid[]{BluetoothUuid.HFP}).when(mAdapterService)
                .getRemoteUuids(any(BluetoothDevice.class));
@@ -220,6 +223,7 @@ public class HeadsetServiceAndStateMachineTest {
        mOriginalVrTimeoutMs = HeadsetService.sStartVrTimeoutMs;
        HeadsetService.sStartVrTimeoutMs = START_VR_TIMEOUT_MILLIS;
        TestUtils.startService(mServiceRule, HeadsetService.class);
        mIsHeadsetServiceStarted = true;
        mHeadsetService = HeadsetService.getHeadsetService();
        Assert.assertNotNull(mHeadsetService);
        verify(mObjectsFactory).makeSystemInterface(mHeadsetService);
@@ -238,22 +242,29 @@ public class HeadsetServiceAndStateMachineTest {

    @After
    public void tearDown() throws Exception {
        if (!mIsAdapterServiceSet) {
            return;
        }
        mConnectionStateChangedQueue.clear();
        mActiveDeviceChangedQueue.clear();

        if (mIsHeadsetServiceStarted) {
            mTargetContext.unregisterReceiver(mHeadsetIntentReceiver);
            TestUtils.stopService(mServiceRule, HeadsetService.class);
        HeadsetService.sStartVrTimeoutMs = mOriginalVrTimeoutMs;
        Intents.release();
            mHeadsetService = HeadsetService.getHeadsetService();
            Assert.assertNull(mHeadsetService);
        Method method = HeadsetObjectsFactory.class.getDeclaredMethod("setInstanceForTesting",
                HeadsetObjectsFactory.class);
            // Clear classes that is spied on and has static life time
            clearInvocations(mNativeInterface);
        }
        HeadsetService.sStartVrTimeoutMs = mOriginalVrTimeoutMs;
        Intents.release();
        Method method =
                HeadsetObjectsFactory.class.getDeclaredMethod(
                        "setInstanceForTesting", HeadsetObjectsFactory.class);
        method.setAccessible(true);
        method.invoke(null, (HeadsetObjectsFactory) null);
        TestUtils.clearAdapterService(mAdapterService);
        mBondedDevices.clear();
        mConnectionStateChangedQueue.clear();
        mActiveDeviceChangedQueue.clear();
        // Clear classes that is spied on and has static life time
        clearInvocations(mNativeInterface);
        TestUtils.clearAdapterService(mAdapterService);
    }

    /**
Loading