• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 
17 package android.car.apitest.media;
18 
19 import static android.car.Car.AUDIO_SERVICE;
20 import static android.car.media.CarAudioManager.AUDIO_FEATURE_DYNAMIC_ROUTING;
21 import static android.car.media.CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING;
22 import static android.car.media.CarAudioManager.PRIMARY_AUDIO_ZONE;
23 import static android.media.AudioAttributes.USAGE_MEDIA;
24 
25 import static com.google.common.truth.Truth.assertThat;
26 import static com.google.common.truth.Truth.assertWithMessage;
27 
28 import static org.junit.Assume.assumeTrue;
29 
30 import android.car.apitest.CarApiTestBase;
31 import android.car.media.CarAudioManager;
32 import android.car.media.CarVolumeGroupInfo;
33 import android.car.test.ApiCheckerRule.Builder;
34 import android.media.AudioDeviceInfo;
35 import android.os.Process;
36 import android.util.Log;
37 
38 import androidx.test.ext.junit.runners.AndroidJUnit4;
39 
40 import org.junit.Before;
41 import org.junit.Test;
42 import org.junit.runner.RunWith;
43 
44 import java.util.List;
45 
46 @RunWith(AndroidJUnit4.class)
47 public final class CarAudioManagerTest extends CarApiTestBase {
48 
49     private static final String TAG  = CarAudioManagerTest.class.getSimpleName();
50 
51     private static final int TEST_FLAGS = 0;
52 
53     private CarAudioManager mCarAudioManager;
54 
55     // TODO(b/242350638): add missing annotations, remove (on child bug of 242350638)
56     @Override
configApiCheckerRule(Builder builder)57     protected void configApiCheckerRule(Builder builder) {
58         Log.w(TAG, "Disabling API requirements check");
59         builder.disableAnnotationsCheck();
60     }
61 
62     @Before
setUp()63     public void setUp() throws Exception {
64         mCarAudioManager = (CarAudioManager) getCar().getCarManager(AUDIO_SERVICE);
65         assertThat(mCarAudioManager).isNotNull();
66     }
67 
68     @Test
getVolumeGroupInfo()69     public void getVolumeGroupInfo() {
70         assumeDynamicRoutingIsEnabled();
71 
72         int groupCount = mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE);
73 
74         for (int index = 0; index < groupCount; index++) {
75             CarVolumeGroupInfo info =
76                     mCarAudioManager.getVolumeGroupInfo(PRIMARY_AUDIO_ZONE, index);
77             expectWithMessage("Car volume group info id for group %s", index)
78                     .that(info.getId()).isEqualTo(index);
79             expectWithMessage("Car volume group info zone for group %s", index)
80                     .that(info.getZoneId()).isEqualTo(PRIMARY_AUDIO_ZONE);
81         }
82     }
83 
84     @Test
getVolumeGroupInfosForZone()85     public void getVolumeGroupInfosForZone() {
86         assumeDynamicRoutingIsEnabled();
87 
88         int groupCount = mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE);
89 
90         List<CarVolumeGroupInfo> infos =
91                 mCarAudioManager.getVolumeGroupInfosForZone(PRIMARY_AUDIO_ZONE);
92 
93         expectWithMessage("Car volume group infos for primary zone")
94                 .that(infos).hasSize(groupCount);
95         for (int index = 0; index < groupCount; index++) {
96             CarVolumeGroupInfo info =
97                     mCarAudioManager.getVolumeGroupInfo(PRIMARY_AUDIO_ZONE, index);
98             expectWithMessage("Car volume group infos for primary zone and group %s", index)
99                     .that(infos).contains(info);
100         }
101     }
102 
103     @Test
test_getAudioZoneIds()104     public void test_getAudioZoneIds() throws Exception {
105         assumeDynamicRoutingIsEnabled();
106 
107         List<Integer> zoneIds = mCarAudioManager.getAudioZoneIds();
108         assertThat(zoneIds).isNotEmpty();
109         assertThat(zoneIds).contains(PRIMARY_AUDIO_ZONE);
110     }
111 
112     @Test
test_isAudioFeatureEnabled()113     public void test_isAudioFeatureEnabled() throws Exception {
114         // nothing to assert. Just call the API.
115         mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_DYNAMIC_ROUTING);
116         mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING);
117     }
118 
119     @Test
test_getVolumeGroupCount()120     public void test_getVolumeGroupCount() throws Exception {
121         int primaryZoneCount = mCarAudioManager.getVolumeGroupCount();
122         assertThat(
123                 mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE)).isEqualTo(
124                 primaryZoneCount);
125     }
126 
127     @Test
test_getGroupVolume()128     public void test_getGroupVolume() throws Exception {
129         int groudId = 0;
130         int volume = mCarAudioManager.getGroupVolume(groudId);
131         assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groudId))
132                 .isEqualTo(volume);
133         int maxVolume = mCarAudioManager.getGroupMaxVolume(groudId);
134         assertThat(mCarAudioManager.getGroupMaxVolume(PRIMARY_AUDIO_ZONE, groudId))
135                 .isEqualTo(maxVolume);
136         int minVolume = mCarAudioManager.getGroupMinVolume(groudId);
137         assertThat(mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groudId))
138                 .isEqualTo(minVolume);
139         assertThat(volume).isAtLeast(minVolume);
140         assertThat(volume).isAtMost(maxVolume);
141     }
142 
143     @Test
test_setGroupVolume()144     public void test_setGroupVolume() throws Exception {
145         int groudId = 0;
146         int volume = mCarAudioManager.getGroupVolume(groudId);
147         mCarAudioManager.setGroupVolume(groudId, volume, TEST_FLAGS);
148         mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groudId, volume, TEST_FLAGS);
149         assertThat(mCarAudioManager.getGroupVolume(groudId)).isEqualTo(volume);
150     }
151 
152     @Test
test_getInputDevicesForZoneId()153     public void test_getInputDevicesForZoneId() throws Exception {
154         assumeDynamicRoutingIsEnabled();
155 
156         List<AudioDeviceInfo> info = mCarAudioManager.getInputDevicesForZoneId(PRIMARY_AUDIO_ZONE);
157         assertThat(info).isNotEmpty();
158     }
159 
160     @Test
test_getOutputDeviceForUsage()161     public void test_getOutputDeviceForUsage() throws Exception {
162         assumeDynamicRoutingIsEnabled();
163 
164         AudioDeviceInfo device = mCarAudioManager.getOutputDeviceForUsage(
165                 PRIMARY_AUDIO_ZONE, USAGE_MEDIA);
166         assertThat(device).isNotNull();
167     }
168 
169     @Test
test_getVolumeGroupIdForUsage()170     public void test_getVolumeGroupIdForUsage() throws Exception {
171         int groupId = mCarAudioManager.getVolumeGroupIdForUsage(USAGE_MEDIA);
172         assertThat(mCarAudioManager.getVolumeGroupIdForUsage(PRIMARY_AUDIO_ZONE, USAGE_MEDIA))
173                 .isEqualTo(groupId);
174         int primaryZoneCount = mCarAudioManager.getVolumeGroupCount();
175         assertThat(groupId).isLessThan(primaryZoneCount);
176     }
177 
178     @Test
test_getZoneIdForUid()179     public void test_getZoneIdForUid() throws Exception {
180         assumeDynamicRoutingIsEnabled();
181 
182         assertThat(mCarAudioManager.getZoneIdForUid(Process.myUid())).isEqualTo(PRIMARY_AUDIO_ZONE);
183     }
184 
185     @Test
setVolumeGroupMute_toMute_mutesVolumeGroup()186     public void setVolumeGroupMute_toMute_mutesVolumeGroup() throws Exception {
187         assumeVolumeGroupMutingIsEnabled();
188         int groupId = 0;
189         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
190 
191         try {
192             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
193             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
194                     .isEqualTo(true);
195         } finally {
196             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
197         }
198     }
199 
200     @Test
setVolumeGroupMute_toUnMute_unMutesVolumeGroup()201     public void setVolumeGroupMute_toUnMute_unMutesVolumeGroup() throws Exception {
202         assumeVolumeGroupMutingIsEnabled();
203         int groupId = 0;
204         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
205 
206         try {
207             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, false, TEST_FLAGS);
208             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
209                     .isEqualTo(false);
210         } finally {
211             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
212         }
213     }
214 
215     @Test
setGroupVolume_whileMuted_unMutesVolumeGroup()216     public void setGroupVolume_whileMuted_unMutesVolumeGroup() throws Exception {
217         assumeVolumeGroupMutingIsEnabled();
218         int groupId = mCarAudioManager.getVolumeGroupIdForUsage(USAGE_MEDIA);
219         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
220         assumeTrue("Mutable group shall have zero min index", minVolume == 0);
221         boolean muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
222         int volume = mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
223 
224         try {
225             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, /* mute= */ true,
226                     TEST_FLAGS);
227             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, minVolume, TEST_FLAGS);
228 
229             assertWithMessage("Un-muted volume group for group %s in zone %s", groupId,
230                     PRIMARY_AUDIO_ZONE).that(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE,
231                     groupId)).isEqualTo(false);
232         } finally {
233             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
234             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, volume, TEST_FLAGS);
235         }
236     }
237 
238     @Test
setGroupVolumeToZero_doesNotMuteVolumeGroup()239     public void setGroupVolumeToZero_doesNotMuteVolumeGroup() throws Exception {
240         assumeVolumeGroupMutingIsEnabled();
241         int groupId = mCarAudioManager.getVolumeGroupIdForUsage(USAGE_MEDIA);
242         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
243         assumeTrue("Mutable group shall have zero min index", minVolume == 0);
244         boolean muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
245         int volume = mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
246 
247         try {
248             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, minVolume, TEST_FLAGS);
249 
250             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
251                     .isEqualTo(false);
252         } finally {
253             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
254             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, volume, TEST_FLAGS);
255         }
256     }
257 
258     @Test
getGroupVolume_whileMuted_returnsMinVolume()259     public void getGroupVolume_whileMuted_returnsMinVolume() throws Exception {
260         assumeVolumeGroupMutingIsEnabled();
261         int groupId = 0;
262         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
263         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
264 
265         try {
266             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
267 
268             assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId))
269                     .isEqualTo(minVolume);
270         } finally {
271             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
272         }
273     }
274 
275     @Test
getGroupVolume_whileUnMuted_returnLastSetValue()276     public void getGroupVolume_whileUnMuted_returnLastSetValue() throws Exception {
277         assumeVolumeGroupMutingIsEnabled();
278         int groupId = 0;
279         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
280         int volume = mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
281         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
282         int maxVolume = mCarAudioManager.getGroupMaxVolume(PRIMARY_AUDIO_ZONE, groupId);
283         int testVolume = (minVolume + maxVolume) / 2;
284 
285         try {
286             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, testVolume, TEST_FLAGS);
287 
288             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
289 
290             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, false, TEST_FLAGS);
291 
292             assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId))
293                     .isEqualTo(testVolume);
294         } finally {
295             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
296             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, volume, TEST_FLAGS);
297         }
298     }
299 
300     @Test
test_isPlaybackOnVolumeGroupActive()301     public void test_isPlaybackOnVolumeGroupActive() throws Exception {
302         assumeDynamicRoutingIsEnabled();
303 
304         // TODO(b/191660867): Better to change this to play something and asert true.
305         assertThat(
306                 mCarAudioManager.isPlaybackOnVolumeGroupActive(PRIMARY_AUDIO_ZONE,
307                         0)).isFalse();
308     }
309 
assumeDynamicRoutingIsEnabled()310     private void assumeDynamicRoutingIsEnabled() {
311         assumeTrue(mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_DYNAMIC_ROUTING));
312     }
assumeVolumeGroupMutingIsEnabled()313     private void assumeVolumeGroupMutingIsEnabled() {
314         assumeTrue(mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING));
315     }
316 }
317