diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index b2774182bfa2e..3024b842c2bef 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -146,6 +146,7 @@ public class LocalMediaManager implements BluetoothCallback { ((BluetoothMediaDevice) device).getCachedDevice(); if (!cachedDevice.isConnected() && !cachedDevice.isBusy()) { mOnTransferBluetoothDevice = connectDevice; + device.setState(MediaDeviceState.STATE_CONNECTING); cachedDevice.connect(); return; } @@ -394,6 +395,7 @@ public class LocalMediaManager implements BluetoothCallback { dispatchDeviceListUpdate(); if (mOnTransferBluetoothDevice != null && mOnTransferBluetoothDevice.isConnected()) { connectDevice(mOnTransferBluetoothDevice); + mOnTransferBluetoothDevice.setState(MediaDeviceState.STATE_CONNECTED); mOnTransferBluetoothDevice = null; } } @@ -539,6 +541,14 @@ public class LocalMediaManager implements BluetoothCallback { @Override public void onDeviceAttributesChanged() { + if (mOnTransferBluetoothDevice != null + && !((BluetoothMediaDevice) mOnTransferBluetoothDevice).getCachedDevice() + .isBusy() + && !mOnTransferBluetoothDevice.isConnected()) { + // Failed to connect + mOnTransferBluetoothDevice.setState(MediaDeviceState.STATE_DISCONNECTED); + mOnTransferBluetoothDevice = null; + } dispatchDeviceAttributesChanged(); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java index d40c45cb78f8c..7ddd64c158765 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java @@ -483,6 +483,26 @@ public class LocalMediaManagerTest { verify(mCallback).onDeviceAttributesChanged(); } + @Test + public void onDeviceAttributesChanged_failingTransferring_shouldResetState() { + final MediaDevice currentDevice = mock(MediaDevice.class); + final MediaDevice device = mock(BluetoothMediaDevice.class); + final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); + mLocalMediaManager.mMediaDevices.add(device); + mLocalMediaManager.mMediaDevices.add(currentDevice); + when(device.getId()).thenReturn(TEST_DEVICE_ID_1); + when(currentDevice.getId()).thenReturn(TEST_CURRENT_DEVICE_ID); + when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice); + when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.isBusy()).thenReturn(false); + + mLocalMediaManager.registerCallback(mCallback); + mLocalMediaManager.connectDevice(device); + + mLocalMediaManager.mDeviceAttributeChangeCallback.onDeviceAttributesChanged(); + verify(device).setState(LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED); + } + @Test public void onRequestFailed_checkDevicesState() { mLocalMediaManager.mMediaDevices.add(mInfoMediaDevice1);