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