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