1 /* 2 * Copyright 2018 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.settings.connecteddevice; 17 18 import static com.android.settings.core.BasePreferenceController.AVAILABLE; 19 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; 20 21 import static com.google.common.truth.Truth.assertThat; 22 import static org.mockito.ArgumentMatchers.any; 23 import static org.mockito.Matchers.anyString; 24 import static org.mockito.Mockito.doReturn; 25 import static org.mockito.Mockito.spy; 26 import static org.mockito.Mockito.verify; 27 import static org.mockito.Mockito.when; 28 29 import android.content.Context; 30 import android.content.pm.PackageManager; 31 import android.media.AudioManager; 32 import android.support.v7.preference.Preference; 33 import android.support.v7.preference.PreferenceGroup; 34 import android.support.v7.preference.PreferenceManager; 35 import android.support.v7.preference.PreferenceScreen; 36 37 import com.android.settings.R; 38 import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater; 39 import com.android.settings.dashboard.DashboardFragment; 40 import com.android.settings.testutils.SettingsRobolectricTestRunner; 41 import com.android.settings.testutils.shadow.ShadowAudioManager; 42 import com.android.settings.testutils.shadow.ShadowBluetoothUtils; 43 import com.android.settingslib.bluetooth.BluetoothCallback; 44 import com.android.settingslib.bluetooth.BluetoothEventManager; 45 import com.android.settingslib.bluetooth.LocalBluetoothManager; 46 47 import org.junit.Before; 48 import org.junit.Test; 49 import org.junit.runner.RunWith; 50 import org.mockito.Answers; 51 import org.mockito.Mock; 52 import org.mockito.MockitoAnnotations; 53 import org.robolectric.RuntimeEnvironment; 54 import org.robolectric.annotation.Config; 55 56 @RunWith(SettingsRobolectricTestRunner.class) 57 @Config(shadows = { 58 ShadowAudioManager.class, 59 ShadowBluetoothUtils.class} 60 ) 61 public class AvailableMediaDeviceGroupControllerTest { 62 63 private static final String PREFERENCE_KEY_1 = "pref_key_1"; 64 65 @Mock 66 private DashboardFragment mDashboardFragment; 67 @Mock 68 private AvailableMediaBluetoothDeviceUpdater mAvailableMediaBluetoothDeviceUpdater; 69 @Mock 70 private PreferenceScreen mPreferenceScreen; 71 @Mock(answer = Answers.RETURNS_DEEP_STUBS) 72 private PreferenceManager mPreferenceManager; 73 @Mock 74 private PackageManager mPackageManager; 75 @Mock 76 private BluetoothEventManager mEventManager; 77 @Mock 78 private LocalBluetoothManager mLocalManager; 79 80 private PreferenceGroup mPreferenceGroup; 81 private Context mContext; 82 private Preference mPreference; 83 private AvailableMediaDeviceGroupController mAvailableMediaDeviceGroupController; 84 private LocalBluetoothManager mLocalBluetoothManager; 85 private ShadowAudioManager mShadowAudioManager; 86 87 @Before setUp()88 public void setUp() { 89 MockitoAnnotations.initMocks(this); 90 91 mContext = spy(RuntimeEnvironment.application); 92 mPreference = new Preference(mContext); 93 mPreference.setKey(PREFERENCE_KEY_1); 94 mPreferenceGroup = spy(new PreferenceScreen(mContext, null)); 95 when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager); 96 doReturn(mContext).when(mDashboardFragment).getContext(); 97 doReturn(mPackageManager).when(mContext).getPackageManager(); 98 doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); 99 100 ShadowBluetoothUtils.sLocalBluetoothManager = mLocalManager; 101 mLocalBluetoothManager = ShadowBluetoothUtils.getLocalBtManager(mContext); 102 mShadowAudioManager = ShadowAudioManager.getShadow(); 103 doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager(); 104 105 mAvailableMediaDeviceGroupController = new AvailableMediaDeviceGroupController(mContext); 106 mAvailableMediaDeviceGroupController. 107 setBluetoothDeviceUpdater(mAvailableMediaBluetoothDeviceUpdater); 108 mAvailableMediaDeviceGroupController.mPreferenceGroup = mPreferenceGroup; 109 } 110 111 @Test onDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded()112 public void onDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded() { 113 mAvailableMediaDeviceGroupController.onDeviceAdded(mPreference); 114 115 assertThat(mPreferenceGroup.isVisible()).isTrue(); 116 assertThat(mPreferenceGroup.findPreference(PREFERENCE_KEY_1)).isEqualTo(mPreference); 117 } 118 119 @Test onDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved()120 public void onDeviceRemoved_lastRemove_becomeInvisibleAndPreferenceRemoved() { 121 mPreferenceGroup.addPreference(mPreference); 122 123 mAvailableMediaDeviceGroupController.onDeviceRemoved(mPreference); 124 125 assertThat(mPreferenceGroup.isVisible()).isFalse(); 126 assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); 127 } 128 129 @Test onDeviceRemoved_notLastRemove_stillVisible()130 public void onDeviceRemoved_notLastRemove_stillVisible() { 131 mPreferenceGroup.setVisible(true); 132 mPreferenceGroup.addPreference(mPreference); 133 mPreferenceGroup.addPreference(new Preference(mContext)); 134 135 mAvailableMediaDeviceGroupController.onDeviceRemoved(mPreference); 136 137 assertThat(mPreferenceGroup.isVisible()).isTrue(); 138 } 139 140 @Test displayPreference_becomeInvisible()141 public void displayPreference_becomeInvisible() { 142 doReturn(mPreferenceGroup).when(mPreferenceScreen).findPreference(anyString()); 143 144 mAvailableMediaDeviceGroupController.displayPreference(mPreferenceScreen); 145 146 assertThat(mPreferenceGroup.isVisible()).isFalse(); 147 } 148 149 @Test testRegister()150 public void testRegister() { 151 // register the callback in onStart() 152 mAvailableMediaDeviceGroupController.onStart(); 153 verify(mAvailableMediaBluetoothDeviceUpdater).registerCallback(); 154 verify(mLocalBluetoothManager.getEventManager()).registerCallback( 155 any(BluetoothCallback.class)); 156 } 157 158 @Test testUnregister()159 public void testUnregister() { 160 // unregister the callback in onStop() 161 mAvailableMediaDeviceGroupController.onStop(); 162 verify(mAvailableMediaBluetoothDeviceUpdater).unregisterCallback(); 163 verify(mLocalBluetoothManager.getEventManager()).unregisterCallback( 164 any(BluetoothCallback.class)); 165 } 166 167 @Test testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported()168 public void testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported() { 169 doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); 170 171 assertThat(mAvailableMediaDeviceGroupController.getAvailabilityStatus()).isEqualTo( 172 UNSUPPORTED_ON_DEVICE); 173 } 174 175 @Test testGetAvailabilityStatus_BluetoothFeature_returnSupported()176 public void testGetAvailabilityStatus_BluetoothFeature_returnSupported() { 177 doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); 178 179 assertThat(mAvailableMediaDeviceGroupController.getAvailabilityStatus()).isEqualTo( 180 AVAILABLE); 181 } 182 183 @Test setTitle_inCallState_showCallStateTitle()184 public void setTitle_inCallState_showCallStateTitle() { 185 mShadowAudioManager.setMode(AudioManager.MODE_IN_CALL); 186 mAvailableMediaDeviceGroupController.onAudioModeChanged(); 187 188 assertThat(mPreferenceGroup.getTitle()).isEqualTo( 189 mContext.getText(R.string.connected_device_available_call_title)); 190 } 191 192 @Test setTitle_notInCallState_showMediaStateTitle()193 public void setTitle_notInCallState_showMediaStateTitle() { 194 mShadowAudioManager.setMode(AudioManager.MODE_NORMAL); 195 mAvailableMediaDeviceGroupController.onAudioModeChanged(); 196 197 assertThat(mPreferenceGroup.getTitle()).isEqualTo( 198 mContext.getText(R.string.connected_device_available_media_title)); 199 } 200 } 201