blob: ffaa4cb934a372e2a3819189e72c2ba6234c4206 [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.ALARM;
import static com.android.car.audio.CarAudioContext.CALL;
import static com.android.car.audio.CarAudioContext.CALL_RING;
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.NOTIFICATION;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
import static org.testng.Assert.expectThrows;
import android.annotation.UserIdInt;
import android.hardware.automotive.audiocontrol.AudioGainConfigInfo;
import android.hardware.automotive.audiocontrol.Reasons;
import android.os.UserHandle;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.List;
@RunWith(MockitoJUnitRunner.class)
public class CarVolumeGroupUnitTest {
private static final int ZONE_ID = 0;
private static final int GROUP_ID = 0;
private static final int STEP_VALUE = 2;
private static final int MIN_GAIN = 3;
private static final int MAX_GAIN = 10;
private static final int DEFAULT_GAIN = 5;
private static final int DEFAULT_GAIN_INDEX = (DEFAULT_GAIN - MIN_GAIN) / STEP_VALUE;
private static final int MIN_GAIN_INDEX = 0;
private static final int MAX_GAIN_INDEX = (MAX_GAIN - MIN_GAIN) / STEP_VALUE;
private static final int TEST_GAIN_INDEX = 2;
private static final int TEST_USER_10 = 10;
private static final int TEST_USER_11 = 11;
private static final String MEDIA_DEVICE_ADDRESS = "music";
private static final String NAVIGATION_DEVICE_ADDRESS = "navigation";
private static final String OTHER_ADDRESS = "other_address";
private CarAudioDeviceInfo mMediaDeviceInfo;
private CarAudioDeviceInfo mNavigationDeviceInfo;
@Mock
CarAudioSettings mSettingsMock;
@Before
public void setUp() {
mMediaDeviceInfo = new InfoBuilder(MEDIA_DEVICE_ADDRESS).build();
mNavigationDeviceInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS).build();
}
@Test
public void setDeviceInfoForContext_associatesDeviceAddresses() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
builder.setDeviceInfoForContext(NAVIGATION, mNavigationDeviceInfo);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("%s and %s", MEDIA_DEVICE_ADDRESS, NAVIGATION_DEVICE_ADDRESS)
.that(carVolumeGroup.getAddresses()).containsExactly(MEDIA_DEVICE_ADDRESS,
NAVIGATION_DEVICE_ADDRESS);
}
@Test
public void setDeviceInfoForContext_associatesContexts() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
builder.setDeviceInfoForContext(NAVIGATION, mNavigationDeviceInfo);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("Music[%s] and Navigation[%s] Context", MUSIC, NAVIGATION)
.that(carVolumeGroup.getContexts()).asList().containsExactly(MUSIC, NAVIGATION);
}
@Test
public void setDeviceInfoForContext_withDifferentStepSize_throws() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo differentStepValueDevice = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setStepValue(mMediaDeviceInfo.getStepValue() + 1).build();
IllegalArgumentException thrown = expectThrows(IllegalArgumentException.class,
() -> builder.setDeviceInfoForContext(NAVIGATION,
differentStepValueDevice));
assertWithMessage("setDeviceInfoForContext failure for different step size")
.that(thrown).hasMessageThat()
.contains("Gain controls within one group must have same step value");
}
@Test
public void setDeviceInfoForContext_withSameContext_throws() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
IllegalArgumentException thrown = expectThrows(IllegalArgumentException.class,
() -> builder.setDeviceInfoForContext(MUSIC,
mNavigationDeviceInfo));
assertWithMessage("setDeviceInfoForSameContext failure for repeated context")
.that(thrown).hasMessageThat().contains("has already been set to");
}
@Test
public void setDeviceInfoForContext_withFirstCall_setsMinGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
assertWithMessage("Min Gain from builder")
.that(builder.mMinGain).isEqualTo(mMediaDeviceInfo.getMinGain());
}
@Test
public void setDeviceInfoForContext_withFirstCall_setsMaxGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
assertWithMessage("Max Gain from builder")
.that(builder.mMaxGain).isEqualTo(mMediaDeviceInfo.getMaxGain());
}
@Test
public void setDeviceInfoForContext_withFirstCall_setsDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
assertWithMessage("Default Gain from builder")
.that(builder.mDefaultGain).isEqualTo(mMediaDeviceInfo.getDefaultGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithSmallerMinGain_updatesMinGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setMinGain(mMediaDeviceInfo.getMinGain() - 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("Second, smaller min gain from builder")
.that(builder.mMinGain).isEqualTo(secondInfo.getMinGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithLargerMinGain_keepsFirstMinGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setMinGain(mMediaDeviceInfo.getMinGain() + 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("First, smaller min gain from builder")
.that(builder.mMinGain).isEqualTo(mMediaDeviceInfo.getMinGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithLargerMaxGain_updatesMaxGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setMaxGain(mMediaDeviceInfo.getMaxGain() + 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("Second, larger max gain from builder")
.that(builder.mMaxGain).isEqualTo(secondInfo.getMaxGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithSmallerMaxGain_keepsFirstMaxGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setMaxGain(mMediaDeviceInfo.getMaxGain() - 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("First, larger max gain from builder")
.that(builder.mMaxGain).isEqualTo(mMediaDeviceInfo.getMaxGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithLargerDefaultGain_updatesDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setDefaultGain(mMediaDeviceInfo.getDefaultGain() + 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("Second, larger default gain from builder")
.that(builder.mDefaultGain).isEqualTo(secondInfo.getDefaultGain());
}
@Test
public void setDeviceInfoForContext_SecondCallWithSmallerDefaultGain_keepsFirstDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
CarAudioDeviceInfo secondInfo = new InfoBuilder(NAVIGATION_DEVICE_ADDRESS)
.setDefaultGain(mMediaDeviceInfo.getDefaultGain() - 1).build();
builder.setDeviceInfoForContext(NAVIGATION, secondInfo);
assertWithMessage("Second, smaller default gain from builder")
.that(builder.mDefaultGain).isEqualTo(mMediaDeviceInfo.getDefaultGain());
}
@Test
public void builderBuild_withNoCallToSetDeviceInfoForContext_throws() {
CarVolumeGroup.Builder builder = getBuilder();
Exception e = expectThrows(IllegalArgumentException.class, builder::build);
assertWithMessage("Builder build failure").that(e).hasMessageThat()
.isEqualTo(
"setDeviceInfoForContext has to be called at least once before building");
}
@Test
public void builderBuild_withNoStoredGain_usesDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder().setDeviceInfoForContext(MUSIC,
mMediaDeviceInfo);
when(mSettingsMock.getStoredVolumeGainIndexForUser(UserHandle.USER_CURRENT, ZONE_ID,
GROUP_ID)).thenReturn(-1);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("Current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(DEFAULT_GAIN_INDEX);
}
@Test
public void builderBuild_withTooLargeStoredGain_usesDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder().setDeviceInfoForContext(MUSIC,
mMediaDeviceInfo);
when(mSettingsMock.getStoredVolumeGainIndexForUser(UserHandle.USER_CURRENT, ZONE_ID,
GROUP_ID)).thenReturn(MAX_GAIN_INDEX + 1);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("Current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(DEFAULT_GAIN_INDEX);
}
@Test
public void builderBuild_withTooSmallStoredGain_usesDefaultGain() {
CarVolumeGroup.Builder builder = getBuilder().setDeviceInfoForContext(MUSIC,
mMediaDeviceInfo);
when(mSettingsMock.getStoredVolumeGainIndexForUser(UserHandle.USER_CURRENT, ZONE_ID,
GROUP_ID)).thenReturn(MIN_GAIN_INDEX - 1);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("Current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(DEFAULT_GAIN_INDEX);
}
@Test
public void builderBuild_withValidStoredGain_usesStoredGain() {
CarVolumeGroup.Builder builder = getBuilder().setDeviceInfoForContext(MUSIC,
mMediaDeviceInfo);
when(mSettingsMock.getStoredVolumeGainIndexForUser(UserHandle.USER_CURRENT, ZONE_ID,
GROUP_ID)).thenReturn(MAX_GAIN_INDEX - 1);
CarVolumeGroup carVolumeGroup = builder.build();
assertWithMessage("Current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(MAX_GAIN_INDEX - 1);
}
@Test
public void getAddressForContext_withSupportedContext_returnsAddress() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
assertWithMessage("Supported context's address")
.that(carVolumeGroup.getAddressForContext(MUSIC))
.isEqualTo(mMediaDeviceInfo.getAddress());
}
@Test
public void getAddressForContext_withUnsupportedContext_returnsNull() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
assertWithMessage("Unsupported context's address")
.that(carVolumeGroup.getAddressForContext(NAVIGATION)).isNull();
}
@Test
public void isMuted_whenDefault_returnsFalse() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
assertWithMessage("Default mute state")
.that(carVolumeGroup.isMuted()).isFalse();
}
@Test
public void isMuted_afterMuting_returnsTrue() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setMute(true);
assertWithMessage("Set mute state")
.that(carVolumeGroup.isMuted()).isTrue();
}
@Test
public void isMuted_afterUnMuting_returnsFalse() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setMute(false);
assertWithMessage("Set mute state")
.that(carVolumeGroup.isMuted()).isFalse();
}
@Test
public void setMute_withMutedState_storesValueToSetting() {
CarAudioSettings settings = new SettingsBuilder(0, 0)
.setMuteForUser10(false)
.setIsPersistVolumeGroupEnabled(true)
.build();
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithNavigationBound(settings, true);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
carVolumeGroup.setMute(true);
verify(settings)
.storeVolumeGroupMuteForUser(TEST_USER_10, 0, 0, true);
}
@Test
public void setMute_withUnMutedState_storesValueToSetting() {
CarAudioSettings settings = new SettingsBuilder(0, 0)
.setMuteForUser10(false)
.setIsPersistVolumeGroupEnabled(true)
.build();
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithNavigationBound(settings, true);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
carVolumeGroup.setMute(false);
verify(settings)
.storeVolumeGroupMuteForUser(TEST_USER_10, 0, 0, false);
}
@Test
public void getContextsForAddress_returnsContextsBoundToThatAddress() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> contextsList = carVolumeGroup.getContextsForAddress(MEDIA_DEVICE_ADDRESS);
assertWithMessage("Contexts for bounded address %s", MEDIA_DEVICE_ADDRESS)
.that(contextsList).containsExactly(MUSIC,
CALL, CALL_RING);
}
@Test
public void getContextsForAddress_returnsEmptyArrayIfAddressNotBound() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> contextsList = carVolumeGroup.getContextsForAddress(OTHER_ADDRESS);
assertWithMessage("Contexts for non-bounded address %s", OTHER_ADDRESS)
.that(contextsList).isEmpty();
}
@Test
public void getCarAudioDeviceInfoForAddress_returnsExpectedDevice() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
CarAudioDeviceInfo actualDevice = carVolumeGroup.getCarAudioDeviceInfoForAddress(
MEDIA_DEVICE_ADDRESS);
assertWithMessage("Device information for bounded address %s", MEDIA_DEVICE_ADDRESS)
.that(actualDevice).isEqualTo(mMediaDeviceInfo);
}
@Test
public void getCarAudioDeviceInfoForAddress_returnsNullIfAddressNotBound() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
CarAudioDeviceInfo actualDevice = carVolumeGroup.getCarAudioDeviceInfoForAddress(
OTHER_ADDRESS);
assertWithMessage("Device information for non-bounded address %s", OTHER_ADDRESS)
.that(actualDevice).isNull();
}
@Test
public void setCurrentGainIndex_setsGainOnAllBoundDevices() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
verify(mMediaDeviceInfo).setCurrentGain(7);
verify(mNavigationDeviceInfo).setCurrentGain(7);
}
@Test
public void setCurrentGainIndex_updatesCurrentGainIndex() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Updated current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(TEST_GAIN_INDEX);
}
@Test
public void setCurrentGainIndex_checksNewGainIsAboveMin() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
IllegalArgumentException thrown = expectThrows(IllegalArgumentException.class,
() -> carVolumeGroup.setCurrentGainIndex(MIN_GAIN_INDEX - 1));
assertWithMessage("Set out of bound gain index failure")
.that(thrown).hasMessageThat()
.contains("Gain out of range (" + MIN_GAIN + ":" + MAX_GAIN + ")");
}
@Test
public void setCurrentGainIndex_checksNewGainIsBelowMax() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
IllegalArgumentException thrown = expectThrows(IllegalArgumentException.class,
() -> carVolumeGroup.setCurrentGainIndex(MAX_GAIN_INDEX + 1));
assertWithMessage("Set out of bound gain index failure")
.that(thrown).hasMessageThat()
.contains("Gain out of range (" + MIN_GAIN + ":" + MAX_GAIN + ")");
}
@Test
public void setCurrentGainIndex_setsCurrentGainIndexForUser() {
CarAudioSettings settings = new SettingsBuilder(0, 0)
.setGainIndexForUser(TEST_USER_11)
.build();
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithNavigationBound(settings, false);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_11);
carVolumeGroup.setCurrentGainIndex(MIN_GAIN);
verify(settings).storeVolumeGainIndexForUser(TEST_USER_11, 0, 0, MIN_GAIN);
}
@Test
public void setCurrentGainIndex_setsCurrentGainIndexForDefaultUser() {
CarAudioSettings settings = new SettingsBuilder(0, 0)
.setGainIndexForUser(UserHandle.USER_CURRENT)
.build();
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithNavigationBound(settings, false);
carVolumeGroup.setCurrentGainIndex(MIN_GAIN);
verify(settings)
.storeVolumeGainIndexForUser(UserHandle.USER_CURRENT, 0, 0, MIN_GAIN);
}
@Test
public void loadVolumesSettingsForUser_withMutedState_loadsMuteStateForUser() {
CarVolumeGroup carVolumeGroup = getVolumeGroupWithMuteAndNavBound(true, true, true);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
assertWithMessage("Saved mute state from settings")
.that(carVolumeGroup.isMuted()).isTrue();
}
@Test
public void loadVolumesSettingsForUser_withDisabledUseVolumeGroupMute_doesNotLoadMute() {
CarVolumeGroup carVolumeGroup = getVolumeGroupWithMuteAndNavBound(true, true, false);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
assertWithMessage("Default mute state")
.that(carVolumeGroup.isMuted()).isFalse();
}
@Test
public void loadVolumesSettingsForUser_withUnMutedState_loadsMuteStateForUser() {
CarVolumeGroup carVolumeGroup = getVolumeGroupWithMuteAndNavBound(false, true, true);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
assertWithMessage("Saved mute state from settings")
.that(carVolumeGroup.isMuted()).isFalse();
}
@Test
public void loadVolumesSettingsForUser_withMutedStateAndNoPersist_returnsDefaultMuteState() {
CarVolumeGroup carVolumeGroup = getVolumeGroupWithMuteAndNavBound(true, false, true);
carVolumeGroup.loadVolumesSettingsForUser(TEST_USER_10);
assertWithMessage("Default mute state")
.that(carVolumeGroup.isMuted()).isFalse();
}
@Test
public void hasCriticalAudioContexts_withoutCriticalContexts_returnsFalse() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
assertWithMessage("Group without critical audio context")
.that(carVolumeGroup.hasCriticalAudioContexts()).isFalse();
}
@Test
public void hasCriticalAudioContexts_withCriticalContexts_returnsTrue() {
CarVolumeGroup carVolumeGroup = getBuilder()
.setDeviceInfoForContext(EMERGENCY, mMediaDeviceInfo)
.build();
assertWithMessage("Group with critical audio context")
.that(carVolumeGroup.hasCriticalAudioContexts()).isTrue();
}
@Test
public void getCurrentGainIndex_whileMuted_returnsMinGain() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
carVolumeGroup.setMute(true);
assertWithMessage("Muted current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(MIN_GAIN_INDEX);
}
@Test
public void getCurrentGainIndex_whileUnMuted_returnsLastSetGain() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
carVolumeGroup.setMute(false);
assertWithMessage("Un-muted current gain index")
.that(carVolumeGroup.getCurrentGainIndex()).isEqualTo(TEST_GAIN_INDEX);
}
@Test
public void setCurrentGainIndex_whileMuted_unMutesVolumeGroup() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setMute(true);
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Mute state after volume change")
.that(carVolumeGroup.isMuted()).isEqualTo(false);
}
@Test
public void setBlocked_withGain_thenBackToUninitializedGain() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
assertThat(carVolumeGroup.isBlocked()).isFalse();
carVolumeGroup.setBlocked(10);
assertThat(carVolumeGroup.isBlocked()).isTrue();
carVolumeGroup.resetBlocked();
assertThat(carVolumeGroup.isBlocked()).isFalse();
}
@Test
public void setLimited_withGain_thenBackToMaxGain() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
assertThat(carVolumeGroup.isLimited()).isFalse();
carVolumeGroup.setLimit(carVolumeGroup.getMaxGainIndex() - 1);
assertThat(carVolumeGroup.isLimited()).isTrue();
carVolumeGroup.resetLimit();
assertThat(carVolumeGroup.isLimited()).isFalse();
}
@Test
public void setAttenuatedGain_withGain_thenBackToUninitializedGain() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
assertThat(carVolumeGroup.isAttenuated()).isFalse();
carVolumeGroup.setAttenuatedGain(10);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
carVolumeGroup.resetAttenuation();
assertThat(carVolumeGroup.isAttenuated()).isFalse();
}
@Test
public void getCurrentGainIndex_whileBlocked_thenUnblocked() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
int blockedIndex = 10;
carVolumeGroup.setBlocked(blockedIndex);
assertThat(carVolumeGroup.isBlocked()).isTrue();
assertWithMessage("Blocked current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(blockedIndex);
carVolumeGroup.resetBlocked();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Back to current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
}
@Test
public void getCurrentGainIndex_whileLimited_thenUnlimited() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
assertThat(carVolumeGroup.isLimited()).isFalse();
int limitedGainIndex = carVolumeGroup.getMaxGainIndex() - 1;
carVolumeGroup.setLimit(limitedGainIndex);
assertThat(carVolumeGroup.isLimited()).isTrue();
assertWithMessage("Limited current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(limitedGainIndex);
carVolumeGroup.resetLimit();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertWithMessage("Back to current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
}
@Test
public void getCurrentGainIndex_whileAttenuated_thenUnattenuated() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
int attenuatedIndex = TEST_GAIN_INDEX - 1;
carVolumeGroup.setAttenuatedGain(attenuatedIndex);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
assertWithMessage("Attenuated current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(attenuatedIndex);
carVolumeGroup.resetAttenuation();
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertWithMessage("Muted current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
}
@Test
public void setCurrentGainIndex_whileBlocked_thenRemainsUnblocked() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
int blockedIndex = 1;
carVolumeGroup.setBlocked(blockedIndex);
assertThat(carVolumeGroup.isBlocked()).isTrue();
carVolumeGroup.setCurrentGainIndex(blockedIndex + 1);
assertWithMessage("Over Blocked current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(blockedIndex);
carVolumeGroup.setCurrentGainIndex(blockedIndex - 1);
assertWithMessage("Under Blocked current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(blockedIndex);
}
@Test
public void setCurrentGainIndex_whileLimited_under_then_over_limit() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(MAX_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(MAX_GAIN_INDEX);
assertThat(carVolumeGroup.isLimited()).isFalse();
int limitedGainIndex = MAX_GAIN_INDEX - 1;
carVolumeGroup.setLimit(limitedGainIndex);
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isTrue();
// Underlimit
carVolumeGroup.setCurrentGainIndex(limitedGainIndex - 1);
assertWithMessage("Under limit current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(limitedGainIndex - 1);
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
// Overlimit
carVolumeGroup.setCurrentGainIndex(limitedGainIndex + 1);
assertWithMessage("Over limit current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(limitedGainIndex);
assertThat(carVolumeGroup.isLimited()).isTrue();
// Limitation prevents to set overlimited inde
assertThat(carVolumeGroup.isOverLimit()).isFalse();
}
@Test
public void setCurrentGainIndex_whileAttenuated_thenUnattenuated() {
CarVolumeGroup carVolumeGroup = getCarVolumeGroupWithMusicBound();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX);
assertWithMessage("Initial current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(TEST_GAIN_INDEX);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
int attenuatedIndex = TEST_GAIN_INDEX - 2;
carVolumeGroup.setAttenuatedGain(attenuatedIndex);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
assertWithMessage("Attenuated current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(attenuatedIndex);
carVolumeGroup.setCurrentGainIndex(attenuatedIndex + 1);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertWithMessage("new current gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(attenuatedIndex + 1);
}
@Test
public void isOverLimit_expectedTrue() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(MAX_GAIN_INDEX);
List<Integer> limitReasons = List.of(Reasons.THERMAL_LIMITATION);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = TEST_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(limitReasons, musicCarGain);
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isTrue();
}
@Test
public void isOverLimit_expectedFalse() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(TEST_GAIN_INDEX - 1);
List<Integer> limitReasons = List.of(Reasons.THERMAL_LIMITATION);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = TEST_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(limitReasons, musicCarGain);
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
}
@Test
public void onAudioGainChanged_withOverLimit_thenEndsAndRestoresVolume() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(MAX_GAIN_INDEX);
List<Integer> limitReasons = List.of(Reasons.THERMAL_LIMITATION);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(limitReasons, musicCarGain);
assertWithMessage("Overlimit gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(DEFAULT_GAIN_INDEX);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isTrue();
assertThat(carVolumeGroup.isBlocked()).isFalse();
List<Integer> noReasons = new ArrayList<>(0);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Restored initial gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(MAX_GAIN_INDEX);
}
@Test
public void onAudioGainChanged_withUnderLimit_thenEndsWithVolumeUnchanged() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(MIN_GAIN_INDEX);
List<Integer> limitReasons = List.of(Reasons.THERMAL_LIMITATION);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(limitReasons, musicCarGain);
assertWithMessage("Underlimit gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(MIN_GAIN_INDEX);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
List<Integer> noReasons = new ArrayList<>(0);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Unchanged gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(MIN_GAIN_INDEX);
}
@Test
public void onAudioGainChanged_withBlockedGain_thenEndsAndRestoresVolume() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(DEFAULT_GAIN_INDEX);
List<Integer> blockReasons = List.of(Reasons.TCU_MUTE);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = MIN_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(blockReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isTrue();
assertWithMessage("Blocked gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(MIN_GAIN_INDEX);
List<Integer> noReasons = new ArrayList<>(0);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Restored initial gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(DEFAULT_GAIN_INDEX);
}
@Test
public void onAudioGainChanged_withAttenuatedGain_thenEndsAndRestoresVolume() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
carVolumeGroup.setCurrentGainIndex(DEFAULT_GAIN_INDEX);
int attenuatedIndex = DEFAULT_GAIN_INDEX - 1;
List<Integer> attenuateReasons = List.of(Reasons.ADAS_DUCKING);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = attenuatedIndex;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(attenuateReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Attenuated gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(attenuatedIndex);
List<Integer> noReasons = new ArrayList<>(0);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isOverLimit()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
assertWithMessage("Restored initial gain index")
.that(carVolumeGroup.getCurrentGainIndex())
.isEqualTo(DEFAULT_GAIN_INDEX);
}
@Test
public void onAudioGainChanged_withBlockingLimitAndAttenuation() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> allReasons =
List.of(
-1,
-10,
666,
Reasons.FORCED_MASTER_MUTE,
Reasons.TCU_MUTE,
Reasons.REMOTE_MUTE,
Reasons.THERMAL_LIMITATION,
Reasons.SUSPEND_EXIT_VOL_LIMITATION,
Reasons.ADAS_DUCKING,
Reasons.ADAS_DUCKING);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(allReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isBlocked()).isTrue();
}
@Test
public void onAudioGainChanged_resettingBlockingLimitAndAttenuation() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> noReasons = new ArrayList<>(0);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
}
@Test
public void onAudioGainChanged_setResettingBlockingLimitAndAttenuation() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> allReasons =
List.of(
Reasons.FORCED_MASTER_MUTE,
Reasons.TCU_MUTE,
Reasons.REMOTE_MUTE,
Reasons.THERMAL_LIMITATION,
Reasons.SUSPEND_EXIT_VOL_LIMITATION,
Reasons.ADAS_DUCKING,
Reasons.ADAS_DUCKING);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
carVolumeGroup.onAudioGainChanged(allReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isTrue();
assertThat(carVolumeGroup.isLimited()).isTrue();
assertThat(carVolumeGroup.isBlocked()).isTrue();
List<Integer> noReasons = new ArrayList<>(0);
carVolumeGroup.onAudioGainChanged(noReasons, musicCarGain);
assertThat(carVolumeGroup.isAttenuated()).isFalse();
assertThat(carVolumeGroup.isLimited()).isFalse();
assertThat(carVolumeGroup.isBlocked()).isFalse();
}
@Test
public void onAudioGainChanged_validGain() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> reasons = List.of(Reasons.REMOTE_MUTE, Reasons.NAV_DUCKING);
AudioGainConfigInfo musicGain = new AudioGainConfigInfo();
musicGain.zoneId = ZONE_ID;
musicGain.devicePortAddress = MEDIA_DEVICE_ADDRESS;
musicGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo musicCarGain = new CarAudioGainConfigInfo(musicGain);
AudioGainConfigInfo navGain = new AudioGainConfigInfo();
navGain.zoneId = ZONE_ID;
navGain.devicePortAddress = NAVIGATION_DEVICE_ADDRESS;
navGain.volumeIndex = DEFAULT_GAIN_INDEX;
CarAudioGainConfigInfo navCarGain = new CarAudioGainConfigInfo(navGain);
carVolumeGroup.onAudioGainChanged(reasons, musicCarGain);
// Broadcasted to all CarAudioDeviceInfo
verify(mMediaDeviceInfo).setCurrentGain(eq(DEFAULT_GAIN));
verify(mNavigationDeviceInfo).setCurrentGain(eq(DEFAULT_GAIN));
carVolumeGroup.onAudioGainChanged(reasons, navCarGain);
// Broadcasted to all CarAudioDeviceInfo
verify(mMediaDeviceInfo, times(2)).setCurrentGain(eq(DEFAULT_GAIN));
verify(mNavigationDeviceInfo, times(2)).setCurrentGain(eq(DEFAULT_GAIN));
}
@Test
public void onAudioGainChanged_invalidGain() {
CarVolumeGroup carVolumeGroup = testVolumeGroupSetup();
List<Integer> reasons = List.of(Reasons.REMOTE_MUTE, Reasons.NAV_DUCKING);
AudioGainConfigInfo unknownGain = new AudioGainConfigInfo();
unknownGain.zoneId = ZONE_ID;
unknownGain.devicePortAddress = OTHER_ADDRESS;
unknownGain.volumeIndex = 666;
CarAudioGainConfigInfo unknownCarGain = new CarAudioGainConfigInfo(unknownGain);
carVolumeGroup.onAudioGainChanged(reasons, unknownCarGain);
verify(mMediaDeviceInfo, never()).setCurrentGain(anyInt());
verify(mNavigationDeviceInfo, never()).setCurrentGain(anyInt());
}
private CarVolumeGroup getCarVolumeGroupWithMusicBound() {
return getBuilder()
.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo)
.build();
}
private CarVolumeGroup getCarVolumeGroupWithNavigationBound(CarAudioSettings settings,
boolean useCarVolumeGroupMute) {
return new CarVolumeGroup.Builder(0, 0, settings, useCarVolumeGroupMute)
.setDeviceInfoForContext(NAVIGATION, mNavigationDeviceInfo)
.build();
}
CarVolumeGroup getVolumeGroupWithMuteAndNavBound(boolean isMuted, boolean persistMute,
boolean useCarVolumeGroupMute) {
CarAudioSettings settings = new SettingsBuilder(0, 0)
.setMuteForUser10(isMuted)
.setIsPersistVolumeGroupEnabled(persistMute)
.build();
return getCarVolumeGroupWithNavigationBound(settings, useCarVolumeGroupMute);
}
private CarVolumeGroup testVolumeGroupSetup() {
CarVolumeGroup.Builder builder = getBuilder();
builder.setDeviceInfoForContext(MUSIC, mMediaDeviceInfo);
builder.setDeviceInfoForContext(CALL, mMediaDeviceInfo);
builder.setDeviceInfoForContext(CALL_RING, mMediaDeviceInfo);
builder.setDeviceInfoForContext(NAVIGATION, mNavigationDeviceInfo);
builder.setDeviceInfoForContext(ALARM, mNavigationDeviceInfo);
builder.setDeviceInfoForContext(NOTIFICATION, mNavigationDeviceInfo);
return builder.build();
}
CarVolumeGroup.Builder getBuilder() {
return new CarVolumeGroup.Builder(ZONE_ID, GROUP_ID, mSettingsMock, true);
}
private static final class SettingsBuilder {
private final SparseIntArray mStoredGainIndexes = new SparseIntArray();
private final SparseBooleanArray mStoreMuteStates = new SparseBooleanArray();
private final int mZoneId;
private final int mGroupId;
private boolean mPersistMute;
SettingsBuilder(int zoneId, int groupId) {
mZoneId = zoneId;
mGroupId = groupId;
}
SettingsBuilder setGainIndexForUser(@UserIdInt int userId) {
mStoredGainIndexes.put(userId, TEST_GAIN_INDEX);
return this;
}
SettingsBuilder setMuteForUser10(boolean mute) {
mStoreMuteStates.put(CarVolumeGroupUnitTest.TEST_USER_10, mute);
return this;
}
SettingsBuilder setIsPersistVolumeGroupEnabled(boolean persistMute) {
mPersistMute = persistMute;
return this;
}
CarAudioSettings build() {
CarAudioSettings settingsMock = Mockito.mock(CarAudioSettings.class);
for (int storeIndex = 0; storeIndex < mStoredGainIndexes.size(); storeIndex++) {
int gainUserId = mStoredGainIndexes.keyAt(storeIndex);
when(settingsMock
.getStoredVolumeGainIndexForUser(gainUserId, mZoneId,
mGroupId)).thenReturn(
mStoredGainIndexes.get(gainUserId, DEFAULT_GAIN));
}
for (int muteIndex = 0; muteIndex < mStoreMuteStates.size(); muteIndex++) {
int muteUserId = mStoreMuteStates.keyAt(muteIndex);
when(settingsMock.getVolumeGroupMuteForUser(muteUserId, mZoneId, mGroupId))
.thenReturn(mStoreMuteStates.get(muteUserId, false));
when(settingsMock.isPersistVolumeGroupMuteEnabled(muteUserId))
.thenReturn(mPersistMute);
}
return settingsMock;
}
}
private static final class InfoBuilder {
private final String mAddress;
private int mStepValue = STEP_VALUE;
private int mDefaultGain = DEFAULT_GAIN;
private int mMinGain = MIN_GAIN;
private int mMaxGain = MAX_GAIN;
InfoBuilder(String address) {
mAddress = address;
}
InfoBuilder setStepValue(int stepValue) {
mStepValue = stepValue;
return this;
}
InfoBuilder setDefaultGain(int defaultGain) {
mDefaultGain = defaultGain;
return this;
}
InfoBuilder setMinGain(int minGain) {
mMinGain = minGain;
return this;
}
InfoBuilder setMaxGain(int maxGain) {
mMaxGain = maxGain;
return this;
}
CarAudioDeviceInfo build() {
CarAudioDeviceInfo infoMock = Mockito.mock(CarAudioDeviceInfo.class);
when(infoMock.getStepValue()).thenReturn(mStepValue);
when(infoMock.getDefaultGain()).thenReturn(mDefaultGain);
when(infoMock.getMaxGain()).thenReturn(mMaxGain);
when(infoMock.getMinGain()).thenReturn(mMinGain);
when(infoMock.getAddress()).thenReturn(mAddress);
return infoMock;
}
}
}