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

Commit ce928d26 authored by Sungsoo Lim's avatar Sungsoo Lim Committed by Automerger Merge Worker
Browse files

Merge "Refactoring: Audio Routing Handler (Step 9)" into main am: 74e63834

parents 9db3c5d5 74e63834
Loading
Loading
Loading
Loading
+13 −5
Original line number Original line Diff line number Diff line
@@ -60,6 +60,7 @@ import com.android.bluetooth.BluetoothMetricsProto;
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.Utils;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AudioRoutingManager;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.ServiceFactory;
@@ -1479,15 +1480,22 @@ public class A2dpService extends ProfileService {
                SynchronousResultReceiver receiver) {
                SynchronousResultReceiver receiver) {
            try {
            try {
                A2dpService service = getService(source);
                A2dpService service = getService(source);
                boolean result = false;
                if (service != null) {
                if (service != null) {
                    if (service.mFeatureFlags.audioRoutingCentralization()) {
                        ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager())
                                .activateDeviceProfile(device, BluetoothProfile.A2DP, receiver);
                    } else {
                        boolean result;
                        if (device == null) {
                        if (device == null) {
                            result = service.removeActiveDevice(false);
                            result = service.removeActiveDevice(false);
                        } else {
                        } else {
                            result = service.setActiveDevice(device);
                            result = service.setActiveDevice(device);
                        }
                        }
                }
                        receiver.send(result);
                        receiver.send(result);
                    }
                } else {
                    receiver.send(false);
                }
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                receiver.propagateException(e);
                receiver.propagateException(e);
            }
            }
+13 −4
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.bluetooth.btservice;
import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;
import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter;
@@ -46,6 +47,7 @@ import com.android.bluetooth.hearingaid.HearingAidService;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.utils.SynchronousResultReceiver;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
@@ -95,12 +97,19 @@ public class AudioRoutingManager extends ActiveDeviceManager {
     *
     *
     * @param device The device to be activated.
     * @param device The device to be activated.
     * @param profile The profile to be activated
     * @param profile The profile to be activated
     * @param receiver to post the results
     */
     */
    public void activateDeviceProfile(BluetoothDevice device, int profile) {
    public void activateDeviceProfile(
            BluetoothDevice device, int profile, @Nullable SynchronousResultReceiver receiver) {
        mHandler.post(
        mHandler.post(
                () ->
                () -> {
                    boolean result =
                            mHandler.activateDeviceProfile(
                            mHandler.activateDeviceProfile(
                                mHandler.getAudioRoutingDevice(device), profile));
                                    mHandler.getAudioRoutingDevice(device), profile);
                    if (receiver != null) {
                        receiver.send(result);
                    }
                });
    }
    }


    /**
    /**
+22 −6
Original line number Original line Diff line number Diff line
@@ -46,11 +46,13 @@ import com.android.bluetooth.BluetoothMetricsProto;
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.Utils;
import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AudioRoutingManager;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ProfileService.IProfileServiceBinder;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.flags.FeatureFlags;
import com.android.bluetooth.flags.FeatureFlagsImpl;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.modules.utils.SynchronousResultReceiver;
import com.android.modules.utils.SynchronousResultReceiver;


@@ -76,6 +78,7 @@ public class HearingAidService extends ProfileService {
    private static final int MAX_HEARING_AID_STATE_MACHINES = 10;
    private static final int MAX_HEARING_AID_STATE_MACHINES = 10;
    private static HearingAidService sHearingAidService;
    private static HearingAidService sHearingAidService;


    private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
    private AdapterService mAdapterService;
    private AdapterService mAdapterService;
    private DatabaseManager mDatabaseManager;
    private DatabaseManager mDatabaseManager;
    private HandlerThread mStateMachinesThread;
    private HandlerThread mStateMachinesThread;
@@ -724,6 +727,11 @@ public class HearingAidService extends ProfileService {
        sendBroadcast(intent, BLUETOOTH_CONNECT);
        sendBroadcast(intent, BLUETOOTH_CONNECT);
    }
    }


    @VisibleForTesting
    void setFeatureFlags(FeatureFlags featureFlags) {
        mFeatureFlags = featureFlags;
    }

    /* Notifications of audio device disconnection events. */
    /* Notifications of audio device disconnection events. */
    private class AudioManagerOnAudioDevicesRemovedCallback extends AudioDeviceCallback {
    private class AudioManagerOnAudioDevicesRemovedCallback extends AudioDeviceCallback {
        @Override
        @Override
@@ -1059,15 +1067,23 @@ public class HearingAidService extends ProfileService {
                SynchronousResultReceiver receiver) {
                SynchronousResultReceiver receiver) {
            try {
            try {
                HearingAidService service = getService(source);
                HearingAidService service = getService(source);
                boolean result = false;
                if (service != null) {
                if (service != null) {
                    if (service.mFeatureFlags.audioRoutingCentralization()) {
                        ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager())
                                .activateDeviceProfile(
                                        device, BluetoothProfile.HEARING_AID, receiver);
                    } else {
                        boolean result;
                        if (device == null) {
                        if (device == null) {
                            result = service.removeActiveDevice(false);
                            result = service.removeActiveDevice(false);
                        } else {
                        } else {
                            result = service.setActiveDevice(device);
                            result = service.setActiveDevice(device);
                        }
                        }
                }
                        receiver.send(result);
                        receiver.send(result);
                    }
                } else {
                    receiver.send(false);
                }
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                receiver.propagateException(e);
                receiver.propagateException(e);
            }
            }
+12 −3
Original line number Original line Diff line number Diff line
@@ -55,10 +55,13 @@ import com.android.bluetooth.BluetoothStatsLog;
import com.android.bluetooth.Utils;
import com.android.bluetooth.Utils;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AudioRoutingManager;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.btservice.storage.DatabaseManager;
import com.android.bluetooth.flags.FeatureFlags;
import com.android.bluetooth.flags.FeatureFlagsImpl;
import com.android.bluetooth.hfpclient.HeadsetClientService;
import com.android.bluetooth.hfpclient.HeadsetClientService;
import com.android.bluetooth.hfpclient.HeadsetClientStateMachine;
import com.android.bluetooth.hfpclient.HeadsetClientStateMachine;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.bluetooth.le_audio.LeAudioService;
@@ -123,6 +126,7 @@ public class HeadsetService extends ProfileService {
    // Timeout for state machine thread join, to prevent potential ANR.
    // Timeout for state machine thread join, to prevent potential ANR.
    private static final int SM_THREAD_JOIN_TIMEOUT_MS = 1000;
    private static final int SM_THREAD_JOIN_TIMEOUT_MS = 1000;


    private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
    private int mMaxHeadsetConnections = 1;
    private int mMaxHeadsetConnections = 1;
    private BluetoothDevice mActiveDevice;
    private BluetoothDevice mActiveDevice;
    private AdapterService mAdapterService;
    private AdapterService mAdapterService;
@@ -851,11 +855,16 @@ public class HeadsetService extends ProfileService {
                SynchronousResultReceiver receiver) {
                SynchronousResultReceiver receiver) {
            try {
            try {
                HeadsetService service = getService(source);
                HeadsetService service = getService(source);
                boolean defaultValue = false;
                if (service != null) {
                if (service != null) {
                    defaultValue = service.setActiveDevice(device);
                    if (service.mFeatureFlags.audioRoutingCentralization()) {
                        ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager())
                                .activateDeviceProfile(device, BluetoothProfile.HEADSET, receiver);
                    } else {
                        receiver.send(service.setActiveDevice(device));
                    }
                } else {
                    receiver.send(false);
                }
                }
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                receiver.propagateException(e);
                receiver.propagateException(e);
            }
            }
+34 −9
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.bluetooth.IBluetoothLeAudio.LE_AUDIO_GROUP_ID_INVALID;
import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission;
import static com.android.bluetooth.Utils.enforceBluetoothPrivilegedPermission;
import static com.android.modules.utils.build.SdkLevel.isAtLeastU;
import static com.android.modules.utils.build.SdkLevel.isAtLeastU;



import android.annotation.RequiresPermission;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter;
@@ -48,6 +49,7 @@ import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.bluetooth.le.ScanSettings;
import android.content.AttributionSource;
import android.content.AttributionSource;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.media.AudioDeviceCallback;
import android.media.AudioDeviceCallback;
import android.media.AudioDeviceInfo;
import android.media.AudioDeviceInfo;
@@ -67,6 +69,7 @@ import android.util.Pair;
import com.android.bluetooth.Utils;
import com.android.bluetooth.Utils;
import com.android.bluetooth.bass_client.BassClientService;
import com.android.bluetooth.bass_client.BassClientService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.AudioRoutingManager;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.btservice.ServiceFactory;
import com.android.bluetooth.btservice.ServiceFactory;
@@ -131,7 +134,7 @@ public class LeAudioService extends ProfileService {
    private BluetoothDevice mExposedActiveDevice;
    private BluetoothDevice mExposedActiveDevice;
    private LeAudioCodecConfig mLeAudioCodecConfig;
    private LeAudioCodecConfig mLeAudioCodecConfig;
    private final Object mGroupLock = new Object();
    private final Object mGroupLock = new Object();
    private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
    private FeatureFlags mFeatureFlags;
    ServiceFactory mServiceFactory = new ServiceFactory();
    ServiceFactory mServiceFactory = new ServiceFactory();


    LeAudioNativeInterface mLeAudioNativeInterface;
    LeAudioNativeInterface mLeAudioNativeInterface;
@@ -179,6 +182,18 @@ public class LeAudioService extends ProfileService {
    /* When mScanCallback is not null, it means scan is started. */
    /* When mScanCallback is not null, it means scan is started. */
    ScanCallback mScanCallback;
    ScanCallback mScanCallback;


    LeAudioService() {
        mFeatureFlags = new FeatureFlagsImpl();
    }

    @VisibleForTesting
    LeAudioService(Context ctx, LeAudioNativeInterface nativeInterface, FeatureFlags featureFlags) {
        attachBaseContext(ctx);
        mLeAudioNativeInterface = nativeInterface;
        mFeatureFlags = featureFlags;
        onCreate();
    }

    private class LeAudioGroupDescriptor {
    private class LeAudioGroupDescriptor {
        LeAudioGroupDescriptor(boolean isInbandRingtonEnabled) {
        LeAudioGroupDescriptor(boolean isInbandRingtonEnabled) {
            mIsConnected = false;
            mIsConnected = false;
@@ -293,8 +308,12 @@ public class LeAudioService extends ProfileService {


        mAdapterService = Objects.requireNonNull(AdapterService.getAdapterService(),
        mAdapterService = Objects.requireNonNull(AdapterService.getAdapterService(),
                "AdapterService cannot be null when LeAudioService starts");
                "AdapterService cannot be null when LeAudioService starts");
        mLeAudioNativeInterface = Objects.requireNonNull(LeAudioNativeInterface.getInstance(),
        if (mLeAudioNativeInterface == null) {
            mLeAudioNativeInterface =
                    Objects.requireNonNull(
                            LeAudioNativeInterface.getInstance(),
                            "LeAudioNativeInterface cannot be null when LeAudioService starts");
                            "LeAudioNativeInterface cannot be null when LeAudioService starts");
        }
        mDatabaseManager = Objects.requireNonNull(mAdapterService.getDatabase(),
        mDatabaseManager = Objects.requireNonNull(mAdapterService.getDatabase(),
                "DatabaseManager cannot be null when LeAudioService starts");
                "DatabaseManager cannot be null when LeAudioService starts");


@@ -3882,17 +3901,23 @@ public class LeAudioService extends ProfileService {
            try {
            try {
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");

                LeAudioService service = getService(source);
                LeAudioService service = getService(source);
                boolean result = false;
                if (service != null) {
                if (service != null) {
                    if (service.mFeatureFlags.audioRoutingCentralization()) {
                        ((AudioRoutingManager) service.mAdapterService.getActiveDeviceManager())
                                .activateDeviceProfile(device, BluetoothProfile.LE_AUDIO, receiver);
                    } else {
                        boolean result;
                        if (device == null) {
                        if (device == null) {
                            result = service.removeActiveDevice(true);
                            result = service.removeActiveDevice(true);
                        } else {
                        } else {
                            result = service.setActiveDevice(device);
                            result = service.setActiveDevice(device);
                        }
                        }
                }
                        receiver.send(result);
                        receiver.send(result);
                    }
                } else {
                    receiver.send(false);
                }
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                receiver.propagateException(e);
                receiver.propagateException(e);
            }
            }
Loading