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