blob: 06d2299d4b27d4b35e8771ee71aa575861239f94 [file] [log] [blame]
/*
* Copyright (C) 2020 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 android.media.AudioAttributes.USAGE_ALARM;
import static android.media.AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
import static android.media.AudioAttributes.USAGE_MEDIA;
import static android.media.AudioAttributes.USAGE_NOTIFICATION;
import static android.media.AudioAttributes.USAGE_VIRTUAL_SOURCE;
import static android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION;
import static android.telephony.TelephonyManager.CALL_STATE_IDLE;
import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK;
import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
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.NAVIGATION;
import static com.android.car.audio.CarAudioService.DEFAULT_AUDIO_CONTEXT;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.media.AudioAttributes;
import android.media.AudioAttributes.AttributeUsage;
import android.media.AudioPlaybackConfiguration;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.car.audio.CarAudioContext.AudioContext;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
@RunWith(AndroidJUnit4.class)
public class CarVolumeTest {
@Test
public void getSuggestedAudioContext_withNoConfigurationsAndIdleTelephony_returnsDefault() {
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(new ArrayList<>(),
CALL_STATE_IDLE);
assertThat(suggestedContext).isEqualTo(CarAudioService.DEFAULT_AUDIO_CONTEXT);
}
@Test
public void getSuggestedAudioContext_withOneConfiguration_returnsAssociatedContext() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_ALARM).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_IDLE);
assertThat(suggestedContext).isEqualTo(ALARM);
}
@Test
public void getSuggestedAudioContext_withCallStateOffHook_returnsCallContext() {
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(new ArrayList<>(),
CALL_STATE_OFFHOOK);
assertThat(suggestedContext).isEqualTo(CALL);
}
@Test
public void getSuggestedAudioContext_withCallStateRinging_returnsCallRingContext() {
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(new ArrayList<>(),
CALL_STATE_RINGING);
assertThat(suggestedContext).isEqualTo(CALL_RING);
}
@Test
public void getSuggestedAudioContext_withConfigurations_returnsHighestPriorityContext() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_ALARM).build(),
new Builder().setUsage(USAGE_VOICE_COMMUNICATION).build(),
new Builder().setUsage(USAGE_NOTIFICATION).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_IDLE);
assertThat(suggestedContext).isEqualTo(CALL);
}
@Test
public void getSuggestedAudioContext_ignoresInactiveConfigurations() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_ALARM).build(),
new Builder().setUsage(USAGE_VOICE_COMMUNICATION).setInactive().build(),
new Builder().setUsage(USAGE_NOTIFICATION).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_IDLE);
assertThat(suggestedContext).isEqualTo(ALARM);
}
@Test
public void getSuggestedAudioContext_withLowerPriorityConfigurationsAndCall_returnsCall() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_ALARM).build(),
new Builder().setUsage(USAGE_NOTIFICATION).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_OFFHOOK);
assertThat(suggestedContext).isEqualTo(CALL);
}
@Test
public void getSuggestedAudioContext_withNavigationConfigurationAndCall_returnsNavigation() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_ASSISTANCE_NAVIGATION_GUIDANCE).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_OFFHOOK);
assertThat(suggestedContext).isEqualTo(NAVIGATION);
}
@Test
public void getSuggestedAudioContext_withUnprioritizedUsage_returnsDefault() {
List<AudioPlaybackConfiguration> configurations = ImmutableList.of(
new Builder().setUsage(USAGE_VIRTUAL_SOURCE).build()
);
@AudioContext int suggestedContext = CarVolume.getSuggestedAudioContext(configurations,
CALL_STATE_IDLE);
assertThat(suggestedContext).isEqualTo(DEFAULT_AUDIO_CONTEXT);
}
private static class Builder {
private @AttributeUsage int mUsage = USAGE_MEDIA;
private boolean mIsActive = true;
Builder setUsage(@AttributeUsage int usage) {
mUsage = usage;
return this;
}
Builder setInactive() {
mIsActive = false;
return this;
}
AudioPlaybackConfiguration build() {
AudioPlaybackConfiguration configuration = mock(AudioPlaybackConfiguration.class);
AudioAttributes attributes = new AudioAttributes.Builder().setUsage(mUsage).build();
when(configuration.getAudioAttributes()).thenReturn(attributes);
when(configuration.isActive()).thenReturn(mIsActive);
return configuration;
}
}
}