Moving additional AudioManager tests to gts/GMSCore

Bug: 183606360
Test: atest GtsGmscoreHostTestCases:AudioServiceHostTest#testAudioVolumeGroups
Test: gts-tradefed run gts --skip-device-info --skip-system-status-check com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker -m GtsGmscoreHostTestCases -t 'com.google.android.gts.audioservice.AudioServiceHostTest#testAudioVolumeGroups'

Change-Id: I145cfd5602ea9de92012654704d6ebffe723868a
This commit is contained in:
Paul McLean 2021-03-31 13:02:41 -06:00
parent ec51f19cd8
commit d6f87c8530
11 changed files with 67 additions and 19 deletions

View File

@ -1361,6 +1361,7 @@ package android.location {
package android.media {
public final class AudioAttributes implements android.os.Parcelable {
method public static int[] getSdkUsages();
method @NonNull public static String usageToXsdString(int);
method public static int xsdStringToUsage(@NonNull String);
}
@ -1380,6 +1381,8 @@ package android.media {
method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int abandonAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String);
method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int);
method @IntRange(from=0) @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public long getFadeOutDurationOnFocusLossMillis(@NonNull android.media.AudioAttributes);
method public static final int[] getPublicStreamTypes();
method public int getStreamMinVolumeInt(int);
method public boolean hasRegisteredDynamicPolicy();
method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE}) public boolean isFullVolumeDevice();
method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int requestAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String, int, int);
@ -1403,6 +1406,7 @@ package android.media {
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS) public static float getMasterBalance();
method public static final int getNumStreamTypes();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS) public static int setMasterBalance(float);
method @NonNull public static String streamToString(int);
field public static final int DEVICE_ROLE_DISABLED = 2; // 0x2
field public static final int DEVICE_ROLE_NONE = 0; // 0x0
field public static final int DEVICE_ROLE_PREFERRED = 1; // 0x1
@ -1501,8 +1505,10 @@ package android.media.audiopolicy {
}
public final class AudioProductStrategy implements android.os.Parcelable {
method @NonNull public static android.media.AudioAttributes getDefaultAttributes();
method public int getLegacyStreamTypeForAudioAttributes(@NonNull android.media.AudioAttributes);
method public int getVolumeGroupIdForAudioAttributes(@NonNull android.media.AudioAttributes);
method public int getVolumeGroupIdForLegacyStreamType(int);
}
}

View File

@ -71,6 +71,10 @@ ActionValue: android.telephony.mbms.vendor.VendorUtils#EXTRA_TEMP_LIST:
AllUpper: android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes:
Constant field names must be named with only upper case characters: `android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes`, should be `S_DEFAULT_ATTRIBUTES`?
ArrayReturn: android.app.UiAutomation#executeShellCommandRw(String):
ArrayReturn: android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel#KeyphraseSoundModel(java.util.UUID, java.util.UUID, byte[], android.hardware.soundtrigger.SoundTrigger.Keyphrase[]) parameter #3:
@ -539,6 +543,8 @@ InterfaceConstant: android.telecom.PhoneAccountSuggestionService#SERVICE_INTERFA
InternalField: android.media.audiopolicy.AudioProductStrategy#sDefaultAttributes:
Internal field sDefaultAttributes must not be exposed
InternalField: android.telephony.ims.ImsConferenceState#mParticipants:
@ -1091,8 +1097,14 @@ MissingNullability: android.location.LocationManager#getTestProviderCurrentReque
MissingNullability: android.location.LocationRequest#writeToParcel(android.os.Parcel, int) parameter #0:
MissingNullability: android.media.AudioAttributes#SDK_USAGES:
Missing nullability on field `SDK_USAGES` in class `class android.media.AudioAttributes`
MissingNullability: android.media.AudioAttributes#getSdkUsages():
Missing nullability on method `getSdkUsages` return
MissingNullability: android.media.AudioFocusInfo#writeToParcel(android.os.Parcel, int) parameter #0:
MissingNullability: android.media.AudioManager#getPublicStreamTypes():
Missing nullability on method `getPublicStreamTypes` return
MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #3:
MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String) parameter #4:
@ -1109,6 +1121,8 @@ MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConf
MissingNullability: android.media.AudioRecordingConfiguration#AudioRecordingConfiguration(int, int, int, android.media.AudioFormat, android.media.AudioFormat, int, String, int, boolean, int, android.media.audiofx.AudioEffect.Descriptor[], android.media.audiofx.AudioEffect.Descriptor[]) parameter #6:
MissingNullability: android.media.AudioSystem#streamToString(int):
Missing nullability on method `streamToString` return
MissingNullability: android.media.PlaybackParams#setAudioStretchMode(int):
MissingNullability: android.media.audiofx.AudioEffect#EFFECT_TYPE_NULL:

View File

@ -214,7 +214,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
return AudioManager.getAudioProductStrategies().stream()
.map(strategy -> strategy.getVolumeGroupIdForAudioAttributes(
AudioProductStrategy.sDefaultAttributes))
AudioProductStrategy.getDefaultAttributes()))
.filter(volumeGroupId -> volumeGroupId != AudioVolumeGroup.DEFAULT_VOLUME_GROUP)
.findFirst()
.orElse(AudioVolumeGroup.DEFAULT_VOLUME_GROUP);

View File

@ -333,6 +333,14 @@ public final class AudioAttributes implements Parcelable {
USAGE_ASSISTANT,
};
/**
* @hide
*/
@TestApi
public static int[] getSdkUsages() {
return SDK_USAGES;
}
/**
* Flag defining a behavior where the audibility of the sound will be ensured by the system.
*/

View File

@ -387,6 +387,18 @@ public class AudioManager {
*/
@Deprecated public static final int NUM_STREAMS = AudioSystem.NUM_STREAMS;
/** @hide */
private static final int[] PUBLIC_STREAM_TYPES = { AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_SYSTEM, AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION,
AudioManager.STREAM_DTMF, AudioManager.STREAM_ACCESSIBILITY };
/** @hide */
@TestApi
public static final int[] getPublicStreamTypes() {
return PUBLIC_STREAM_TYPES;
}
/**
* Increase the ringer volume.
*
@ -1065,6 +1077,7 @@ public class AudioManager {
* @return The minimum valid volume index for the stream.
* @see #getStreamVolume(int)
*/
@TestApi
public int getStreamMinVolumeInt(int streamType) {
final IAudioService service = getService();
try {

View File

@ -1995,7 +1995,8 @@ public class AudioSystem
};
/** @hide */
public static String streamToString(int stream) {
@TestApi
public static @NonNull String streamToString(int stream) {
if (stream >= 0 && stream < STREAM_NAMES.length) return STREAM_NAMES[stream];
if (stream == AudioManager.USE_DEFAULT_STREAM_TYPE) return "USE_DEFAULT_STREAM_TYPE";
return "UNKNOWN_STREAM_" + stream;

View File

@ -275,6 +275,7 @@ public final class AudioProductStrategy implements Parcelable {
* @return the volume group id relevant for the given streamType.
* If none is found, {@link AudioVolumeGroup#DEFAULT_VOLUME_GROUP} is returned.
*/
@TestApi
public int getVolumeGroupIdForLegacyStreamType(int streamType) {
for (final AudioAttributesGroup aag : mAudioAttributesGroups) {
if (aag.supportsStreamType(streamType)) {
@ -355,10 +356,18 @@ public final class AudioProductStrategy implements Parcelable {
* @hide
* Default attributes, with default source to be aligned with native.
*/
public static final @NonNull AudioAttributes sDefaultAttributes =
private static final @NonNull AudioAttributes DEFAULT_ATTRIBUTES =
new AudioAttributes.Builder().setCapturePreset(MediaRecorder.AudioSource.DEFAULT)
.build();
/**
* @hide
*/
@TestApi
public static @NonNull AudioAttributes getDefaultAttributes() {
return DEFAULT_ATTRIBUTES;
}
/**
* To avoid duplicating the logic in java and native, we shall make use of
* native API native_get_product_strategies_from_audio_attributes
@ -372,7 +381,7 @@ public final class AudioProductStrategy implements Parcelable {
Preconditions.checkNotNull(attr, "attr must not be null");
String refFormattedTags = TextUtils.join(";", refAttr.getTags());
String cliFormattedTags = TextUtils.join(";", attr.getTags());
if (refAttr.equals(sDefaultAttributes)) {
if (refAttr.equals(DEFAULT_ATTRIBUTES)) {
return false;
}
return ((refAttr.getSystemUsage() == AudioAttributes.USAGE_UNKNOWN)

View File

@ -255,7 +255,7 @@ public class AudioManagerTest extends AudioVolumesTestBase {
AudioVolumeGroupCallbackHelper vgCbReceiver = new AudioVolumeGroupCallbackHelper();
mAudioManager.registerVolumeGroupCallback(mContext.getMainExecutor(), vgCbReceiver);
final List<Integer> publicStreams = Ints.asList(PUBLIC_STREAM_TYPES);
final List<Integer> publicStreams = Ints.asList(AudioManager.getPublicStreamTypes());
try {
// Validate Audio Volume Groups callback reception
for (final AudioVolumeGroup audioVolumeGroup : audioVolumeGroups) {

View File

@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.audiopolicy.AudioProductStrategy;
import android.media.audiopolicy.AudioVolumeGroup;
@ -71,7 +72,7 @@ public class AudioProductStrategyTest extends AudioVolumesTestBase {
assertNotNull(audioProductStrategies);
assertTrue(audioProductStrategies.size() > 0);
for (final int streamType : PUBLIC_STREAM_TYPES) {
for (final int streamType : AudioManager.getPublicStreamTypes()) {
AudioAttributes aaFromStreamType =
AudioProductStrategy.getAudioAttributesForStrategyWithLegacyStreamType(
streamType);

View File

@ -37,15 +37,10 @@ public class AudioVolumesTestBase extends ActivityInstrumentationTestCase2<Audio
// Default matches the invalid (empty) attributes from native.
// The difference is the input source default which is not aligned between native and java
public static final AudioAttributes sDefaultAttributes =
AudioProductStrategy.sDefaultAttributes;
AudioProductStrategy.getDefaultAttributes();
public static final AudioAttributes sInvalidAttributes = new AudioAttributes.Builder().build();
public final int[] PUBLIC_STREAM_TYPES = { AudioManager.STREAM_VOICE_CALL,
AudioManager.STREAM_SYSTEM, AudioManager.STREAM_RING, AudioManager.STREAM_MUSIC,
AudioManager.STREAM_ALARM, AudioManager.STREAM_NOTIFICATION,
AudioManager.STREAM_DTMF, AudioManager.STREAM_ACCESSIBILITY };
public AudioVolumesTestBase() {
super("com.android.audiopolicytest", AudioPolicyTest.class);
}
@ -63,7 +58,7 @@ public class AudioVolumesTestBase extends ActivityInstrumentationTestCase2<Audio
}
AudioAttributes avgAttributes = sDefaultAttributes;
for (final AudioAttributes aa : avg.getAudioAttributes()) {
if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) {
if (!aa.equals(AudioProductStrategy.getDefaultAttributes())) {
avgAttributes = aa;
break;
}
@ -89,7 +84,7 @@ public class AudioVolumesTestBase extends ActivityInstrumentationTestCase2<Audio
assertTrue(!avg.getAudioAttributes().isEmpty());
AudioAttributes avgAttributes = sDefaultAttributes;
for (final AudioAttributes aa : avg.getAudioAttributes()) {
if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) {
if (!aa.equals(AudioProductStrategy.getDefaultAttributes())) {
avgAttributes = aa;
break;
}
@ -114,7 +109,7 @@ public class AudioVolumesTestBase extends ActivityInstrumentationTestCase2<Audio
// Store the original volumes that that they can be recovered in tearDown().
mOriginalStreamVolumes.clear();
for (int streamType : PUBLIC_STREAM_TYPES) {
for (int streamType : AudioManager.getPublicStreamTypes()) {
mOriginalStreamVolumes.put(streamType, mAudioManager.getStreamVolume(streamType));
}
// Store the original volume per attributes so that they can be recovered in tearDown()

View File

@ -3470,7 +3470,7 @@ public class AudioService extends IAudioService.Stub
}
// The default volume group is the one hosted by default product strategy, i.e.
// supporting Default Attributes
return getVolumeGroupIdForAttributesInt(AudioProductStrategy.sDefaultAttributes);
return getVolumeGroupIdForAttributesInt(AudioProductStrategy.getDefaultAttributes());
}
private int getVolumeGroupIdForAttributesInt(@NonNull AudioAttributes attributes) {
@ -6162,7 +6162,7 @@ public class AudioService extends IAudioService.Stub
private void ensureValidAttributes(AudioVolumeGroup avg) {
boolean hasAtLeastOneValidAudioAttributes = avg.getAudioAttributes().stream()
.anyMatch(aa -> !aa.equals(AudioProductStrategy.sDefaultAttributes));
.anyMatch(aa -> !aa.equals(AudioProductStrategy.getDefaultAttributes()));
if (!hasAtLeastOneValidAudioAttributes) {
throw new IllegalArgumentException("Volume Group " + avg.name()
+ " has no valid audio attributes");
@ -6210,7 +6210,7 @@ public class AudioService extends IAudioService.Stub
private int mIndexMax;
private int mLegacyStreamType = AudioSystem.STREAM_DEFAULT;
private int mPublicStreamType = AudioSystem.STREAM_MUSIC;
private AudioAttributes mAudioAttributes = AudioProductStrategy.sDefaultAttributes;
private AudioAttributes mAudioAttributes = AudioProductStrategy.getDefaultAttributes();
// No API in AudioSystem to get a device from strategy or from attributes.
// Need a valid public stream type to use current API getDeviceForStream
@ -6223,8 +6223,9 @@ public class AudioService extends IAudioService.Stub
if (DEBUG_VOL) {
Log.v(TAG, "VolumeGroupState for " + avg.toString());
}
// mAudioAttributes is the default at this point
for (final AudioAttributes aa : avg.getAudioAttributes()) {
if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) {
if (!aa.equals(mAudioAttributes)) {
mAudioAttributes = aa;
break;
}