Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.settingslib.bluetooth;
     17 
     18 import static com.google.common.truth.Truth.assertThat;
     19 
     20 import static org.mockito.Matchers.any;
     21 import static org.mockito.Matchers.anyString;
     22 import static org.mockito.Mockito.doAnswer;
     23 import static org.mockito.Mockito.never;
     24 import static org.mockito.Mockito.spy;
     25 import static org.mockito.Mockito.verify;
     26 import static org.mockito.Mockito.when;
     27 import static org.robolectric.Shadows.shadowOf;
     28 
     29 import android.bluetooth.BluetoothAdapter;
     30 import android.bluetooth.BluetoothDevice;
     31 import android.bluetooth.BluetoothProfile;
     32 import android.content.Context;
     33 import android.media.AudioManager;
     34 
     35 import com.android.settingslib.SettingsLibRobolectricTestRunner;
     36 
     37 import org.junit.Before;
     38 import org.junit.Test;
     39 import org.junit.runner.RunWith;
     40 import org.mockito.Mock;
     41 import org.mockito.MockitoAnnotations;
     42 import org.robolectric.RuntimeEnvironment;
     43 import org.robolectric.shadows.ShadowAudioManager;
     44 
     45 @RunWith(SettingsLibRobolectricTestRunner.class)
     46 public class CachedBluetoothDeviceTest {
     47     private final static String DEVICE_NAME = "TestName";
     48     private final static String DEVICE_ALIAS = "TestAlias";
     49     private final static String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF";
     50     private final static String DEVICE_ALIAS_NEW = "TestAliasNew";
     51     @Mock
     52     private LocalBluetoothAdapter mAdapter;
     53     @Mock
     54     private LocalBluetoothProfileManager mProfileManager;
     55     @Mock
     56     private HeadsetProfile mHfpProfile;
     57     @Mock
     58     private A2dpProfile mA2dpProfile;
     59     @Mock
     60     private PanProfile mPanProfile;
     61     @Mock
     62     private HearingAidProfile mHearingAidProfile;
     63     @Mock
     64     private BluetoothDevice mDevice;
     65     private CachedBluetoothDevice mCachedDevice;
     66     private ShadowAudioManager mShadowAudioManager;
     67     private Context mContext;
     68     private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
     69 
     70     @Before
     71     public void setUp() {
     72         MockitoAnnotations.initMocks(this);
     73         mContext = RuntimeEnvironment.application;
     74         mShadowAudioManager = shadowOf(mContext.getSystemService(AudioManager.class));
     75         when(mDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
     76         when(mAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON);
     77         when(mHfpProfile.isProfileReady()).thenReturn(true);
     78         when(mA2dpProfile.isProfileReady()).thenReturn(true);
     79         when(mPanProfile.isProfileReady()).thenReturn(true);
     80         when(mHearingAidProfile.isProfileReady()).thenReturn(true);
     81         mCachedDevice = spy(
     82                 new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice));
     83         doAnswer((invocation) -> mBatteryLevel).when(mCachedDevice).getBatteryLevel();
     84     }
     85 
     86     @Test
     87     public void testGetConnectionSummary_testSingleProfileConnectDisconnect() {
     88         // Test without battery level
     89         // Set PAN profile to be connected and test connection state summary
     90         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
     91         assertThat(mCachedDevice.getConnectionSummary()).isNull();
     92 
     93         // Set PAN profile to be disconnected and test connection state summary
     94         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
     95         assertThat(mCachedDevice.getConnectionSummary()).isNull();
     96 
     97         // Test with battery level
     98         mBatteryLevel = 10;
     99         // Set PAN profile to be connected and test connection state summary
    100         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    101         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("10% battery");
    102 
    103         // Set PAN profile to be disconnected and test connection state summary
    104         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    105         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    106 
    107         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    108         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    109 
    110         // Set PAN profile to be connected and test connection state summary
    111         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    112         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    113 
    114         // Set PAN profile to be disconnected and test connection state summary
    115         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    116         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    117     }
    118 
    119     @Test
    120     public void testGetConnectionSummary_testMultipleProfileConnectDisconnect() {
    121         mBatteryLevel = 10;
    122 
    123         // Set HFP, A2DP and PAN profile to be connected and test connection state summary
    124         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    125         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    126         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    127         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("10% battery");
    128 
    129         // Disconnect HFP only and test connection state summary
    130         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    131         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    132                 "10% battery");
    133 
    134         // Disconnect A2DP only and test connection state summary
    135         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    136         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    137         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    138                 "10% battery");
    139 
    140         // Disconnect both HFP and A2DP and test connection state summary
    141         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    142         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    143                 "10% battery");
    144 
    145         // Disconnect all profiles and test connection state summary
    146         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    147         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    148     }
    149 
    150     @Test
    151     public void testGetConnectionSummary_testSingleProfileActiveDeviceA2dp() {
    152         // Test without battery level
    153         // Set A2DP profile to be connected and test connection state summary
    154         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    155         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    156 
    157         // Set device as Active for A2DP and test connection state summary
    158         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    159         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    160 
    161         // Test with battery level
    162         mBatteryLevel = 10;
    163         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    164                 "Active, 10% battery");
    165 
    166         // Set A2DP profile to be disconnected and test connection state summary
    167         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    168         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    169 
    170         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    171         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    172         // Set A2DP profile to be connected, Active and test connection state summary
    173         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    174         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    175         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    176 
    177         // Set A2DP profile to be disconnected and test connection state summary
    178         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    179         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    180     }
    181 
    182     @Test
    183     public void testGetConnectionSummary_testSingleProfileActiveDeviceHfp() {
    184         // Test without battery level
    185         // Set HFP profile to be connected and test connection state summary
    186         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    187         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    188 
    189         // Set device as Active for HFP and test connection state summary
    190         mCachedDevice.onAudioModeChanged();
    191         mShadowAudioManager.setMode(AudioManager.MODE_IN_CALL);
    192         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    193         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    194 
    195         // Test with battery level
    196         mBatteryLevel = 10;
    197         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    198                 "Active, 10% battery");
    199 
    200         // Set HFP profile to be disconnected and test connection state summary
    201         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    202         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    203 
    204         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    205         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    206         // Set HFP profile to be connected, Active and test connection state summary
    207         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    208         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    209         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    210 
    211         // Set HFP profile to be disconnected and test connection state summary
    212         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    213         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    214     }
    215 
    216     @Test
    217     public void testGetConnectionSummary_testSingleProfileActiveDeviceHearingAid() {
    218         // Test without battery level
    219         // Set Hearing Aid profile to be connected and test connection state summary
    220         mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED);
    221         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    222 
    223         // Set device as Active for Hearing Aid and test connection state summary
    224         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
    225         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    226 
    227         // Set Hearing Aid profile to be disconnected and test connection state summary
    228         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
    229         mCachedDevice.
    230                 onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_DISCONNECTED);
    231         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    232     }
    233 
    234     @Test
    235     public void testGetConnectionSummary_testMultipleProfilesActiveDevice() {
    236         // Test without battery level
    237         // Set A2DP and HFP profiles to be connected and test connection state summary
    238         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    239         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    240         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    241 
    242         // Set device as Active for A2DP and HFP and test connection state summary
    243         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    244         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    245         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    246 
    247         // Test with battery level
    248         mBatteryLevel = 10;
    249         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    250                 "Active, 10% battery");
    251 
    252         // Disconnect A2DP only and test connection state summary
    253         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP);
    254         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    255         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    256                 "10% battery");
    257 
    258         // Disconnect HFP only and test connection state summary
    259         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET);
    260         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    261         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    262         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    263         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
    264                 "Active, 10% battery");
    265 
    266         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    267         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    268         // Set A2DP and HFP profiles to be connected, Active and test connection state summary
    269         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    270         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    271         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    272         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    273         assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Active");
    274 
    275         // Set A2DP and HFP profiles to be disconnected and test connection state summary
    276         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    277         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    278         assertThat(mCachedDevice.getConnectionSummary()).isNull();
    279     }
    280 
    281     @Test
    282     public void getCarConnectionSummary_singleProfileConnectDisconnect() {
    283         // Test without battery level
    284         // Set PAN profile to be connected and test connection state summary
    285         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    286         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    287 
    288         // Set PAN profile to be disconnected and test connection state summary
    289         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    290         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    291 
    292         // Test with battery level
    293         mBatteryLevel = 10;
    294         // Set PAN profile to be connected and test connection state summary
    295         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    296         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, battery 10%");
    297 
    298         // Set PAN profile to be disconnected and test connection state summary
    299         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    300         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    301 
    302         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    303         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    304 
    305         // Set PAN profile to be connected and test connection state summary
    306         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    307         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    308 
    309         // Set PAN profile to be disconnected and test connection state summary
    310         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    311         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    312     }
    313 
    314     @Test
    315     public void getCarConnectionSummary_multipleProfileConnectDisconnect() {
    316         mBatteryLevel = 10;
    317 
    318         // Set HFP, A2DP and PAN profile to be connected and test connection state summary
    319         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    320         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    321         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_CONNECTED);
    322         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, battery 10%");
    323 
    324         // Disconnect HFP only and test connection state summary
    325         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    326         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    327                 "Connected (no phone), battery 10%");
    328 
    329         // Disconnect A2DP only and test connection state summary
    330         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    331         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    332         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    333                 "Connected (no media), battery 10%");
    334 
    335         // Disconnect both HFP and A2DP and test connection state summary
    336         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    337         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    338                 "Connected (no phone or media), battery 10%");
    339 
    340         // Disconnect all profiles and test connection state summary
    341         mCachedDevice.onProfileStateChanged(mPanProfile, BluetoothProfile.STATE_DISCONNECTED);
    342         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    343     }
    344 
    345     @Test
    346     public void getCarConnectionSummary_singleProfileActiveDeviceA2dp() {
    347         // Test without battery level
    348         // Set A2DP profile to be connected and test connection state summary
    349         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    350         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    351 
    352         // Set device as Active for A2DP and test connection state summary
    353         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    354         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (media)");
    355 
    356         // Test with battery level
    357         mBatteryLevel = 10;
    358         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    359                 "Connected, battery 10%, active (media)");
    360 
    361         // Set A2DP profile to be disconnected and test connection state summary
    362         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    363         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    364 
    365         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    366         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    367         // Set A2DP profile to be connected, Active and test connection state summary
    368         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    369         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    370         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (media)");
    371 
    372         // Set A2DP profile to be disconnected and test connection state summary
    373         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    374         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    375     }
    376 
    377     @Test
    378     public void getCarConnectionSummary_singleProfileActiveDeviceHfp() {
    379         // Test without battery level
    380         // Set HFP profile to be connected and test connection state summary
    381         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    382         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    383 
    384         // Set device as Active for HFP and test connection state summary
    385         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    386         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (phone)");
    387 
    388         // Test with battery level
    389         mBatteryLevel = 10;
    390         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    391                 "Connected, battery 10%, active (phone)");
    392 
    393         // Set HFP profile to be disconnected and test connection state summary
    394         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    395         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    396 
    397         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    398         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    399         // Set HFP profile to be connected, Active and test connection state summary
    400         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    401         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    402         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active (phone)");
    403 
    404         // Set HFP profile to be disconnected and test connection state summary
    405         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    406         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    407     }
    408 
    409     @Test
    410     public void getCarConnectionSummary_singleProfileActiveDeviceHearingAid() {
    411         // Test without battery level
    412         // Set Hearing Aid profile to be connected and test connection state summary
    413         mCachedDevice.onProfileStateChanged(mHearingAidProfile, BluetoothProfile.STATE_CONNECTED);
    414         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    415 
    416         // Set device as Active for Hearing Aid and test connection state summary
    417         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEARING_AID);
    418         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
    419 
    420         // Set Hearing Aid profile to be disconnected and test connection state summary
    421         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEARING_AID);
    422         mCachedDevice.onProfileStateChanged(mHearingAidProfile,
    423                 BluetoothProfile.STATE_DISCONNECTED);
    424         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    425     }
    426 
    427     @Test
    428     public void getCarConnectionSummary_multipleProfilesActiveDevice() {
    429         // Test without battery level
    430         // Set A2DP and HFP profiles to be connected and test connection state summary
    431         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    432         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    433         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected");
    434 
    435         // Set device as Active for A2DP and HFP and test connection state summary
    436         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    437         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    438         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
    439 
    440         // Test with battery level
    441         mBatteryLevel = 10;
    442         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    443                 "Connected, battery 10%, active");
    444 
    445         // Disconnect A2DP only and test connection state summary
    446         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP);
    447         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    448         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    449                 "Connected (no media), battery 10%, active (phone)");
    450 
    451         // Disconnect HFP only and test connection state summary
    452         mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET);
    453         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    454         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    455         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    456         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo(
    457                 "Connected (no phone), battery 10%, active (media)");
    458 
    459         // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
    460         mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
    461         // Set A2DP and HFP profiles to be connected, Active and test connection state summary
    462         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    463         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    464         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
    465         mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
    466         assertThat(mCachedDevice.getCarConnectionSummary()).isEqualTo("Connected, active");
    467 
    468         // Set A2DP and HFP profiles to be disconnected and test connection state summary
    469         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    470         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    471         assertThat(mCachedDevice.getCarConnectionSummary()).isNull();
    472     }
    473 
    474 
    475     @Test
    476     public void testDeviceName_testAliasNameAvailable() {
    477         when(mDevice.getAliasName()).thenReturn(DEVICE_ALIAS);
    478         when(mDevice.getName()).thenReturn(DEVICE_NAME);
    479         CachedBluetoothDevice cachedBluetoothDevice =
    480                 new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice);
    481         // Verify alias is returned on getName
    482         assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS);
    483         // Verify device is visible
    484         assertThat(cachedBluetoothDevice.hasHumanReadableName()).isTrue();
    485     }
    486 
    487     @Test
    488     public void testDeviceName_testNameNotAvailable() {
    489         CachedBluetoothDevice cachedBluetoothDevice =
    490                 new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice);
    491         // Verify device address is returned on getName
    492         assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ADDRESS);
    493         // Verify device is not visible
    494         assertThat(cachedBluetoothDevice.hasHumanReadableName()).isFalse();
    495     }
    496 
    497     @Test
    498     public void testDeviceName_testRenameDevice() {
    499         final String[] alias = {DEVICE_ALIAS};
    500         doAnswer(invocation -> alias[0]).when(mDevice).getAliasName();
    501         doAnswer(invocation -> {
    502             alias[0] = (String) invocation.getArguments()[0];
    503             return true;
    504         }).when(mDevice).setAlias(anyString());
    505         when(mDevice.getName()).thenReturn(DEVICE_NAME);
    506         CachedBluetoothDevice cachedBluetoothDevice =
    507                 new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice);
    508         // Verify alias is returned on getName
    509         assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS);
    510         // Verify null name does not get set
    511         cachedBluetoothDevice.setName(null);
    512         verify(mDevice, never()).setAlias(any());
    513         // Verify new name is set properly
    514         cachedBluetoothDevice.setName(DEVICE_ALIAS_NEW);
    515         verify(mDevice).setAlias(DEVICE_ALIAS_NEW);
    516         // Verify new alias is returned on getName
    517         assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS_NEW);
    518     }
    519 
    520     @Test
    521     public void testSetActive() {
    522         when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
    523         when(mProfileManager.getHeadsetProfile()).thenReturn(mHfpProfile);
    524         when(mA2dpProfile.setActiveDevice(any(BluetoothDevice.class))).thenReturn(true);
    525         when(mHfpProfile.setActiveDevice(any(BluetoothDevice.class))).thenReturn(true);
    526 
    527         assertThat(mCachedDevice.setActive()).isFalse();
    528 
    529         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
    530         assertThat(mCachedDevice.setActive()).isTrue();
    531 
    532         mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
    533         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
    534         assertThat(mCachedDevice.setActive()).isTrue();
    535 
    536         mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
    537         assertThat(mCachedDevice.setActive()).isFalse();
    538     }
    539 
    540     @Test
    541     public void testIsA2dpDevice_isA2dpDevice() {
    542         when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
    543         when(mA2dpProfile.getConnectionStatus(mDevice)).
    544                 thenReturn(BluetoothProfile.STATE_CONNECTED);
    545 
    546         assertThat(mCachedDevice.isA2dpDevice()).isTrue();
    547     }
    548 
    549     @Test
    550     public void testIsA2dpDevice_isNotA2dpDevice() {
    551         when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
    552         when(mA2dpProfile.getConnectionStatus(mDevice)).
    553                 thenReturn(BluetoothProfile.STATE_DISCONNECTING);
    554 
    555         assertThat(mCachedDevice.isA2dpDevice()).isFalse();
    556     }
    557 
    558     @Test
    559     public void testIsHfpDevice_isHfpDevice() {
    560         when(mProfileManager.getHeadsetProfile()).thenReturn(mHfpProfile);
    561         when(mHfpProfile.getConnectionStatus(mDevice)).
    562                 thenReturn(BluetoothProfile.STATE_CONNECTED);
    563 
    564         assertThat(mCachedDevice.isHfpDevice()).isTrue();
    565     }
    566 
    567     @Test
    568     public void testIsHfpDevice_isNotHfpDevice() {
    569         when(mProfileManager.getHeadsetProfile()).thenReturn(mHfpProfile);
    570         when(mHfpProfile.getConnectionStatus(mDevice)).
    571                 thenReturn(BluetoothProfile.STATE_DISCONNECTING);
    572 
    573         assertThat(mCachedDevice.isHfpDevice()).isFalse();
    574     }
    575 }
    576