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

Commit 0de4adc7 authored by weichinweng's avatar weichinweng Committed by Stanley Tng
Browse files

AudioService: Add Hearing Aid Switch Control

1) Add setBluetoothHearingAidDeviceConnectionState interface to control
suppressNoisyIntent flag.
2) Add check to confirm the previous device is active or not when want
to clean it.

Bug: 112279820
Test: Build Pass, BT off/on when play A2DP, Switch active device
Change-Id: I73f1236d44213c6cf4a2708f3c96144416cfa67d
Merged-In: I73f1236d44213c6cf4a2708f3c96144416cfa67d
parent e7ca4fe6
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -3896,18 +3896,31 @@ public class AudioManager {
    }

     /**
     * Indicate Hearing Aid connection state change.
     * Indicate Hearing Aid connection state change and eventually suppress
     * the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent.
     * @param device Bluetooth device connected/disconnected
     * @param state new connection state (BluetoothProfile.STATE_xxx)
     * @param musicDevice Default get system volume for the connecting device.
     * (either {@link android.bluetooth.BluetoothProfile.hearingaid} or
     * {@link android.bluetooth.BluetoothProfile.HEARING_AID})
     * @param suppressNoisyIntent if true the
     * {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent will not be sent.
     * @return a delay in ms that the caller should wait before broadcasting
     * BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED intent.
     * {@hide}
     */
    public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) {
    public int setBluetoothHearingAidDeviceConnectionState(
                BluetoothDevice device, int state, boolean suppressNoisyIntent,
                int musicDevice) {
        final IAudioService service = getService();
        int delay = 0;
        try {
            service.setHearingAidDeviceConnectionState(device, state);
            delay = service.setBluetoothHearingAidDeviceConnectionState(device,
                state, suppressNoisyIntent, musicDevice);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return delay;
    }

     /**
+3 −2
Original line number Diff line number Diff line
@@ -151,8 +151,6 @@ interface IAudioService {
    void setWiredDeviceConnectionState(int type, int state, String address, String name,
            String caller);

    void setHearingAidDeviceConnectionState(in BluetoothDevice device, int state);

    int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state, int profile);

    void handleBluetoothA2dpDeviceConfigChange(in BluetoothDevice device);
@@ -210,6 +208,9 @@ interface IAudioService {

    oneway void playerHasOpPlayAudio(in int piid, in boolean hasOpPlayAudio);

    int setBluetoothHearingAidDeviceConnectionState(in BluetoothDevice device,
            int state, boolean suppressNoisyIntent, int musicDevice);

    int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(in BluetoothDevice device,
            int state, int profile, boolean suppressNoisyIntent, int a2dpVolume);

+20 −19
Original line number Diff line number Diff line
@@ -4628,15 +4628,6 @@ public class AudioService extends IAudioService.Stub
        }
    }

    @Override
    public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state)
    {
        Log.i(TAG, "setBluetoothHearingAidDeviceConnectionState");

        setBluetoothHearingAidDeviceConnectionState(
                device, state,  false /* suppressNoisyIntent */, AudioSystem.DEVICE_NONE);
    }

    public int setBluetoothHearingAidDeviceConnectionState(
            BluetoothDevice device, int state, boolean suppressNoisyIntent,
            int musicDevice)
@@ -5837,6 +5828,7 @@ public class AudioService extends IAudioService.Stub
                                   address));
        sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, null, 0);
        setCurrentAudioRouteNameIfPossible(name);
    }

    private void onSendBecomingNoisyIntent() {
@@ -5856,7 +5848,7 @@ public class AudioService extends IAudioService.Stub
        mConnectedDevices.remove(
                makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address));
        // Remove A2DP routes as well
        setCurrentAudioRouteName(null);
        setCurrentAudioRouteNameIfPossible(null);
        if (mDockAddress == address) {
            mDockAddress = null;
        }
@@ -5926,6 +5918,7 @@ public class AudioService extends IAudioService.Stub
        sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE,
                            AudioSystem.DEVICE_OUT_HEARING_AID, 0,
                            mStreamStates[AudioSystem.STREAM_MUSIC], 0);
        setCurrentAudioRouteNameIfPossible(name);
    }

    // must be called synchronized on mConnectedDevices
@@ -5935,7 +5928,7 @@ public class AudioService extends IAudioService.Stub
        mConnectedDevices.remove(
                makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID, address));
        // Remove Hearing Aid routes as well
        setCurrentAudioRouteName(null);
        setCurrentAudioRouteNameIfPossible(null);
    }

    // must be called synchronized on mConnectedDevices
@@ -5980,7 +5973,6 @@ public class AudioService extends IAudioService.Stub
                } else {
                    makeA2dpDeviceUnavailableNow(address);
                }
                setCurrentAudioRouteName(null);
            } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
                if (btDevice.isBluetoothDock()) {
                    // this could be a reconnection after a transient disconnection
@@ -6004,7 +5996,6 @@ public class AudioService extends IAudioService.Stub
                }
                makeA2dpDeviceAvailable(address, btDevice.getName(),
                        "onSetA2dpSinkConnectionState");
                setCurrentAudioRouteName(btDevice.getAliasName());
            }
        }
    }
@@ -6056,24 +6047,34 @@ public class AudioService extends IAudioService.Stub

            if (isConnected && state != BluetoothProfile.STATE_CONNECTED) {
                makeHearingAidDeviceUnavailable(address);
                setCurrentAudioRouteName(null);
            } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
                makeHearingAidDeviceAvailable(address, btDevice.getName(),
                        "onSetHearingAidConnectionState");
                setCurrentAudioRouteName(btDevice.getAliasName());
            }
        }
    }

    private void setCurrentAudioRouteName(String name){
    private void setCurrentAudioRouteNameIfPossible(String name) {
        synchronized (mCurAudioRoutes) {
            if (!TextUtils.equals(mCurAudioRoutes.bluetoothName, name)) {
                if (name != null || !isCurrentDeviceConnected()) {
                    mCurAudioRoutes.bluetoothName = name;
                    sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES,
                            SENDMSG_NOOP, 0, 0, null, 0);
                }
            }
        }
    }

    private boolean isCurrentDeviceConnected() {
        for (int i = 0; i < mConnectedDevices.size(); i++) {
            DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
            if (TextUtils.equals(deviceSpec.mDeviceName, mCurAudioRoutes.bluetoothName)) {
                return true;
            }
        }
        return false;
    }

    private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice)
    {