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