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

Commit 7847211f authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioManager: restore setBluetoothA2dpOn() method

Remove deprecation on setBluetoothA2dpOn() method so that applications
can override the default audio policy which is to use A2DP
for media whenever connected.

The request is not persistent and the default policy is restored when a
new A2DP i ro wired headset connection occurs.

Bug 6485897.

Change-Id: I2a4b6b6bdba55f7b133e64f86d27c03eb86acfa4
parent 662e4a45
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -1270,25 +1270,42 @@ public class AudioManager {
    }

    /**
     * @param on set <var>true</var> to route A2DP audio to/from Bluetooth
     *           headset; <var>false</var> disable A2DP audio
     * Allow or disallow use of Bluetooth A2DP for media.
     * <p>The default behavior of the system is to use A2DP for media playback whenever an A2DP sink
     * is connected. Applications can use this method to override this behavior.
     * Note that the request will not persist after a wired headset or an A2DP sink is connected or
     * disconnected:
     * - Connection of an A2DP sink automatically enables use of A2DP.
     * - Connection of a wired headset automatically disables use of A2DP.
     * - Disconnection of a wired headset automatically enables use of A2DP if an A2DP sink is
     * connected.
     * <p>Requires Permission:
     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
     * @param on set <var>true</var> to allow use of A2DP for media (default).
     *               <var>false</var> to disallow use of A2DP for media.
     * @deprecated Do not use.
     */
    @Deprecated public void setBluetoothA2dpOn(boolean on){
        IAudioService service = getService();
        try {
            service.setBluetoothA2dpOn(on);
        } catch (RemoteException e) {
            Log.e(TAG, "Dead object in setBluetoothA2dpOn", e);
        }
    }

    /**
     * Checks whether A2DP audio routing to the Bluetooth headset is on or off.
     * Checks whether use of A2DP sinks is enabled for media.
     *
     * @return true if A2DP audio is being routed to/from Bluetooth headset;
     *         false if otherwise
     * @return true if use of A2DP is enabled for media, false otherwise.
     */
    public boolean isBluetoothA2dpOn() {
        if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP,"")
            == AudioSystem.DEVICE_STATE_UNAVAILABLE) {
        IAudioService service = getService();
        try {
            return service.isBluetoothA2dpOn();
        } catch (RemoteException e) {
            Log.e(TAG, "Dead object in isBluetoothA2dpOn", e);
            return false;
        } else {
            return true;
        }
    }

+48 −0
Original line number Diff line number Diff line
@@ -392,6 +392,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished {

    private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED;

    // Request to override default use of A2DP for media.
    private boolean mBluetoothA2dpEnabled;
    private final Object mBluetoothA2dpEnabledLock = new Object();

    ///////////////////////////////////////////////////////////////////////////
    // Construction
    ///////////////////////////////////////////////////////////////////////////
@@ -481,6 +485,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {

        mMasterVolumeRamp = context.getResources().getIntArray(
                com.android.internal.R.array.config_masterVolumeRamp);

    }

    private void createAudioSystemThread() {
@@ -1651,6 +1656,21 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
        return (mForcedUseForComm == AudioSystem.FORCE_BT_SCO);
    }

    /** @see AudioManager#setBluetoothA2dpOn() */
    public void setBluetoothA2dpOn(boolean on) {
        if (!checkAudioSettingsPermission("setBluetoothA2dpOn()")) {
            return;
        }
        setBluetoothA2dpOnInt(on);
    }

    /** @see AudioManager#isBluetoothA2dpOn() */
    public boolean isBluetoothA2dpOn() {
        synchronized (mBluetoothA2dpEnabledLock) {
            return mBluetoothA2dpEnabled;
        }
    }

    /** @see AudioManager#startBluetoothSco() */
    public void startBluetoothSco(IBinder cb){
        if (!checkAudioSettingsPermission("startBluetoothSco()") ||
@@ -1673,6 +1693,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
        }
    }


    private class ScoClient implements IBinder.DeathRecipient {
        private IBinder mCb; // To be notified of client's death
        private int mCreatorPid;
@@ -2894,6 +2915,11 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
                        setOrientationForAudioSystem();
                    }

                    synchronized (mBluetoothA2dpEnabledLock) {
                        AudioSystem.setForceUse(AudioSystem.FOR_MEDIA,
                                mBluetoothA2dpEnabled ?
                                        AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
                    }
                    // indicate the end of reconfiguration phase to audio HAL
                    AudioSystem.setParameters("restarting=false");
                    break;
@@ -2976,6 +3002,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {

    // must be called synchronized on mConnectedDevices
    private void makeA2dpDeviceAvailable(String address) {
        // enable A2DP before notifying A2DP connection to avoid unecessary processing in
        // audio policy manager
        setBluetoothA2dpOnInt(true);
        AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
                AudioSystem.DEVICE_STATE_AVAILABLE,
                address);
@@ -3177,7 +3206,15 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
                } else {
                    device = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
                }
                // enable A2DP before notifying headset disconnection to avoid glitches
                if (state == 0) {
                    setBluetoothA2dpOnInt(true);
                }
                handleDeviceConnection((state == 1), device, "");
                // disable A2DP after notifying headset connection to avoid glitches
                if (state != 0) {
                    setBluetoothA2dpOnInt(false);
                }
            } else if (action.equals(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG)) {
                state = intent.getIntExtra("state", 0);
                Log.v(TAG, "Broadcast Receiver: Got ACTION_ANALOG_AUDIO_DOCK_PLUG, state = "+state);
@@ -4655,6 +4692,17 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
    }


    // Handles request to override default use of A2DP for media.
    public void setBluetoothA2dpOnInt(boolean on) {
        synchronized (mBluetoothA2dpEnabledLock) {
            mBluetoothA2dpEnabled = on;
            sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE,
                    AudioSystem.FOR_MEDIA,
                    mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP,
                    null, 0);
        }
    }

    @Override
    public void setRingtonePlayer(IRingtonePlayer player) {
        mContext.enforceCallingOrSelfPermission(REMOTE_AUDIO_PLAYBACK, null);
+2 −1
Original line number Diff line number Diff line
@@ -318,7 +318,8 @@ public class AudioSystem
    public static final int FORCE_BT_DESK_DOCK = 7;
    public static final int FORCE_ANALOG_DOCK = 8;
    public static final int FORCE_DIGITAL_DOCK = 9;
    private static final int NUM_FORCE_CONFIG = 10;
    public static final int FORCE_NO_BT_A2DP = 10;
    private static final int NUM_FORCE_CONFIG = 11;
    public static final int FORCE_DEFAULT = FORCE_NONE;

    // usage for setForceUse, must match AudioSystem::force_use
+4 −0
Original line number Diff line number Diff line
@@ -96,6 +96,10 @@ interface IAudioService {

    boolean isBluetoothScoOn();

    oneway void setBluetoothA2dpOn(boolean on);

    boolean isBluetoothA2dpOn();

    int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb, IAudioFocusDispatcher l,
            String clientId, String callingPackageName);