diff --git a/packages/SettingsLib/res/drawable/ic_smartphone.xml b/packages/SettingsLib/res/drawable/ic_smartphone.xml new file mode 100644 index 0000000000000..84a96da95fb10 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_smartphone.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 2a83edb03d1a1..bf97d772bb0bf 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1153,6 +1153,6 @@ - - Phone speaker + + This device diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java index 6d0e3ac4b19cd..3092b9960c7ed 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java @@ -16,6 +16,7 @@ package com.android.settingslib.media; import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; import android.content.Context; import android.util.Log; @@ -41,6 +42,11 @@ public class BluetoothMediaDevice extends MediaDevice { return mCachedDevice.getName(); } + @Override + public String getSummary() { + return mCachedDevice.getConnectionSummary(); + } + @Override public int getIcon() { //TODO(b/117129183): This is not final icon for bluetooth device, just for demo. @@ -86,4 +92,10 @@ public class BluetoothMediaDevice extends MediaDevice { } return false; } + + @Override + public boolean isConnected() { + return mCachedDevice.getBondState() == BluetoothDevice.BOND_BONDED + && mCachedDevice.isConnected(); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaManager.java index fa2dd887bd3d1..3a738d23f4521 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaManager.java @@ -41,6 +41,9 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall private static final String TAG = "BluetoothMediaManager"; + private final DeviceAttributeChangeCallback mDeviceAttributeChangeCallback = + new DeviceAttributeChangeCallback(); + private LocalBluetoothManager mLocalBluetoothManager; private LocalBluetoothProfileManager mProfileManager; private CachedBluetoothDeviceManager mCachedBluetoothDeviceManager; @@ -65,7 +68,10 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall mLocalBluetoothManager.getEventManager().registerCallback(this); buildBluetoothDeviceList(); dispatchDeviceListAdded(); + addServiceListenerIfNecessary(); + } + private void addServiceListenerIfNecessary() { // The profile may not ready when calling startScan(). // Device status are all disconnected since profiles are not ready to connected. // In this case, we observe onServiceConnected() in LocalBluetoothProfileManager. @@ -78,18 +84,18 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall private void buildBluetoothDeviceList() { mMediaDevices.clear(); - addConnectedA2dpDevices(); - addConnectedHearingAidDevices(); + addConnectableA2dpDevices(); + addConnectableHearingAidDevices(); } - private void addConnectedA2dpDevices() { + private void addConnectableA2dpDevices() { final A2dpProfile a2dpProfile = mProfileManager.getA2dpProfile(); if (a2dpProfile == null) { - Log.w(TAG, "addConnectedA2dpDevices() a2dp profile is null!"); + Log.w(TAG, "addConnectableA2dpDevices() a2dp profile is null!"); return; } - final List devices = a2dpProfile.getConnectedDevices(); + final List devices = a2dpProfile.getConnectableDevices(); for (BluetoothDevice device : devices) { final CachedBluetoothDevice cachedDevice = @@ -100,10 +106,12 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall continue; } - Log.d(TAG, "addConnectedA2dpDevices() device : " + cachedDevice.getName() - + ", is connected : " + cachedDevice.isConnected()); + Log.d(TAG, "addConnectableA2dpDevices() device : " + cachedDevice.getName() + + ", is connected : " + cachedDevice.isConnected() + + ", is preferred : " + a2dpProfile.isPreferred(device)); - if (cachedDevice.isConnected()) { + if (a2dpProfile.isPreferred(device) + && BluetoothDevice.BOND_BONDED == cachedDevice.getBondState()) { addMediaDevice(cachedDevice); } } @@ -111,15 +119,15 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall mIsA2dpProfileReady = a2dpProfile.isProfileReady(); } - private void addConnectedHearingAidDevices() { + private void addConnectableHearingAidDevices() { final HearingAidProfile hapProfile = mProfileManager.getHearingAidProfile(); if (hapProfile == null) { - Log.w(TAG, "addConnectedA2dpDevices() hap profile is null!"); + Log.w(TAG, "addConnectableHearingAidDevices() hap profile is null!"); return; } final List devicesHiSyncIds = new ArrayList<>(); - final List devices = hapProfile.getConnectedDevices(); + final List devices = hapProfile.getConnectableDevices(); for (BluetoothDevice device : devices) { final CachedBluetoothDevice cachedDevice = @@ -130,13 +138,16 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall continue; } - Log.d(TAG, "addConnectedHearingAidDevices() device : " + cachedDevice.getName() - + ", is connected : " + cachedDevice.isConnected()); + Log.d(TAG, "addConnectableHearingAidDevices() device : " + cachedDevice.getName() + + ", is connected : " + cachedDevice.isConnected() + + ", is preferred : " + hapProfile.isPreferred(device)); + final long hiSyncId = hapProfile.getHiSyncId(device); // device with same hiSyncId should not be shown in the UI. // So do not add it into connectedDevices. - if (!devicesHiSyncIds.contains(hiSyncId) && cachedDevice.isConnected()) { + if (!devicesHiSyncIds.contains(hiSyncId) && hapProfile.isPreferred(device) + && BluetoothDevice.BOND_BONDED == cachedDevice.getBondState()) { devicesHiSyncIds.add(hiSyncId); addMediaDevice(cachedDevice); } @@ -149,6 +160,7 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall MediaDevice mediaDevice = findMediaDevice(MediaDeviceUtils.getId(cachedDevice)); if (mediaDevice == null) { mediaDevice = new BluetoothMediaDevice(mContext, cachedDevice); + cachedDevice.registerCallback(mDeviceAttributeChangeCallback); mLastAddedDevice = mediaDevice; mMediaDevices.add(mediaDevice); } @@ -157,6 +169,14 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall @Override public void stopScan() { mLocalBluetoothManager.getEventManager().unregisterCallback(this); + unregisterDeviceAttributeChangeCallback(); + } + + private void unregisterDeviceAttributeChangeCallback() { + for (MediaDevice device : mMediaDevices) { + ((BluetoothMediaDevice) device).getCachedDevice() + .unregisterCallback(mDeviceAttributeChangeCallback); + } } @Override @@ -164,12 +184,13 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall if (BluetoothAdapter.STATE_ON == bluetoothState) { buildBluetoothDeviceList(); dispatchDeviceListAdded(); + addServiceListenerIfNecessary(); } else if (BluetoothAdapter.STATE_OFF == bluetoothState) { final List removeDevicesList = new ArrayList<>(); for (MediaDevice device : mMediaDevices) { - if (device instanceof BluetoothMediaDevice) { - removeDevicesList.add(device); - } + ((BluetoothMediaDevice) device).getCachedDevice() + .unregisterCallback(mDeviceAttributeChangeCallback); + removeDevicesList.add(device); } mMediaDevices.removeAll(removeDevicesList); dispatchDeviceListRemoved(removeDevicesList); @@ -212,6 +233,7 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall private void removeMediaDevice(CachedBluetoothDevice cachedDevice) { final MediaDevice mediaDevice = findMediaDevice(MediaDeviceUtils.getId(cachedDevice)); if (mediaDevice != null) { + cachedDevice.unregisterCallback(mDeviceAttributeChangeCallback); mLastRemovedDevice = mediaDevice; mMediaDevices.remove(mediaDevice); } @@ -230,12 +252,17 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall Log.d(TAG, "onProfileConnectionStateChanged() device: " + cachedDevice + ", state: " + state + ", bluetoothProfile: " + bluetoothProfile); - if (isCachedDeviceConnected(cachedDevice)) { - addMediaDevice(cachedDevice); - dispatchDeviceAdded(cachedDevice); - } else { + updateMediaDeviceListIfNecessary(cachedDevice); + } + + private void updateMediaDeviceListIfNecessary(CachedBluetoothDevice cachedDevice) { + if (BluetoothDevice.BOND_NONE == cachedDevice.getBondState()) { removeMediaDevice(cachedDevice); dispatchDeviceRemoved(cachedDevice); + } else { + if (findMediaDevice(MediaDeviceUtils.getId(cachedDevice)) != null) { + dispatchDataChanged(); + } } } @@ -243,13 +270,7 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall public void onAclConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { Log.d(TAG, "onAclConnectionStateChanged() device: " + cachedDevice + ", state: " + state); - if (isCachedDeviceConnected(cachedDevice)) { - addMediaDevice(cachedDevice); - dispatchDeviceAdded(cachedDevice); - } else { - removeMediaDevice(cachedDevice); - dispatchDeviceRemoved(cachedDevice); - } + updateMediaDeviceListIfNecessary(cachedDevice); } @Override @@ -281,4 +302,16 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall public void onServiceDisconnected() { } + + /** + * This callback is for update {@link BluetoothMediaDevice} summary when + * {@link CachedBluetoothDevice} connection state is changed. + */ + private class DeviceAttributeChangeCallback implements CachedBluetoothDevice.Callback { + + @Override + public void onDeviceAttributesChanged() { + dispatchDataChanged(); + } + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index 99d9d1c71e0e7..95f3d3d0f7693 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -40,6 +40,11 @@ public class InfoMediaDevice extends MediaDevice { return mRouteInfo.getName(); } + @Override + public String getSummary() { + return null; + } + @Override public int getIcon() { //TODO(b/121083246): This is not final icon for cast device, just for demo. @@ -63,4 +68,9 @@ public class InfoMediaDevice extends MediaDevice { public void disconnect() { //TODO(b/121083246): disconnected last select device } + + @Override + public boolean isConnected() { + return true; + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index 44d945a9ee0e2..4e16c66d736ba 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -58,7 +58,6 @@ public class LocalMediaManager implements BluetoothCallback { private Context mContext; private BluetoothMediaManager mBluetoothMediaManager; - private InfoMediaManager mInfoMediaManager; private LocalBluetoothManager mLocalBluetoothManager; @VisibleForTesting @@ -97,7 +96,6 @@ public class LocalMediaManager implements BluetoothCallback { mBluetoothMediaManager = new BluetoothMediaManager(context, mLocalBluetoothManager, notification); - mInfoMediaManager = new InfoMediaManager(context, packageName, notification); } @VisibleForTesting @@ -106,7 +104,6 @@ public class LocalMediaManager implements BluetoothCallback { mContext = context; mLocalBluetoothManager = localBluetoothManager; mBluetoothMediaManager = bluetoothMediaManager; - mInfoMediaManager = infoMediaManager; } /** @@ -115,6 +112,15 @@ public class LocalMediaManager implements BluetoothCallback { */ public void connectDevice(MediaDevice connectDevice) { final MediaDevice device = getMediaDeviceById(mMediaDevices, connectDevice.getId()); + if (device instanceof BluetoothMediaDevice) { + final CachedBluetoothDevice cachedDevice = + ((BluetoothMediaDevice) device).getCachedDevice(); + if (!cachedDevice.isConnected() && !cachedDevice.isBusy()) { + cachedDevice.connect(true); + return; + } + } + if (device == mCurrentConnectedDevice) { Log.d(TAG, "connectDevice() this device all ready connected! : " + device.getName()); return; @@ -150,9 +156,7 @@ public class LocalMediaManager implements BluetoothCallback { public void startScan() { mMediaDevices.clear(); mBluetoothMediaManager.registerCallback(mMediaDeviceCallback); - mInfoMediaManager.registerCallback(mMediaDeviceCallback); mBluetoothMediaManager.startScan(); - mInfoMediaManager.startScan(); } private void addPhoneDeviceIfNecessary() { @@ -186,9 +190,7 @@ public class LocalMediaManager implements BluetoothCallback { */ public void stopScan() { mBluetoothMediaManager.unregisterCallback(mMediaDeviceCallback); - mInfoMediaManager.unregisterCallback(mMediaDeviceCallback); mBluetoothMediaManager.stopScan(); - mInfoMediaManager.stopScan(); } /** @@ -252,9 +254,17 @@ public class LocalMediaManager implements BluetoothCallback { } addPhoneDeviceIfNecessary(); mCurrentConnectedDevice = updateCurrentConnectedDevice(); + updatePhoneMediaDeviceSummary(); dispatchDeviceListUpdate(); } + private void updatePhoneMediaDeviceSummary() { + if (mPhoneDevice != null) { + ((PhoneMediaDevice) mPhoneDevice) + .updateSummary(mCurrentConnectedDevice == mPhoneDevice); + } + } + @Override public void onDeviceRemoved(MediaDevice device) { if (mMediaDevices.contains(device)) { @@ -271,22 +281,23 @@ public class LocalMediaManager implements BluetoothCallback { dispatchDeviceListUpdate(); } - @Override - public void onDeviceAttributesChanged() { - dispatchDeviceListUpdate(); - } - @Override public void onConnectedDeviceChanged(String id) { final MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id); if (connectDevice == mCurrentConnectedDevice) { - Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected! : " - + connectDevice.getName()); + Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected!"); return; } mCurrentConnectedDevice = connectDevice; + updatePhoneMediaDeviceSummary(); + dispatchDeviceListUpdate(); + } + @Override + public void onDeviceAttributesChanged() { + addPhoneDeviceIfNecessary(); + removePhoneMediaDeviceIfNecessary(); dispatchDeviceListUpdate(); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index f35c30edd16af..9b9e80310c18d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -34,9 +34,9 @@ public abstract class MediaDevice implements Comparable { MediaDeviceType.TYPE_BLUETOOTH_DEVICE, MediaDeviceType.TYPE_PHONE_DEVICE}) public @interface MediaDeviceType { - int TYPE_CAST_DEVICE = 1; - int TYPE_BLUETOOTH_DEVICE = 2; - int TYPE_PHONE_DEVICE = 3; + int TYPE_PHONE_DEVICE = 1; + int TYPE_CAST_DEVICE = 2; + int TYPE_BLUETOOTH_DEVICE = 3; } private int mConnectedRecord; @@ -62,6 +62,13 @@ public abstract class MediaDevice implements Comparable { */ public abstract String getName(); + /** + * Get summary from MediaDevice. + * + * @return summary of MediaDevice. + */ + public abstract String getSummary(); + /** * Get resource id of MediaDevice. * @@ -93,6 +100,13 @@ public abstract class MediaDevice implements Comparable { */ public abstract void disconnect(); + /** + * According the MediaDevice type to check whether we are connected to this MediaDevice. + * + * @return Whether it is connected. + */ + public abstract boolean isConnected(); + /** * Rules: * 1. If there is one of the connected devices identified as a carkit, this carkit will @@ -103,9 +117,11 @@ public abstract class MediaDevice implements Comparable { * 3. For devices with usage record. * The most recent used one + device group with usage info sorted by how many times the * device has been used. + * 4. Phone device always in the top and the connected Bluetooth devices, cast devices and + * phone device will be always above on the disconnect Bluetooth devices. * - * So the device list will look like 4 slots ranked as below. - * Rule 1 + the most recently used device + Rule 3 + Rule 2 + * So the device list will look like 5 slots ranked as below. + * Rule 4 + Rule 1 + the most recently used device + Rule 3 + Rule 2 * Any slot could be empty. And available device will belong to one of the slots. * * @return a negative integer, zero, or a positive integer @@ -113,6 +129,21 @@ public abstract class MediaDevice implements Comparable { */ @Override public int compareTo(MediaDevice another) { + // Check Bluetooth device is have same connection state + if (isConnected() ^ another.isConnected()) { + if (isConnected()) { + return -1; + } else { + return 1; + } + } + + // Phone device always in the top. + if (mType == MediaDeviceType.TYPE_PHONE_DEVICE) { + return -1; + } else if (another.mType == MediaDeviceType.TYPE_PHONE_DEVICE) { + return 1; + } // Check carkit if (isCarKitDevice()) { return -1; @@ -138,7 +169,7 @@ public abstract class MediaDevice implements Comparable { final String s2 = another.getName(); return s1.compareToIgnoreCase(s2); } - // Both devices have never been used, the priority is Cast > Bluetooth > Phone + // Both devices have never been used, the priority is Phone > Cast > Bluetooth return mType - another.mType; } @@ -149,4 +180,13 @@ public abstract class MediaDevice implements Comparable { protected boolean isCarKitDevice() { return false; } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof MediaDevice)) { + return false; + } + final MediaDevice otherDevice = (MediaDevice) obj; + return otherDevice.getId().equals(getId()); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java index 2c3a96cafa562..7898982bccbc8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java @@ -117,6 +117,14 @@ public abstract class MediaManager { } } + protected void dispatchDataChanged() { + synchronized (mCallbacks) { + for (MediaDeviceCallback callback : mCallbacks) { + callback.onDeviceAttributesChanged(); + } + } + } + /** * Callback for notifying device is added, removed and attributes changed. */ @@ -149,16 +157,17 @@ public abstract class MediaManager { */ void onDeviceListRemoved(List devices); - /** - * Callback for notifying MediaDevice attributes is changed. - */ - void onDeviceAttributesChanged(); - /** * Callback for notifying connected MediaDevice is changed. * * @param id the id of MediaDevice */ void onConnectedDeviceChanged(String id); + + /** + * Callback for notifying that MediaDevice attributes + * (e.g: device name, connection state, subtitle) is changed. + */ + void onDeviceAttributesChanged(); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index 8ec2a7f90f66f..da140aa9371ec 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -18,6 +18,7 @@ package com.android.settingslib.media; import android.content.Context; import android.util.Log; +import com.android.settingslib.R; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -34,6 +35,7 @@ public class PhoneMediaDevice extends MediaDevice { private LocalBluetoothProfileManager mProfileManager; private LocalBluetoothManager mLocalBluetoothManager; + private String mSummary = ""; PhoneMediaDevice(Context context, LocalBluetoothManager localBluetoothManager) { super(context, MediaDeviceType.TYPE_PHONE_DEVICE); @@ -45,14 +47,17 @@ public class PhoneMediaDevice extends MediaDevice { @Override public String getName() { - return mContext - .getString(com.android.settingslib.R.string.media_transfer_phone_device_name); + return mContext.getString(R.string.media_transfer_this_device_name); + } + + @Override + public String getSummary() { + return mSummary; } @Override public int getIcon() { - //TODO(b/117129183): This is not final icon for phone device, just for demo. - return com.android.internal.R.drawable.ic_phone; + return R.drawable.ic_smartphone; } @Override @@ -69,6 +74,7 @@ public class PhoneMediaDevice extends MediaDevice { if (hapProfile != null && a2dpProfile != null) { isConnected = hapProfile.setActiveDevice(null) && a2dpProfile.setActiveDevice(null); + updateSummary(true); setConnectedRecord(); } Log.d(TAG, "connect() device : " + getName() + ", is selected : " + isConnected); @@ -77,6 +83,20 @@ public class PhoneMediaDevice extends MediaDevice { @Override public void disconnect() { - //TODO(b/117129183): disconnected last select device + updateSummary(false); + } + + @Override + public boolean isConnected() { + return true; + } + + /** + * According current active device is {@link PhoneMediaDevice} or not to update summary. + */ + public void updateSummary(boolean isActive) { + mSummary = isActive + ? mContext.getString(R.string.bluetooth_active_no_battery_level) + : ""; } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java index e5d1b18177263..e0e2fd6860ffc 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaDeviceTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; @@ -66,4 +67,20 @@ public class BluetoothMediaDeviceTest { assertThat(mBluetoothMediaDevice.connect()).isFalse(); } + + @Test + public void isCachedBluetoothDeviceConnected_deviceConnected_returnTrue() { + when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice.isConnected()).thenReturn(true); + + assertThat(mBluetoothMediaDevice.isConnected()).isTrue(); + } + + @Test + public void isCachedBluetoothDeviceConnected_deviceNotConnected_returnFalse() { + when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice.isConnected()).thenReturn(false); + + assertThat(mBluetoothMediaDevice.isConnected()).isFalse(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaManagerTest.java index a20e22bb4f26a..48449f20699d5 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/BluetoothMediaManagerTest.java @@ -87,15 +87,16 @@ public class BluetoothMediaManagerTest { } @Test - public void startScan_haveA2dpProfileConnectedBluetoothDevice_shouldAddDevice() { + public void startScan_haveA2dpProfileDeviceIsPreferredAndBonded_shouldAddDevice() { final List devices = new ArrayList<>(); final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); devices.add(bluetoothDevice); - when(mA2dpProfile.getConnectedDevices()).thenReturn(devices); + when(mA2dpProfile.getConnectableDevices()).thenReturn(devices); when(mCachedDeviceManager.findDevice(bluetoothDevice)).thenReturn(cachedDevice); - when(cachedDevice.isConnected()).thenReturn(true); + when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mA2dpProfile.isPreferred(bluetoothDevice)).thenReturn(true); assertThat(mMediaManager.mMediaDevices).isEmpty(); mMediaManager.startScan(); @@ -103,15 +104,16 @@ public class BluetoothMediaManagerTest { } @Test - public void startScan_haveA2dpProfileDisconnectedBluetoothDevice_shouldNotAddDevice() { + public void startScan_haveA2dpProfileDeviceIsPreferredAndBondNone_shouldNotAddDevice() { final List devices = new ArrayList<>(); final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); devices.add(bluetoothDevice); - when(mA2dpProfile.getConnectedDevices()).thenReturn(devices); + when(mA2dpProfile.getConnectableDevices()).thenReturn(devices); when(mCachedDeviceManager.findDevice(bluetoothDevice)).thenReturn(cachedDevice); - when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + when(mA2dpProfile.isPreferred(bluetoothDevice)).thenReturn(true); assertThat(mMediaManager.mMediaDevices).isEmpty(); mMediaManager.startScan(); @@ -122,7 +124,7 @@ public class BluetoothMediaManagerTest { public void startScan_noA2dpProfileBluetoothDevice_shouldNotAddDevice() { final List devices = new ArrayList<>(); - when(mA2dpProfile.getConnectedDevices()).thenReturn(devices); + when(mA2dpProfile.getConnectableDevices()).thenReturn(devices); assertThat(mMediaManager.mMediaDevices).isEmpty(); mMediaManager.startScan(); @@ -130,15 +132,16 @@ public class BluetoothMediaManagerTest { } @Test - public void startScan_haveHapProfileConnectedBluetoothDevice_shouldAddDevice() { + public void startScan_haveHapProfileDeviceIsPreferredAndBonded_shouldAddDevice() { final List devices = new ArrayList<>(); final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); devices.add(bluetoothDevice); - when(mHapProfile.getConnectedDevices()).thenReturn(devices); + when(mHapProfile.getConnectableDevices()).thenReturn(devices); when(mCachedDeviceManager.findDevice(bluetoothDevice)).thenReturn(cachedDevice); - when(cachedDevice.isConnected()).thenReturn(true); + when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mHapProfile.isPreferred(bluetoothDevice)).thenReturn(true); assertThat(mMediaManager.mMediaDevices).isEmpty(); mMediaManager.startScan(); @@ -149,7 +152,7 @@ public class BluetoothMediaManagerTest { public void startScan_noHapProfileBluetoothDevice_shouldNotAddDevice() { final List devices = new ArrayList<>(); - when(mHapProfile.getConnectedDevices()).thenReturn(devices); + when(mHapProfile.getConnectableDevices()).thenReturn(devices); assertThat(mMediaManager.mMediaDevices).isEmpty(); mMediaManager.startScan(); @@ -230,9 +233,14 @@ public class BluetoothMediaManagerTest { public void onBluetoothStateChanged_bluetoothStateIsOff_callOnDeviceListRemoved() { final BluetoothMediaDevice device1 = mock(BluetoothMediaDevice.class); final BluetoothMediaDevice device2 = mock(BluetoothMediaDevice.class); + final CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class); + final CachedBluetoothDevice cachedDevice2 = mock(CachedBluetoothDevice.class); mMediaManager.mMediaDevices.add(device1); mMediaManager.mMediaDevices.add(device2); + when(device1.getCachedDevice()).thenReturn(cachedDevice1); + when(device2.getCachedDevice()).thenReturn(cachedDevice2); + mMediaManager.registerCallback(mCallback); mMediaManager.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF); @@ -311,28 +319,30 @@ public class BluetoothMediaManagerTest { } @Test - public void onProfileConnectionStateChanged_cachedDeviceIsConnect_callOnDeviceAdded() { - final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); - - when(device.isConnectedHearingAidDevice()).thenReturn(true); - when(device.isConnectedA2dpDevice()).thenReturn(true); - - assertThat(mMediaManager.mMediaDevices).isEmpty(); - mMediaManager.registerCallback(mCallback); - mMediaManager.onProfileConnectionStateChanged(device, 0, 0); - - assertThat(mMediaManager.mMediaDevices).hasSize(1); - verify(mCallback).onDeviceAdded(any()); - } - - @Test - public void onProfileConnectionStateChanged_cachedDeviceIsDisconnect_callOnDeviceRemoved() { + public void onProfileConnectionStateChanged_cachedDeviceIsBonded_callDeviceAttributesChanged() { final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); final BluetoothMediaDevice bluetoothMediaDevice = mock(BluetoothMediaDevice.class); mMediaManager.mMediaDevices.add(bluetoothMediaDevice); - when(device.isConnectedHearingAidDevice()).thenReturn(false); - when(device.isConnectedA2dpDevice()).thenReturn(false); + when(device.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(device.getAddress()).thenReturn(TEST_ADDRESS); + when(bluetoothMediaDevice.getId()).thenReturn(TEST_ADDRESS); + + assertThat(mMediaManager.mMediaDevices).hasSize(1); + mMediaManager.registerCallback(mCallback); + mMediaManager.onProfileConnectionStateChanged(device, 0, 0); + + assertThat(mMediaManager.mMediaDevices).hasSize(1); + verify(mCallback).onDeviceAttributesChanged(); + } + + @Test + public void onProfileConnectionStateChanged_cachedDeviceIsBondNone_callOnDeviceRemoved() { + final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); + final BluetoothMediaDevice bluetoothMediaDevice = mock(BluetoothMediaDevice.class); + mMediaManager.mMediaDevices.add(bluetoothMediaDevice); + + when(device.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); when(device.getAddress()).thenReturn(TEST_ADDRESS); when(bluetoothMediaDevice.getId()).thenReturn(TEST_ADDRESS); @@ -345,28 +355,30 @@ public class BluetoothMediaManagerTest { } @Test - public void onAclConnectionStateChanged_cachedDeviceIsConnect_callOnDeviceAdded() { - final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); - - when(device.isConnectedHearingAidDevice()).thenReturn(true); - when(device.isConnectedA2dpDevice()).thenReturn(true); - - assertThat(mMediaManager.mMediaDevices).isEmpty(); - mMediaManager.registerCallback(mCallback); - mMediaManager.onAclConnectionStateChanged(device, 0); - - assertThat(mMediaManager.mMediaDevices).hasSize(1); - verify(mCallback).onDeviceAdded(any()); - } - - @Test - public void onAclConnectionStateChanged_cachedDeviceIsDisconnect_callOnDeviceRemoved() { + public void onAclConnectionStateChanged_cachedDeviceIsBonded_callDeviceAttributesChanged() { final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); final BluetoothMediaDevice bluetoothMediaDevice = mock(BluetoothMediaDevice.class); mMediaManager.mMediaDevices.add(bluetoothMediaDevice); - when(device.isConnectedHearingAidDevice()).thenReturn(false); - when(device.isConnectedA2dpDevice()).thenReturn(false); + when(device.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(device.getAddress()).thenReturn(TEST_ADDRESS); + when(bluetoothMediaDevice.getId()).thenReturn(TEST_ADDRESS); + + assertThat(mMediaManager.mMediaDevices).hasSize(1); + mMediaManager.registerCallback(mCallback); + mMediaManager.onAclConnectionStateChanged(device, 0); + + assertThat(mMediaManager.mMediaDevices).hasSize(1); + verify(mCallback).onDeviceAttributesChanged(); + } + + @Test + public void onAclConnectionStateChanged_cachedDeviceIsBondNone_callOnDeviceRemoved() { + final CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); + final BluetoothMediaDevice bluetoothMediaDevice = mock(BluetoothMediaDevice.class); + mMediaManager.mMediaDevices.add(bluetoothMediaDevice); + + when(device.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); when(device.getAddress()).thenReturn(TEST_ADDRESS); when(bluetoothMediaDevice.getId()).thenReturn(TEST_ADDRESS); 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 355681401b9a8..98bb74ad0718c 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 @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import com.android.settingslib.bluetooth.A2dpProfile; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; @@ -112,6 +113,23 @@ public class LocalMediaManagerTest { eq(LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED)); } + @Test + public void connectDevice_bluetoothDeviceNotConnected_connectBluetoothDevice() { + final MediaDevice device = mock(BluetoothMediaDevice.class); + final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); + mLocalMediaManager.mMediaDevices.add(device); + + when(device.getId()).thenReturn(TEST_DEVICE_ID_1); + when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice); + when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.isBusy()).thenReturn(false); + + mLocalMediaManager.registerCallback(mCallback); + mLocalMediaManager.connectDevice(device); + + verify(cachedDevice).connect(true); + } + @Test public void getMediaDeviceById_idExist_shouldReturnMediaDevice() { final MediaDevice device1 = mock(MediaDevice.class); @@ -321,15 +339,6 @@ public class LocalMediaManagerTest { verify(mCallback).onDeviceListUpdate(any()); } - @Test - public void onDeviceAttributesChanged_shouldDispatchDeviceListUpdate() { - mLocalMediaManager.registerCallback(mCallback); - - mLocalMediaManager.mMediaDeviceCallback.onDeviceAttributesChanged(); - - verify(mCallback).onDeviceListUpdate(any()); - } - @Test public void onConnectedDeviceChanged_connectedAndCurrentDeviceAreDifferent_notifyThemChanged() { final MediaDevice device1 = mock(MediaDevice.class); @@ -366,4 +375,13 @@ public class LocalMediaManagerTest { verify(mCallback, never()).onDeviceListUpdate(any()); } + + @Test + public void onDeviceAttributesChanged_shouldDispatchDeviceListUpdate() { + mLocalMediaManager.registerCallback(mCallback); + + mLocalMediaManager.mMediaDeviceCallback.onDeviceAttributesChanged(); + + verify(mCallback).onDeviceListUpdate(any()); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java index fc514f0ac25cb..23d2c74218cc4 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java @@ -114,6 +114,12 @@ public class MediaDeviceTest { when(mCachedDevice1.getDevice()).thenReturn(mDevice1); when(mCachedDevice2.getDevice()).thenReturn(mDevice2); when(mCachedDevice3.getDevice()).thenReturn(mDevice3); + when(mCachedDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice1.isConnected()).thenReturn(true); + when(mCachedDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice2.isConnected()).thenReturn(true); + when(mCachedDevice3.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mCachedDevice3.isConnected()).thenReturn(true); when(mRouteInfo1.getId()).thenReturn(ROUTER_ID_1); when(mRouteInfo2.getId()).thenReturn(ROUTER_ID_2); when(mRouteInfo3.getId()).thenReturn(ROUTER_ID_3); @@ -158,12 +164,25 @@ public class MediaDeviceTest { } @Test - public void compareTo_carKit_phone_carKitFirst() { + public void compareTo_carKit_phone_phoneFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); - mMediaDevices.add(mPhoneMediaDevice); mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mPhoneMediaDevice); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + Collections.sort(mMediaDevices, COMPARATOR); assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + } + + @Test + public void compareTo_carKitIsDisConnected_nonCarKitBluetooth_nonCarKitBluetoothFirst() { + when(mDevice1.getBluetoothClass()).thenReturn(mHeadreeClass); + when(mDevice2.getBluetoothClass()).thenReturn(mCarkitClass); + when(mCachedDevice2.isConnected()).thenReturn(false); + mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mBluetoothMediaDevice2); + + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); Collections.sort(mMediaDevices, COMPARATOR); assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); } @@ -178,6 +197,7 @@ public class MediaDeviceTest { Collections.sort(mMediaDevices, COMPARATOR); assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2); } + @Test public void compareTo_connectionRecord_sortByRecord() { mMediaDevices.add(mBluetoothMediaDevice1); @@ -195,6 +215,25 @@ public class MediaDeviceTest { assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice1); } + @Test + public void compareTo_sortByRecord_connectedDeviceFirst() { + mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mBluetoothMediaDevice2); + when(mCachedDevice2.isConnected()).thenReturn(false); + + mBluetoothMediaDevice1.connect(); + mBluetoothMediaDevice2.connect(); + mBluetoothMediaDevice2.connect(); + // Reset last selected record + ConnectionRecordManager.getInstance().setConnectionRecord(mContext, null, 0); + + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice2); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice2); + } + @Test public void compareTo_info_bluetooth_infoFirst() { mMediaDevices.add(mBluetoothMediaDevice1); @@ -206,13 +245,13 @@ public class MediaDeviceTest { } @Test - public void compareTo_bluetooth_phone_bluetoothFirst() { - mMediaDevices.add(mPhoneMediaDevice); + public void compareTo_bluetooth_phone_phoneFirst() { mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mPhoneMediaDevice); - assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); - Collections.sort(mMediaDevices, COMPARATOR); assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); } @Test @@ -235,6 +274,17 @@ public class MediaDeviceTest { assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); } + @Test + public void compareTo_sortByAlphabet_connectDeviceFirst() { + mMediaDevices.add(mBluetoothMediaDevice2); + mMediaDevices.add(mBluetoothMediaDevice1); + when(mCachedDevice1.isConnected()).thenReturn(false); + + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2); + } + // 1.mInfoMediaDevice1: Last Selected device // 2.mBluetoothMediaDevice1: CarKit device // 3.mInfoMediaDevice2: * 2 times usage @@ -242,7 +292,7 @@ public class MediaDeviceTest { // 5.mBluetoothMediaDevice2: * 2 times usage // 6.mBluetoothMediaDevice3: * 1 time usage // 7.mPhoneMediaDevice: * 0 time usage - // Order: 2 -> 1 -> 3 -> 5 -> 4 -> 6 -> 7 + // Order: 7 -> 2 -> 1 -> 3 -> 5 -> 4 -> 6 @Test public void compareTo_mixedDevices_carKitFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); @@ -264,13 +314,55 @@ public class MediaDeviceTest { mInfoMediaDevice1.connect(); Collections.sort(mMediaDevices, COMPARATOR); - assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); + assertThat(mMediaDevices.get(1)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice1); + assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice2); + assertThat(mMediaDevices.get(4)).isEqualTo(mBluetoothMediaDevice2); + assertThat(mMediaDevices.get(5)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(6)).isEqualTo(mBluetoothMediaDevice3); + } + + // 1.mInfoMediaDevice1: Last Selected device + // 2.mBluetoothMediaDevice1: CarKit device not connected + // 3.mInfoMediaDevice2: * 2 times usage + // 4.mInfoMediaDevice3: * 1 time usage + // 5.mBluetoothMediaDevice2: * 4 times usage not connected + // 6.mBluetoothMediaDevice3: * 1 time usage + // 7.mPhoneMediaDevice: * 0 time usage + // Order: 7 -> 1 -> 3 -> 4 -> 6 -> 2 -> 5 + @Test + public void compareTo_mixedDevices_connectDeviceFirst() { + when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); + when(mDevice2.getBluetoothClass()).thenReturn(mHeadreeClass); + when(mDevice3.getBluetoothClass()).thenReturn(mHeadreeClass); + when(mCachedDevice1.isConnected()).thenReturn(false); + when(mCachedDevice2.isConnected()).thenReturn(false); + mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mBluetoothMediaDevice2); + mMediaDevices.add(mBluetoothMediaDevice3); + mMediaDevices.add(mInfoMediaDevice1); + mMediaDevices.add(mInfoMediaDevice2); + mMediaDevices.add(mInfoMediaDevice3); + mMediaDevices.add(mPhoneMediaDevice); + mBluetoothMediaDevice3.connect(); + mBluetoothMediaDevice2.connect(); + mBluetoothMediaDevice2.connect(); + mBluetoothMediaDevice2.connect(); + mBluetoothMediaDevice2.connect(); + mInfoMediaDevice3.connect(); + mInfoMediaDevice2.connect(); + mInfoMediaDevice2.connect(); + mInfoMediaDevice1.connect(); + + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mPhoneMediaDevice); assertThat(mMediaDevices.get(1)).isEqualTo(mInfoMediaDevice1); assertThat(mMediaDevices.get(2)).isEqualTo(mInfoMediaDevice2); - assertThat(mMediaDevices.get(3)).isEqualTo(mBluetoothMediaDevice2); - assertThat(mMediaDevices.get(4)).isEqualTo(mInfoMediaDevice3); - assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice3); - assertThat(mMediaDevices.get(6)).isEqualTo(mPhoneMediaDevice); + assertThat(mMediaDevices.get(3)).isEqualTo(mInfoMediaDevice3); + assertThat(mMediaDevices.get(4)).isEqualTo(mBluetoothMediaDevice3); + assertThat(mMediaDevices.get(5)).isEqualTo(mBluetoothMediaDevice1); + assertThat(mMediaDevices.get(6)).isEqualTo(mBluetoothMediaDevice2); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaManagerTest.java index 98eccb506f63e..ead2be4d7b267 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaManagerTest.java @@ -110,6 +110,15 @@ public class MediaManagerTest { verify(mCallback).onConnectedDeviceChanged(TEST_ID); } + @Test + public void dispatchDataChanged_registerCallback_shouldDispatchCallback() { + mMediaManager.registerCallback(mCallback); + + mMediaManager.dispatchDataChanged(); + + verify(mCallback).onDeviceAttributesChanged(); + } + @Test public void findMediaDevice_idExist_shouldReturnMediaDevice() { mMediaManager.mMediaDevices.add(mDevice); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index 5ba33f569e441..50a6a9d7be20c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.when; import android.bluetooth.BluetoothDevice; import android.content.Context; +import com.android.settingslib.R; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -97,4 +98,19 @@ public class PhoneMediaDeviceTest { assertThat(mPhoneMediaDevice.connect()).isFalse(); } + + @Test + public void updateSummary_isActiveIsTrue_returnActiveString() { + mPhoneMediaDevice.updateSummary(true); + + assertThat(mPhoneMediaDevice.getSummary()) + .isEqualTo(mContext.getString(R.string.bluetooth_active_no_battery_level)); + } + + @Test + public void updateSummary_notActive_returnEmpty() { + mPhoneMediaDevice.updateSummary(false); + + assertThat(mPhoneMediaDevice.getSummary()).isEmpty(); + } }