• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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