diff options
Diffstat (limited to 'src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java')
-rw-r--r-- | src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java b/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java index 43624a3c3..5fc241446 100644 --- a/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java +++ b/src/com/android/server/telecom/CallAudioCommunicationDeviceTracker.java @@ -24,10 +24,12 @@ import android.telecom.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.server.telecom.bluetooth.BluetoothRouteManager; +import com.android.server.telecom.flags.Flags; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.concurrent.Semaphore; /** * Helper class used to keep track of the requested communication device within Telecom for audio @@ -50,6 +52,7 @@ public class CallAudioCommunicationDeviceTracker { private int mAudioDeviceType = sAUDIO_DEVICE_TYPE_INVALID; // Keep track of the locally requested BT audio device if set private String mBtAudioDevice = null; + private final Semaphore mLock = new Semaphore(1); public CallAudioCommunicationDeviceTracker(Context context) { mAudioManager = context.getSystemService(AudioManager.class); @@ -63,6 +66,10 @@ public class CallAudioCommunicationDeviceTracker { return mAudioDeviceType == audioDeviceType; } + public int getCurrentLocallyRequestedCommunicationDevice() { + return mAudioDeviceType; + } + @VisibleForTesting public void setTestCommunicationDevice(int audioDeviceType) { mAudioDeviceType = audioDeviceType; @@ -90,6 +97,9 @@ public class CallAudioCommunicationDeviceTracker { */ public boolean setCommunicationDevice(int audioDeviceType, BluetoothDevice btDevice) { + if (Flags.communicationDeviceProtectedByLock()) { + mLock.tryAcquire(); + } // There is only one audio device type associated with each type of BT device. boolean isBtDevice = sBT_AUDIO_DEVICE_TYPES.contains(audioDeviceType); Log.i(this, "setCommunicationDevice: type = %s, isBtDevice = %s, btDevice = %s", @@ -149,8 +159,16 @@ public class CallAudioCommunicationDeviceTracker { if (audioDeviceType == AudioDeviceInfo.TYPE_BLE_HEADSET) { mBluetoothRouteManager.onAudioOn(mBtAudioDevice); } + } else if (Flags.communicationDeviceProtectedByLock()) { + // Clear BT device if it's still stored. Handles race condition for when a non-BT + // device is set for communication shortly after a BT (LE) device is set for + // communication but the selection hasn't been cleared yet. + mBtAudioDevice = null; } } + if (Flags.communicationDeviceProtectedByLock()) { + mLock.release(); + } return result; } @@ -160,6 +178,9 @@ public class CallAudioCommunicationDeviceTracker { * @param audioDeviceTypes The supported audio device types for the device. */ public void clearCommunicationDevice(int audioDeviceType) { + if (Flags.communicationDeviceProtectedByLock()) { + mLock.tryAcquire(); + } // There is only one audio device type associated with each type of BT device. boolean isBtDevice = sBT_AUDIO_DEVICE_TYPES.contains(audioDeviceType); Log.i(this, "clearCommunicationDevice: type = %s, isBtDevice = %s", @@ -177,12 +198,6 @@ public class CallAudioCommunicationDeviceTracker { return; } - if (isBtDevice && mBtAudioDevice != null) { - // Signal that BT audio was lost for device. - mBluetoothRouteManager.onAudioLost(mBtAudioDevice); - mBtAudioDevice = null; - } - if (mAudioManager == null) { Log.i(this, "clearCommunicationDevice: mAudioManager is null"); return; @@ -191,6 +206,15 @@ public class CallAudioCommunicationDeviceTracker { // Clear device and reset locally saved device type. mAudioManager.clearCommunicationDevice(); mAudioDeviceType = sAUDIO_DEVICE_TYPE_INVALID; + + if (isBtDevice && mBtAudioDevice != null) { + // Signal that BT audio was lost for device. + mBluetoothRouteManager.onAudioLost(mBtAudioDevice); + mBtAudioDevice = null; + } + if (Flags.communicationDeviceProtectedByLock()) { + mLock.release(); + } } private boolean isUsbHeadsetType(int audioDeviceType, int sourceType) { |