Merge "Add connection state summary for android auto" into pi-dev
am: c443a7cbef
Change-Id: I5130eceb4a79a3a44f0f7df45034e622b79898fa
This commit is contained in:
@@ -1075,6 +1075,116 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return resource for android auto string that describes the connection state of this device.
|
||||
*/
|
||||
public String getCarConnectionSummary() {
|
||||
boolean profileConnected = false; // at least one profile is connected
|
||||
boolean a2dpNotConnected = false; // A2DP is preferred but not connected
|
||||
boolean hfpNotConnected = false; // HFP is preferred but not connected
|
||||
boolean hearingAidNotConnected = false; // Hearing Aid is preferred but not connected
|
||||
|
||||
for (LocalBluetoothProfile profile : getProfiles()) {
|
||||
int connectionStatus = getProfileConnectionState(profile);
|
||||
|
||||
switch (connectionStatus) {
|
||||
case BluetoothProfile.STATE_CONNECTING:
|
||||
case BluetoothProfile.STATE_DISCONNECTING:
|
||||
return mContext.getString(Utils.getConnectionStateSummary(connectionStatus));
|
||||
|
||||
case BluetoothProfile.STATE_CONNECTED:
|
||||
profileConnected = true;
|
||||
break;
|
||||
|
||||
case BluetoothProfile.STATE_DISCONNECTED:
|
||||
if (profile.isProfileReady()) {
|
||||
if ((profile instanceof A2dpProfile) ||
|
||||
(profile instanceof A2dpSinkProfile)){
|
||||
a2dpNotConnected = true;
|
||||
} else if ((profile instanceof HeadsetProfile) ||
|
||||
(profile instanceof HfpClientProfile)) {
|
||||
hfpNotConnected = true;
|
||||
} else if (profile instanceof HearingAidProfile) {
|
||||
hearingAidNotConnected = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String batteryLevelPercentageString = null;
|
||||
// Android framework should only set mBatteryLevel to valid range [0-100] or
|
||||
// BluetoothDevice.BATTERY_LEVEL_UNKNOWN, any other value should be a framework bug.
|
||||
// Thus assume here that if value is not BluetoothDevice.BATTERY_LEVEL_UNKNOWN, it must
|
||||
// be valid
|
||||
final int batteryLevel = getBatteryLevel();
|
||||
if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
|
||||
// TODO: name com.android.settingslib.bluetooth.Utils something different
|
||||
batteryLevelPercentageString =
|
||||
com.android.settingslib.Utils.formatPercentage(batteryLevel);
|
||||
}
|
||||
|
||||
// Prepare the string for the Active Device summary
|
||||
String[] activeDeviceStringsArray = mContext.getResources().getStringArray(
|
||||
R.array.bluetooth_audio_active_device_summaries);
|
||||
String activeDeviceString = activeDeviceStringsArray[0]; // Default value: not active
|
||||
if (mIsActiveDeviceA2dp && mIsActiveDeviceHeadset) {
|
||||
activeDeviceString = activeDeviceStringsArray[1]; // Active for Media and Phone
|
||||
} else {
|
||||
if (mIsActiveDeviceA2dp) {
|
||||
activeDeviceString = activeDeviceStringsArray[2]; // Active for Media only
|
||||
}
|
||||
if (mIsActiveDeviceHeadset) {
|
||||
activeDeviceString = activeDeviceStringsArray[3]; // Active for Phone only
|
||||
}
|
||||
}
|
||||
if (!hearingAidNotConnected && mIsActiveDeviceHearingAid) {
|
||||
activeDeviceString = activeDeviceStringsArray[1];
|
||||
return mContext.getString(R.string.bluetooth_connected, activeDeviceString);
|
||||
}
|
||||
|
||||
if (profileConnected) {
|
||||
if (a2dpNotConnected && hfpNotConnected) {
|
||||
if (batteryLevelPercentageString != null) {
|
||||
return mContext.getString(
|
||||
R.string.bluetooth_connected_no_headset_no_a2dp_battery_level,
|
||||
batteryLevelPercentageString, activeDeviceString);
|
||||
} else {
|
||||
return mContext.getString(R.string.bluetooth_connected_no_headset_no_a2dp,
|
||||
activeDeviceString);
|
||||
}
|
||||
|
||||
} else if (a2dpNotConnected) {
|
||||
if (batteryLevelPercentageString != null) {
|
||||
return mContext.getString(R.string.bluetooth_connected_no_a2dp_battery_level,
|
||||
batteryLevelPercentageString, activeDeviceString);
|
||||
} else {
|
||||
return mContext.getString(R.string.bluetooth_connected_no_a2dp,
|
||||
activeDeviceString);
|
||||
}
|
||||
|
||||
} else if (hfpNotConnected) {
|
||||
if (batteryLevelPercentageString != null) {
|
||||
return mContext.getString(R.string.bluetooth_connected_no_headset_battery_level,
|
||||
batteryLevelPercentageString, activeDeviceString);
|
||||
} else {
|
||||
return mContext.getString(R.string.bluetooth_connected_no_headset,
|
||||
activeDeviceString);
|
||||
}
|
||||
} else {
|
||||
if (batteryLevelPercentageString != null) {
|
||||
return mContext.getString(R.string.bluetooth_connected_battery_level,
|
||||
batteryLevelPercentageString, activeDeviceString);
|
||||
} else {
|
||||
return mContext.getString(R.string.bluetooth_connected, activeDeviceString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return getBondState() == BluetoothDevice.BOND_BONDING ?
|
||||
mContext.getString(R.string.bluetooth_pairing) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@code true} if {@code cachedBluetoothDevice} is a2dp device
|
||||
*/
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.android.settingslib.bluetooth;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
@@ -159,7 +160,7 @@ public class CachedBluetoothDeviceTest {
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
|
||||
"Active, 10% battery");
|
||||
|
||||
// Set A2DP profile to be disconnected and test connection state summary
|
||||
@@ -193,7 +194,7 @@ public class CachedBluetoothDeviceTest {
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
|
||||
"Active, 10% battery");
|
||||
|
||||
// Set HFP profile to be disconnected and test connection state summary
|
||||
@@ -277,6 +278,200 @@ public class CachedBluetoothDeviceTest {
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_singleProfileConnectDisconnect() {
|
||||
// Test without battery level
|
||||
// Set PAN profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set PAN profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
// Set PAN profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, battery 10%");
|
||||
|
||||
// Set PAN profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
|
||||
// Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
|
||||
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
|
||||
|
||||
// Set PAN profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set PAN profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_multipleProfileConnectDisconnect() {
|
||||
mBatteryLevel = 10;
|
||||
|
||||
// Set HFP, A2DP and PAN profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, battery 10%");
|
||||
|
||||
// Disconnect HFP only and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected (no phone), battery 10%");
|
||||
|
||||
// Disconnect A2DP only and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected (no media), battery 10%");
|
||||
|
||||
// Disconnect both HFP and A2DP and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected (no phone or media), battery 10%");
|
||||
|
||||
// Disconnect all profiles and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_singleProfileActiveDeviceA2dp() {
|
||||
// Test without battery level
|
||||
// Set A2DP profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set device as Active for A2DP and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (media)");
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected, battery 10%, active (media)");
|
||||
|
||||
// Set A2DP profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
|
||||
// Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
|
||||
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
|
||||
// Set A2DP profile to be connected, Active and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (media)");
|
||||
|
||||
// Set A2DP profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_singleProfileActiveDeviceHfp() {
|
||||
// Test without battery level
|
||||
// Set HFP profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set device as Active for HFP and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (phone)");
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected, battery 10%, active (phone)");
|
||||
|
||||
// Set HFP profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
|
||||
// Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
|
||||
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
|
||||
// Set HFP profile to be connected, Active and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (phone)");
|
||||
|
||||
// Set HFP profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_singleProfileActiveDeviceHearingAid() {
|
||||
// Test without battery level
|
||||
// Set Hearing Aid profile to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set device as Active for Hearing Aid and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
|
||||
|
||||
// Set Hearing Aid profile to be disconnected and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
|
||||
mCachedDevice.onProfileStateChanged(mHearingAidProfile,
|
||||
BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCarConnectionSummary_multipleProfilesActiveDevice() {
|
||||
// Test without battery level
|
||||
// Set A2DP and HFP profiles to be connected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
|
||||
|
||||
// Set device as Active for A2DP and HFP and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
|
||||
|
||||
// Test with battery level
|
||||
mBatteryLevel = 10;
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected, battery 10%, active");
|
||||
|
||||
// Disconnect A2DP only and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP);
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected (no media), battery 10%, active (phone)");
|
||||
|
||||
// Disconnect HFP only and test connection state summary
|
||||
mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET);
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
|
||||
"Connected (no phone), battery 10%, active (media)");
|
||||
|
||||
// Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
|
||||
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
|
||||
// Set A2DP and HFP profiles to be connected, Active and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
|
||||
mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
|
||||
|
||||
// Set A2DP and HFP profiles to be disconnected and test connection state summary
|
||||
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testDeviceName_testAliasNameAvailable() {
|
||||
when(mDevice.getAliasName()).thenReturn(DEVICE_ALIAS);
|
||||
|
||||
Reference in New Issue
Block a user