• 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.media.AudioDeviceInfo;
34 import android.os.Process;
35 
36 import androidx.test.ext.junit.runners.AndroidJUnit4;
37 
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 
42 import java.util.List;
43 
44 @RunWith(AndroidJUnit4.class)
45 public class CarAudioManagerTest extends CarApiTestBase {
46 
47     private static final int TEST_FLAGS = 0;
48 
49     private CarAudioManager mCarAudioManager;
50 
51     @Before
setUp()52     public void setUp() throws Exception {
53         mCarAudioManager = (CarAudioManager) getCar().getCarManager(AUDIO_SERVICE);
54         assertThat(mCarAudioManager).isNotNull();
55     }
56 
57     @Test
getVolumeGroupInfo()58     public void getVolumeGroupInfo() {
59         assumeDynamicRoutingIsEnabled();
60 
61         int groupCount = mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE);
62 
63         for (int index = 0; index < groupCount; index++) {
64             CarVolumeGroupInfo info =
65                     mCarAudioManager.getVolumeGroupInfo(PRIMARY_AUDIO_ZONE, index);
66             assertWithMessage("Car volume group info id for group %s", index)
67                     .that(info.getId()).isEqualTo(index);
68             assertWithMessage("Car volume group info zone for group %s", index)
69                     .that(info.getZoneId()).isEqualTo(PRIMARY_AUDIO_ZONE);
70         }
71     }
72 
73     @Test
getVolumeGroupInfosForZone()74     public void getVolumeGroupInfosForZone() {
75         assumeDynamicRoutingIsEnabled();
76 
77         int groupCount = mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE);
78 
79         List<CarVolumeGroupInfo> infos =
80                 mCarAudioManager.getVolumeGroupInfosForZone(PRIMARY_AUDIO_ZONE);
81 
82         assertWithMessage("Car volume group infos for primary zone")
83                 .that(infos).hasSize(groupCount);
84         for (int index = 0; index < groupCount; index++) {
85             CarVolumeGroupInfo info =
86                     mCarAudioManager.getVolumeGroupInfo(PRIMARY_AUDIO_ZONE, index);
87             assertWithMessage("Car volume group infos for primary zone and group %s", index)
88                     .that(infos).contains(info);
89         }
90     }
91 
92     @Test
test_getAudioZoneIds()93     public void test_getAudioZoneIds() throws Exception {
94         assumeDynamicRoutingIsEnabled();
95 
96         List<Integer> zoneIds = mCarAudioManager.getAudioZoneIds();
97         assertThat(zoneIds).isNotEmpty();
98         assertThat(zoneIds).contains(PRIMARY_AUDIO_ZONE);
99     }
100 
101     @Test
test_isAudioFeatureEnabled()102     public void test_isAudioFeatureEnabled() throws Exception {
103         // nothing to assert. Just call the API.
104         mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_DYNAMIC_ROUTING);
105         mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING);
106     }
107 
108     @Test
test_getVolumeGroupCount()109     public void test_getVolumeGroupCount() throws Exception {
110         int primaryZoneCount = mCarAudioManager.getVolumeGroupCount();
111         assertThat(
112                 mCarAudioManager.getVolumeGroupCount(PRIMARY_AUDIO_ZONE)).isEqualTo(
113                 primaryZoneCount);
114     }
115 
116     @Test
test_getGroupVolume()117     public void test_getGroupVolume() throws Exception {
118         int groudId = 0;
119         int volume = mCarAudioManager.getGroupVolume(groudId);
120         assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groudId))
121                 .isEqualTo(volume);
122         int maxVolume = mCarAudioManager.getGroupMaxVolume(groudId);
123         assertThat(mCarAudioManager.getGroupMaxVolume(PRIMARY_AUDIO_ZONE, groudId))
124                 .isEqualTo(maxVolume);
125         int minVolume = mCarAudioManager.getGroupMinVolume(groudId);
126         assertThat(mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groudId))
127                 .isEqualTo(minVolume);
128         assertThat(volume).isAtLeast(minVolume);
129         assertThat(volume).isAtMost(maxVolume);
130     }
131 
132     @Test
test_setGroupVolume()133     public void test_setGroupVolume() throws Exception {
134         int groudId = 0;
135         int volume = mCarAudioManager.getGroupVolume(groudId);
136         mCarAudioManager.setGroupVolume(groudId, volume, TEST_FLAGS);
137         mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groudId, volume, TEST_FLAGS);
138         assertThat(mCarAudioManager.getGroupVolume(groudId)).isEqualTo(volume);
139     }
140 
141     @Test
test_getInputDevicesForZoneId()142     public void test_getInputDevicesForZoneId() throws Exception {
143         assumeDynamicRoutingIsEnabled();
144 
145         List<AudioDeviceInfo> info = mCarAudioManager.getInputDevicesForZoneId(PRIMARY_AUDIO_ZONE);
146         assertThat(info).isNotEmpty();
147     }
148 
149     @Test
test_getOutputDeviceForUsage()150     public void test_getOutputDeviceForUsage() throws Exception {
151         assumeDynamicRoutingIsEnabled();
152 
153         AudioDeviceInfo device = mCarAudioManager.getOutputDeviceForUsage(
154                 PRIMARY_AUDIO_ZONE, USAGE_MEDIA);
155         assertThat(device).isNotNull();
156     }
157 
158     @Test
test_getVolumeGroupIdForUsage()159     public void test_getVolumeGroupIdForUsage() throws Exception {
160         int groupId = mCarAudioManager.getVolumeGroupIdForUsage(USAGE_MEDIA);
161         assertThat(mCarAudioManager.getVolumeGroupIdForUsage(PRIMARY_AUDIO_ZONE, USAGE_MEDIA))
162                 .isEqualTo(groupId);
163         int primaryZoneCount = mCarAudioManager.getVolumeGroupCount();
164         assertThat(groupId).isLessThan(primaryZoneCount);
165     }
166 
167     @Test
test_getZoneIdForUid()168     public void test_getZoneIdForUid() throws Exception {
169         assumeDynamicRoutingIsEnabled();
170 
171         assertThat(mCarAudioManager.getZoneIdForUid(Process.myUid())).isEqualTo(PRIMARY_AUDIO_ZONE);
172     }
173 
174     @Test
setVolumeGroupMute_toMute_mutesVolumeGroup()175     public void setVolumeGroupMute_toMute_mutesVolumeGroup() throws Exception {
176         assumeVolumeGroupMutingIsEnabled();
177         int groupId = 0;
178         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
179 
180         try {
181             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
182             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
183                     .isEqualTo(true);
184         } finally {
185             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
186         }
187     }
188 
189     @Test
setVolumeGroupMute_toUnMute_unMutesVolumeGroup()190     public void setVolumeGroupMute_toUnMute_unMutesVolumeGroup() throws Exception {
191         assumeVolumeGroupMutingIsEnabled();
192         int groupId = 0;
193         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
194 
195         try {
196             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, false, TEST_FLAGS);
197             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
198                     .isEqualTo(false);
199         } finally {
200             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
201         }
202     }
203 
204     @Test
setGroupVolume_whileMuted_unMutesVolumeGroup()205     public void setGroupVolume_whileMuted_unMutesVolumeGroup() throws Exception {
206         assumeVolumeGroupMutingIsEnabled();
207         int groupId = 0;
208         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
209         int volume = mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
210         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
211 
212         try {
213             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
214 
215             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, minVolume, TEST_FLAGS);
216             assertThat(mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId))
217                     .isEqualTo(false);
218         } finally {
219             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
220             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, volume, TEST_FLAGS);
221         }
222     }
223 
224     @Test
getGroupVolume_whileMuted_returnsMinVolume()225     public void getGroupVolume_whileMuted_returnsMinVolume() throws Exception {
226         assumeVolumeGroupMutingIsEnabled();
227         int groupId = 0;
228         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
229         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
230 
231         try {
232             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
233 
234             assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId))
235                     .isEqualTo(minVolume);
236         } finally {
237             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
238         }
239     }
240 
241     @Test
getGroupVolume_whileUnMuted_returnLastSetValue()242     public void getGroupVolume_whileUnMuted_returnLastSetValue() throws Exception {
243         assumeVolumeGroupMutingIsEnabled();
244         int groupId = 0;
245         boolean  muteState = mCarAudioManager.isVolumeGroupMuted(PRIMARY_AUDIO_ZONE, groupId);
246         int volume = mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
247         int minVolume = mCarAudioManager.getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
248         int maxVolume = mCarAudioManager.getGroupMaxVolume(PRIMARY_AUDIO_ZONE, groupId);
249         int testVolume = (minVolume + maxVolume) / 2;
250 
251         try {
252             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, testVolume, TEST_FLAGS);
253 
254             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, true, TEST_FLAGS);
255 
256             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, false, TEST_FLAGS);
257 
258             assertThat(mCarAudioManager.getGroupVolume(PRIMARY_AUDIO_ZONE, groupId))
259                     .isEqualTo(testVolume);
260         } finally {
261             mCarAudioManager.setVolumeGroupMute(PRIMARY_AUDIO_ZONE, groupId, muteState, TEST_FLAGS);
262             mCarAudioManager.setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, volume, TEST_FLAGS);
263         }
264     }
265 
266     @Test
test_isPlaybackOnVolumeGroupActive()267     public void test_isPlaybackOnVolumeGroupActive() throws Exception {
268         assumeDynamicRoutingIsEnabled();
269 
270         // TODO(b/191660867): Better to change this to play something and asert true.
271         assertThat(
272                 mCarAudioManager.isPlaybackOnVolumeGroupActive(PRIMARY_AUDIO_ZONE,
273                         0)).isFalse();
274     }
275 
assumeDynamicRoutingIsEnabled()276     private void assumeDynamicRoutingIsEnabled() {
277         assumeTrue(mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_DYNAMIC_ROUTING));
278     }
assumeVolumeGroupMutingIsEnabled()279     private void assumeVolumeGroupMutingIsEnabled() {
280         assumeTrue(mCarAudioManager.isAudioFeatureEnabled(AUDIO_FEATURE_VOLUME_GROUP_MUTING));
281     }
282 }
283