blob: 5c04921f39b2ef5c6188b7dd28481458802a60f5 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car.audio;
import static com.android.car.audio.CarAudioContext.EMERGENCY;
import static com.android.car.audio.CarAudioContext.MUSIC;
import static com.android.car.audio.CarAudioContext.NAVIGATION;
import static com.android.car.audio.CarAudioContext.SAFETY;
import static com.android.car.audio.CarAudioContext.VOICE_COMMAND;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.expectThrows;
import android.car.media.CarAudioManager;
import android.hardware.automotive.audiocontrol.MutingInfo;
import android.util.SparseArray;
import com.android.car.audio.hal.AudioControlWrapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
@RunWith(MockitoJUnitRunner.class)
public final class CarVolumeGroupMutingTest {
private static final String PRIMARY_MEDIA_ADDRESS = "media";
private static final String PRIMARY_NAVIGATION_ADDRESS = "navigation";
private static final String PRIMARY_VOICE_ADDRESS = "voice";
private static final String SECONDARY_ADDRESS = "secondary";
private static final String TERTIARY_ADDRESS = "tertiary";
private static final String EMERGENCY_ADDRESS = "emergency";
private static final String SAFETY_ADDRESS = "safety";
private static final int PRIMARY_ZONE_ID = CarAudioManager.PRIMARY_AUDIO_ZONE;
private static final int SECONDARY_ZONE_ID = CarAudioManager.PRIMARY_AUDIO_ZONE + 1;
private static final int TERTIARY_ZONE_ID = CarAudioManager.PRIMARY_AUDIO_ZONE + 2;
private CarAudioZone mPrimaryAudioZone;
private CarVolumeGroup mMusicCarVolumeGroup;
private CarVolumeGroup mNavigationCarVolumeGroup;
private CarVolumeGroup mVoiceCarVolumeGroup;
private CarVolumeGroup mSecondaryZoneVolumeGroup;
private CarAudioZone mSingleDevicePrimaryZone;
private CarAudioZone mSingleDeviceSecondaryZone;
private CarAudioZone mSingleDeviceTertiaryZone;
private CarVolumeGroup mTertiaryZoneVolumeGroup;
@Mock
AudioControlWrapper mMockAudioControlWrapper;
@Before
public void setUp() {
mMusicCarVolumeGroup = groupWithContextAndAddress(MUSIC, PRIMARY_MEDIA_ADDRESS);
mNavigationCarVolumeGroup = groupWithContextAndAddress(NAVIGATION,
PRIMARY_NAVIGATION_ADDRESS);
mVoiceCarVolumeGroup = groupWithContextAndAddress(VOICE_COMMAND, PRIMARY_VOICE_ADDRESS);
mSecondaryZoneVolumeGroup = groupWithContextAndAddress(MUSIC, SECONDARY_ADDRESS);
mTertiaryZoneVolumeGroup = groupWithContextAndAddress(MUSIC, TERTIARY_ADDRESS);
mPrimaryAudioZone =
new TestCarAudioZoneBuilder("Primary Zone", PRIMARY_ZONE_ID)
.addVolumeGroup(mMusicCarVolumeGroup)
.addVolumeGroup(mNavigationCarVolumeGroup)
.addVolumeGroup(mVoiceCarVolumeGroup)
.build();
mSingleDevicePrimaryZone = createAudioZone(mMusicCarVolumeGroup, "Primary Zone",
PRIMARY_ZONE_ID);
mSingleDeviceSecondaryZone = createAudioZone(mSecondaryZoneVolumeGroup, "Secondary Zone",
SECONDARY_ZONE_ID);
mSingleDeviceTertiaryZone = createAudioZone(mTertiaryZoneVolumeGroup, "Tertiary Zone",
TERTIARY_ZONE_ID);
when(mMockAudioControlWrapper
.supportsFeature(AudioControlWrapper.AUDIOCONTROL_FEATURE_AUDIO_GROUP_MUTING))
.thenReturn(true);
}
@Test
public void constructor_withNullZones_fails() {
NullPointerException thrown = expectThrows(NullPointerException.class, () -> {
new CarVolumeGroupMuting(null, mMockAudioControlWrapper);
});
assertWithMessage("Constructor exception")
.that(thrown).hasMessageThat().contains("Car Audio Zones");
}
@Test
public void constructor_withEmptyZonesList_fails() {
IllegalArgumentException thrown = expectThrows(IllegalArgumentException.class, () -> {
new CarVolumeGroupMuting(new SparseArray<>(), mMockAudioControlWrapper);
});
assertWithMessage("Constructor exception")
.that(thrown).hasMessageThat().contains("zone must be present");
}
@Test
public void constructor_withNullAudioControlWrapper_fails() {
NullPointerException thrown = expectThrows(NullPointerException.class, () -> {
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone), null);
});
assertWithMessage("Constructor exception")
.that(thrown).hasMessageThat().contains("Audio Control Wrapper");
}
@Test
public void constructor_withGroupMutingFeatureNotSupported_fails() {
when(mMockAudioControlWrapper
.supportsFeature(AudioControlWrapper.AUDIOCONTROL_FEATURE_AUDIO_GROUP_MUTING))
.thenReturn(false);
IllegalStateException thrown = expectThrows(IllegalStateException.class, () -> {
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone), mMockAudioControlWrapper);
});
assertWithMessage("Constructor exception")
.that(thrown).hasMessageThat().contains("IAudioControl");
}
@Test
public void constructor_withZoneList_initializedWithEmptyInfoList() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
assertWithMessage("Last muting information")
.that(carGroupMuting.getLastMutingInformation()).isEmpty();
}
@Test
public void carMuteChanged_withNoGroupMuted_forSingleZone_setsEmptyMutedDevices() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().isEmpty();
}
@Test
public void carMuteChanged_withNoGroupMuted_forSingleZone_setsAllDeviceUnMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToUnmute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void carMuteChanged_withMusicGroupMuted_forSingleZone_setsMusicDeviceToMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS);
}
@Test
public void carMuteChanged_withMusicGroupMuted_forSingleZone_setOtherDeviceToUnMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToUnmute).asList().containsExactly(
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void carMuteChanged_withAllGroupsMuted_forSingleZone_setsAllDevicesMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, true);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void carMuteChanged_withAllGroupsMuted_forSingleZone_setsUnMutedDevicesToEmpty() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, true);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mPrimaryAudioZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
List<MutingInfo> mutingInfo = captureMutingInfoList();
MutingInfo info = mutingInfo.get(mutingInfo.size() - 1);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToUnmute).asList().isEmpty();
}
@Test
public void carMuteChanged_withNoGroupsMuted_forMultiZones_setMultipleZoneInfo() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mSecondaryZoneVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mTertiaryZoneVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mSingleDevicePrimaryZone,
mSingleDeviceSecondaryZone, mSingleDeviceTertiaryZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
assertWithMessage("Last muting information")
.that(captureMutingInfoList()).hasSize(3);
}
@Test
public void carMuteChanged_withNoGroupsMuted_forMultiZones_setsAllZonesDevicesUnMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mSecondaryZoneVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mTertiaryZoneVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mSingleDevicePrimaryZone,
mSingleDeviceSecondaryZone, mSingleDeviceTertiaryZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
for (MutingInfo info : captureMutingInfoList()) {
assertWithMessage("Devices addresses to un-mute for zone %s", info.zoneId)
.that(info.deviceAddressesToUnmute).asList().hasSize(1);
}
}
@Test
public void carMuteChanged_withOneZoneMuted_forMultiZones_setsOnlyOneZoneMuted() {
setUpCarVolumeGroupIsMuted(mSecondaryZoneVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mTertiaryZoneVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mSingleDevicePrimaryZone,
mSingleDeviceSecondaryZone, mSingleDeviceTertiaryZone),
mMockAudioControlWrapper);
carGroupMuting.carMuteChanged();
for (MutingInfo info : captureMutingInfoList()) {
if (info.zoneId != SECONDARY_ZONE_ID) {
continue;
}
assertWithMessage("Secondary zone devices addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(SECONDARY_ADDRESS);
}
}
@Test
public void setRestrictMuting_isMutingRestrictedTrue_mutesNonCriticalVolumeGroups() {
setUpCarVolumeGroupIsMuted(mSecondaryZoneVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mTertiaryZoneVolumeGroup, false);
CarVolumeGroupMuting carGroupMuting =
new CarVolumeGroupMuting(getAudioZones(mSingleDevicePrimaryZone,
mSingleDeviceSecondaryZone, mSingleDeviceTertiaryZone),
mMockAudioControlWrapper);
carGroupMuting.setRestrictMuting(true);
for (MutingInfo info : captureMutingInfoList()) {
assertWithMessage("Devices addresses to mute for zone %s", info.zoneId)
.that(info.deviceAddressesToMute).asList().hasSize(1);
}
}
@Test
public void setRestrictMuting_isMutingRestrictedTrue_leavesCriticalGroupsAsIs() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupHasCriticalAudioContexts(mMusicCarVolumeGroup);
setUpCarVolumeGroupIsMuted(mSecondaryZoneVolumeGroup, true);
setUpCarVolumeGroupHasCriticalAudioContexts(mSecondaryZoneVolumeGroup);
CarVolumeGroupMuting carGroupMuting = new CarVolumeGroupMuting(
getAudioZones(mSingleDevicePrimaryZone, mSingleDeviceSecondaryZone),
mMockAudioControlWrapper);
carGroupMuting.setRestrictMuting(true);
for (MutingInfo info : captureMutingInfoList()) {
if (info.zoneId == PRIMARY_ZONE_ID) {
assertWithMessage("Devices addresses to unmute for zone %s", info.zoneId)
.that(info.deviceAddressesToUnmute).asList().containsExactly(
PRIMARY_MEDIA_ADDRESS);
} else if (info.zoneId == SECONDARY_ZONE_ID) {
assertWithMessage("Devices addresses to mute for zone %s", info.zoneId)
.that(info.deviceAddressesToMute).asList().containsExactly(
SECONDARY_ADDRESS);
}
}
}
@Test
public void generateMutingInfoFromZone_withNoGroupsMuted_returnsEmptyMutedList() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(mPrimaryAudioZone,
/* isMutingRestricted= */ false);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().isEmpty();
}
@Test
public void generateMutingInfoFromZone_withOneGroupMuted_returnsOneMutedDevice() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, false);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, false);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(mPrimaryAudioZone,
/* isMutingRestricted= */ false);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS);
}
@Test
public void generateMutingInfoFromZone_withAllGroupsMuted_returnsAllDevicesMuted() {
setUpCarVolumeGroupIsMuted(mMusicCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mNavigationCarVolumeGroup, true);
setUpCarVolumeGroupIsMuted(mVoiceCarVolumeGroup, true);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(mPrimaryAudioZone,
/* isMutingRestricted= */ false);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void generateMutingInfoFromZone_withMutedMultiDeviceGroup_returnsAllDevicesMuted() {
CarAudioZone primaryZone = createAudioZone(
new VolumeGroupBuilder()
.addDeviceAddressAndContexts(MUSIC, PRIMARY_MEDIA_ADDRESS)
.addDeviceAddressAndContexts(VOICE_COMMAND, PRIMARY_VOICE_ADDRESS)
.addDeviceAddressAndContexts(NAVIGATION, PRIMARY_NAVIGATION_ADDRESS)
.setIsMuted(true)
.build(), "Primary Zone", PRIMARY_ZONE_ID);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(primaryZone,
/* isMutingRestricted= */ false);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void generateMutingInfoFromZone_withUnMutedMultiDeviceGroup_returnsAllDevicesUnMuted() {
CarAudioZone primaryZone = createAudioZone(
new VolumeGroupBuilder()
.addDeviceAddressAndContexts(MUSIC, PRIMARY_MEDIA_ADDRESS)
.addDeviceAddressAndContexts(VOICE_COMMAND, PRIMARY_VOICE_ADDRESS)
.addDeviceAddressAndContexts(NAVIGATION, PRIMARY_NAVIGATION_ADDRESS)
.build(), "Primary Zone", PRIMARY_ZONE_ID);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(primaryZone,
/* isMutingRestricted= */ false);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToUnmute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void generateMutingInfoFromZone_mutingRestricted_mutesAllNonCriticalDevices() {
CarAudioZone primaryZone = createAudioZone(
new VolumeGroupBuilder()
.addDeviceAddressAndContexts(MUSIC, PRIMARY_MEDIA_ADDRESS)
.addDeviceAddressAndContexts(VOICE_COMMAND, PRIMARY_VOICE_ADDRESS)
.addDeviceAddressAndContexts(NAVIGATION, PRIMARY_NAVIGATION_ADDRESS)
.build(), "Primary Zone", PRIMARY_ZONE_ID);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(primaryZone,
/* isMutingRestricted= */ true);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToMute).asList().containsExactly(PRIMARY_MEDIA_ADDRESS,
PRIMARY_NAVIGATION_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
@Test
public void generateMutingInfoFromZone_mutingRestricted_setsAllCriticalGroupsToTheirState() {
CarAudioZone primaryZone =
new TestCarAudioZoneBuilder("Primary Zone", PRIMARY_ZONE_ID)
.addVolumeGroup(new VolumeGroupBuilder()
.addDeviceAddressAndContexts(EMERGENCY, EMERGENCY_ADDRESS)
.addDeviceAddressAndContexts(VOICE_COMMAND, PRIMARY_VOICE_ADDRESS)
.build())
.addVolumeGroup(new VolumeGroupBuilder()
.addDeviceAddressAndContexts(SAFETY, SAFETY_ADDRESS)
.addDeviceAddressAndContexts(NAVIGATION, PRIMARY_NAVIGATION_ADDRESS)
.setIsMuted(true)
.build()
)
.build();
setUpCarVolumeGroupHasCriticalAudioContexts(primaryZone.getVolumeGroups()[0]);
setUpCarVolumeGroupHasCriticalAudioContexts(primaryZone.getVolumeGroups()[1]);
MutingInfo info = CarVolumeGroupMuting.generateMutingInfoFromZone(primaryZone,
/* isMutingRestricted= */ true);
assertWithMessage("Device addresses to mute")
.that(info.deviceAddressesToMute).asList()
.containsExactly(SAFETY_ADDRESS, PRIMARY_NAVIGATION_ADDRESS);
assertWithMessage("Device addresses to un-mute")
.that(info.deviceAddressesToUnmute).asList()
.containsExactly(EMERGENCY_ADDRESS, PRIMARY_VOICE_ADDRESS);
}
private CarAudioZone createAudioZone(CarVolumeGroup volumeGroup, String name, int zoneId) {
return new TestCarAudioZoneBuilder(name, zoneId)
.addVolumeGroup(volumeGroup)
.build();
}
private CarVolumeGroup groupWithContextAndAddress(int context, String address) {
return new VolumeGroupBuilder().addDeviceAddressAndContexts(context, address).build();
}
private List<MutingInfo> captureMutingInfoList() {
ArgumentCaptor<List<MutingInfo>> captor = ArgumentCaptor.forClass(List.class);
verify(mMockAudioControlWrapper).onDevicesToMuteChange(captor.capture());
return captor.getValue();
}
private void setUpCarVolumeGroupIsMuted(CarVolumeGroup carVolumeGroup, boolean muted) {
when(carVolumeGroup.isMuted()).thenReturn(muted);
}
private void setUpCarVolumeGroupHasCriticalAudioContexts(CarVolumeGroup carVolumeGroup) {
when(carVolumeGroup.hasCriticalAudioContexts()).thenReturn(true);
}
private SparseArray<CarAudioZone> getAudioZones(CarAudioZone... zones) {
SparseArray<CarAudioZone> audioZones = new SparseArray<>();
for (CarAudioZone zone : zones) {
audioZones.put(zone.getId(), zone);
}
return audioZones;
}
}