diff options
| author | 2018-04-30 02:24:24 -0700 | |
|---|---|---|
| committer | 2018-04-30 02:24:24 -0700 | |
| commit | 68af4849ca39150aeea0ba331810da7837f4cf77 (patch) | |
| tree | 917c745685abfde221c68b5cb36d9ad72b246b96 | |
| parent | 7128338376c712dcb9aacc8728e7cb3ec0bcc862 (diff) | |
| parent | f050932e2a7a35f9d64a77fcdaff475bdab8f749 (diff) | |
Update connected device summary
am: f050932e2a
Change-Id: I9d1cb57140ad8f71e3f565b27e9dccfeb97ee0be
4 files changed, 100 insertions, 91 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index fb268abb8954..e7d7ab39b6c4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -490,6 +490,7 @@ public class BluetoothEventManager { } private void dispatchAudioModeChanged() { + mDeviceManager.dispatchAudioModeChanged(); synchronized (mCallbacks) { for (BluetoothCallback callback : mCallbacks) { callback.onAudioModeChanged(); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 62856e4e9082..ce4aef31b395 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -23,6 +23,7 @@ import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; import android.content.Context; import android.content.SharedPreferences; +import android.media.AudioManager; import android.os.ParcelUuid; import android.os.SystemClock; import android.text.TextUtils; @@ -51,6 +52,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> private final Context mContext; private final LocalBluetoothAdapter mLocalAdapter; private final LocalBluetoothProfileManager mProfileManager; + private final AudioManager mAudioManager; private final BluetoothDevice mDevice; //TODO: consider remove, BluetoothDevice.getName() is already cached private String mName; @@ -123,7 +125,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> private boolean mIsActiveDeviceA2dp = false; private boolean mIsActiveDeviceHeadset = false; private boolean mIsActiveDeviceHearingAid = false; - /** * Describes the current device and profile for logging. * @@ -185,6 +186,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> mContext = context; mLocalAdapter = adapter; mProfileManager = profileManager; + mAudioManager = context.getSystemService(AudioManager.class); mDevice = device; mProfileConnectionState = new HashMap<LocalBluetoothProfile, Integer>(); fillData(); @@ -538,6 +540,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** + * Update the profile audio state. + */ + void onAudioModeChanged() { + dispatchAttributesChanged(); + } + /** * Get the device status as active or non-active per Bluetooth profile. * * @param bluetoothProfile the Bluetooth profile @@ -972,12 +980,14 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> /** * @return resource for string that discribes the connection state of this device. + * case 1: idle or playing media, show "Active" on the only one A2DP active device. + * case 2: in phone call, show "Active" on the only one HFP active device */ public String getConnectionSummary() { - 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 + boolean profileConnected = false; // Updated as long as BluetoothProfile is connected + boolean a2dpConnected = true; // A2DP is connected + boolean hfpConnected = true; // HFP is connected + boolean hearingAidConnected = true; // Hearing Aid is connected for (LocalBluetoothProfile profile : getProfiles()) { int connectionStatus = getProfileConnectionState(profile); @@ -994,13 +1004,13 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> case BluetoothProfile.STATE_DISCONNECTED: if (profile.isProfileReady()) { if ((profile instanceof A2dpProfile) || - (profile instanceof A2dpSinkProfile)){ - a2dpNotConnected = true; + (profile instanceof A2dpSinkProfile)) { + a2dpConnected = false; } else if ((profile instanceof HeadsetProfile) || - (profile instanceof HfpClientProfile)) { - hfpNotConnected = true; - } else if (profile instanceof HearingAidProfile) { - hearingAidNotConnected = true; + (profile instanceof HfpClientProfile)) { + hfpConnected = false; + } else if (profile instanceof HearingAidProfile) { + hearingAidConnected = false; } } break; @@ -1019,65 +1029,50 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> 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); - } - + int stringRes = R.string.bluetooth_pairing; + //when profile is connected, information would be available 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 (a2dpConnected || hfpConnected || hearingAidConnected) { + //contain battery information 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); + //device is in phone call + if (com.android.settingslib.Utils.isAudioModeOngoingCall(mContext)) { + if (mIsActiveDeviceHeadset) { + stringRes = R.string.bluetooth_active_battery_level; + } else { + stringRes = R.string.bluetooth_battery_level; + } + } else {//device is not in phone call(ex. idle or playing media) + //need to check if A2DP and HearingAid are exclusive + if (mIsActiveDeviceHearingAid || mIsActiveDeviceA2dp) { + stringRes = R.string.bluetooth_active_battery_level; + } else { + stringRes = R.string.bluetooth_battery_level; + } + } } else { - return mContext.getString(R.string.bluetooth_connected_no_headset, - activeDeviceString); + //no battery information + if (com.android.settingslib.Utils.isAudioModeOngoingCall(mContext)) { + if (mIsActiveDeviceHeadset) { + stringRes = R.string.bluetooth_active_no_battery_level; + } + } else { + if (mIsActiveDeviceHearingAid || mIsActiveDeviceA2dp) { + stringRes = R.string.bluetooth_active_no_battery_level; + } + } } - } else { + } else {//unknown profile with battery information if (batteryLevelPercentageString != null) { - return mContext.getString(R.string.bluetooth_connected_battery_level, - batteryLevelPercentageString, activeDeviceString); - } else { - return mContext.getString(R.string.bluetooth_connected, activeDeviceString); + stringRes = R.string.bluetooth_battery_level; } } } - return getBondState() == BluetoothDevice.BOND_BONDING ? - mContext.getString(R.string.bluetooth_pairing) : null; + return (stringRes != R.string.bluetooth_pairing + || getBondState() == BluetoothDevice.BOND_BONDING) + ? mContext.getString(stringRes, batteryLevelPercentageString) + : null; } /** diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 3b1e4ce7e97a..15f6983a684c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -358,6 +358,12 @@ public class CachedBluetoothDeviceManager { } } + public synchronized void dispatchAudioModeChanged() { + for (CachedBluetoothDevice cachedDevice : mCachedDevices) { + cachedDevice.onAudioModeChanged(); + } + } + private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 7863fc588778..5853dcad083a 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -23,23 +23,25 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.robolectric.Shadows.shadowOf; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; +import android.media.AudioManager; + +import com.android.settingslib.SettingsLibRobolectricTestRunner; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowAudioManager; -@RunWith(RobolectricTestRunner.class) -@Config(resourceDir = "../../res") +@RunWith(SettingsLibRobolectricTestRunner.class) public class CachedBluetoothDeviceTest { private final static String DEVICE_NAME = "TestName"; private final static String DEVICE_ALIAS = "TestAlias"; @@ -60,6 +62,7 @@ public class CachedBluetoothDeviceTest { @Mock private BluetoothDevice mDevice; private CachedBluetoothDevice mCachedDevice; + private ShadowAudioManager mShadowAudioManager; private Context mContext; private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; @@ -67,6 +70,7 @@ public class CachedBluetoothDeviceTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; + mShadowAudioManager = shadowOf(mContext.getSystemService(AudioManager.class)); when(mDevice.getAddress()).thenReturn(DEVICE_ADDRESS); when(mAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON); when(mHfpProfile.isProfileReady()).thenReturn(true); @@ -83,7 +87,7 @@ public class CachedBluetoothDeviceTest { // Test without battery level // Set PAN profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set PAN profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -93,7 +97,7 @@ public class CachedBluetoothDeviceTest { mBatteryLevel = 10; // Set PAN profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, battery 10%"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("10% battery"); // Set PAN profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -104,7 +108,7 @@ public class CachedBluetoothDeviceTest { // Set PAN profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set PAN profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -119,23 +123,23 @@ public class CachedBluetoothDeviceTest { mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, battery 10%"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("10% battery"); // Disconnect HFP only and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected (no phone), battery 10%"); + "10% battery"); // Disconnect A2DP only and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected (no media), battery 10%"); + "10% battery"); // Disconnect both HFP and A2DP and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected (no phone or media), battery 10%"); + "10% battery"); // Disconnect all profiles and test connection state summary mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -147,16 +151,16 @@ public class CachedBluetoothDeviceTest { // Test without battery level // Set A2DP profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set device as Active for A2DP and test connection state summary mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(media)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Test with battery level mBatteryLevel = 10; - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected, battery 10%, active(media)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( + "Active, 10% battery"); // Set A2DP profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -167,7 +171,7 @@ public class CachedBluetoothDeviceTest { // 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.getConnectionSummary()).isEqualTo("Connected, active(media)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Set A2DP profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -179,16 +183,18 @@ public class CachedBluetoothDeviceTest { // Test without battery level // Set HFP profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set device as Active for HFP and test connection state summary + mCachedDevice.onAudioModeChanged(); + mShadowAudioManager.setMode(AudioManager.MODE_IN_CALL); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(phone)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Test with battery level mBatteryLevel = 10; - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected, battery 10%, active(phone)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( + "Active, 10% battery"); // Set HFP profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -199,7 +205,7 @@ public class CachedBluetoothDeviceTest { // 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.getConnectionSummary()).isEqualTo("Connected, active(phone)"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Set HFP profile to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED); @@ -211,15 +217,16 @@ public class CachedBluetoothDeviceTest { // Test without battery level // Set Hearing Aid profile to be connected and test connection state summary mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // Set device as Active for Hearing Aid and test connection state summary mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("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); + mCachedDevice. + onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isNull(); } @@ -229,23 +236,23 @@ public class CachedBluetoothDeviceTest { // 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.getConnectionSummary()).isEqualTo("Connected"); + assertThat(mCachedDevice.getConnectionSummary()).isNull(); // 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.getConnectionSummary()).isEqualTo("Connected, active"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Test with battery level mBatteryLevel = 10; assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected, battery 10%, active"); + "Active, 10% battery"); // Disconnect A2DP only and test connection state summary mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP); mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected (no media), battery 10%, active(phone)"); + "10% battery"); // Disconnect HFP only and test connection state summary mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET); @@ -253,7 +260,7 @@ public class CachedBluetoothDeviceTest { mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( - "Connected (no phone), battery 10%, active(media)"); + "Active, 10% battery"); // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; @@ -262,7 +269,7 @@ public class CachedBluetoothDeviceTest { mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); - assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active"); + assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active"); // Set A2DP and HFP profiles to be disconnected and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); |