Move @AudioFocusGain from C to AudioFocusManager and make it private

This is only used inside AudioFocusManager, it doesn't need to public.

Also mark it TYPE_USE and update the position to match.

#minor-release

PiperOrigin-RevId: 426407790
This commit is contained in:
ibaker 2022-02-04 16:17:25 +00:00 committed by Ian Baker
parent 15d50d0bf0
commit a506d245d1
2 changed files with 47 additions and 44 deletions

View File

@ -471,34 +471,6 @@ public final class C {
/** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}. */ /** See {@link android.media.AudioAttributes#ALLOW_CAPTURE_BY_SYSTEM}. */
public static final int ALLOW_CAPTURE_BY_SYSTEM = AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM; public static final int ALLOW_CAPTURE_BY_SYSTEM = AudioAttributes.ALLOW_CAPTURE_BY_SYSTEM;
/**
* Audio focus types. One of {@link #AUDIOFOCUS_NONE}, {@link #AUDIOFOCUS_GAIN}, {@link
* #AUDIOFOCUS_GAIN_TRANSIENT}, {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} or {@link
* #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}.
*/
@Documented
@Retention(RetentionPolicy.SOURCE)
@IntDef({
AUDIOFOCUS_NONE,
AUDIOFOCUS_GAIN,
AUDIOFOCUS_GAIN_TRANSIENT,
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
})
public @interface AudioFocusGain {}
/** @see AudioManager#AUDIOFOCUS_NONE */
public static final int AUDIOFOCUS_NONE = AudioManager.AUDIOFOCUS_NONE;
/** @see AudioManager#AUDIOFOCUS_GAIN */
public static final int AUDIOFOCUS_GAIN = AudioManager.AUDIOFOCUS_GAIN;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT */
public static final int AUDIOFOCUS_GAIN_TRANSIENT = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK */
public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK =
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE */
public static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE =
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
/** /**
* Flags which can apply to a buffer containing a media sample. Possible flag values are {@link * Flags which can apply to a buffer containing a media sample. Possible flag values are {@link
* #BUFFER_FLAG_KEY_FRAME}, {@link #BUFFER_FLAG_END_OF_STREAM}, {@link #BUFFER_FLAG_LAST_SAMPLE}, * #BUFFER_FLAG_KEY_FRAME}, {@link #BUFFER_FLAG_END_OF_STREAM}, {@link #BUFFER_FLAG_LAST_SAMPLE},

View File

@ -95,6 +95,37 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** Audio focus has been temporarily lost, but playback may continue with reduced volume. */ /** Audio focus has been temporarily lost, but playback may continue with reduced volume. */
private static final int AUDIO_FOCUS_STATE_LOSS_TRANSIENT_DUCK = 3; private static final int AUDIO_FOCUS_STATE_LOSS_TRANSIENT_DUCK = 3;
/**
* Audio focus types. One of {@link #AUDIOFOCUS_NONE}, {@link #AUDIOFOCUS_GAIN}, {@link
* #AUDIOFOCUS_GAIN_TRANSIENT}, {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} or {@link
* #AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}.
*/
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(TYPE_USE)
@IntDef({
AUDIOFOCUS_NONE,
AUDIOFOCUS_GAIN,
AUDIOFOCUS_GAIN_TRANSIENT,
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
})
private @interface AudioFocusGain {}
/** @see AudioManager#AUDIOFOCUS_NONE */
@SuppressWarnings("InlinedApi")
private static final int AUDIOFOCUS_NONE = AudioManager.AUDIOFOCUS_NONE;
/** @see AudioManager#AUDIOFOCUS_GAIN */
private static final int AUDIOFOCUS_GAIN = AudioManager.AUDIOFOCUS_GAIN;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT */
private static final int AUDIOFOCUS_GAIN_TRANSIENT = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK */
private static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK =
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
/** @see AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE */
@SuppressWarnings("InlinedApi")
private static final int AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE =
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
private static final String TAG = "AudioFocusManager"; private static final String TAG = "AudioFocusManager";
private static final float VOLUME_MULTIPLIER_DUCK = 0.2f; private static final float VOLUME_MULTIPLIER_DUCK = 0.2f;
@ -106,7 +137,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Nullable private AudioAttributes audioAttributes; @Nullable private AudioAttributes audioAttributes;
@AudioFocusState private int audioFocusState; @AudioFocusState private int audioFocusState;
@C.AudioFocusGain private int focusGainToRequest; private @AudioFocusGain int focusGainToRequest;
private float volumeMultiplier = VOLUME_MULTIPLIER_DEFAULT; private float volumeMultiplier = VOLUME_MULTIPLIER_DEFAULT;
private @MonotonicNonNull AudioFocusRequest audioFocusRequest; private @MonotonicNonNull AudioFocusRequest audioFocusRequest;
@ -147,7 +178,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
this.audioAttributes = audioAttributes; this.audioAttributes = audioAttributes;
focusGainToRequest = convertAudioAttributesToFocusGain(audioAttributes); focusGainToRequest = convertAudioAttributesToFocusGain(audioAttributes);
Assertions.checkArgument( Assertions.checkArgument(
focusGainToRequest == C.AUDIOFOCUS_GAIN || focusGainToRequest == C.AUDIOFOCUS_NONE, focusGainToRequest == AUDIOFOCUS_GAIN || focusGainToRequest == AUDIOFOCUS_NONE,
"Automatic handling of audio focus is only available for USAGE_MEDIA and USAGE_GAME."); "Automatic handling of audio focus is only available for USAGE_MEDIA and USAGE_GAME.");
} }
} }
@ -185,7 +216,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
private boolean shouldAbandonAudioFocusIfHeld(@Player.State int playbackState) { private boolean shouldAbandonAudioFocusIfHeld(@Player.State int playbackState) {
return playbackState == Player.STATE_IDLE || focusGainToRequest != C.AUDIOFOCUS_GAIN; return playbackState == Player.STATE_IDLE || focusGainToRequest != AUDIOFOCUS_GAIN;
} }
@PlayerCommand @PlayerCommand
@ -266,12 +297,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
* @param audioAttributes The audio attributes associated with this focus request. * @param audioAttributes The audio attributes associated with this focus request.
* @return The type of audio focus gain that should be requested. * @return The type of audio focus gain that should be requested.
*/ */
@C.AudioFocusGain private static @AudioFocusGain int convertAudioAttributesToFocusGain(
private static int convertAudioAttributesToFocusGain(@Nullable AudioAttributes audioAttributes) { @Nullable AudioAttributes audioAttributes) {
if (audioAttributes == null) { if (audioAttributes == null) {
// Don't handle audio focus. It may be either video only contents or developers // Don't handle audio focus. It may be either video only contents or developers
// want to have more finer grained control. (e.g. adding audio focus listener) // want to have more finer grained control. (e.g. adding audio focus listener)
return C.AUDIOFOCUS_NONE; return AUDIOFOCUS_NONE;
} }
switch (audioAttributes.usage) { switch (audioAttributes.usage) {
@ -279,13 +310,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
// during the phone call when AUDIOFOCUS_GAIN_TRANSIENT is requested for that. // during the phone call when AUDIOFOCUS_GAIN_TRANSIENT is requested for that.
// Don't request audio focus here. // Don't request audio focus here.
case C.USAGE_VOICE_COMMUNICATION_SIGNALLING: case C.USAGE_VOICE_COMMUNICATION_SIGNALLING:
return C.AUDIOFOCUS_NONE; return AUDIOFOCUS_NONE;
// Javadoc says 'AUDIOFOCUS_GAIN: Examples of uses of this focus gain are for music // Javadoc says 'AUDIOFOCUS_GAIN: Examples of uses of this focus gain are for music
// playback, for a game or a video player' // playback, for a game or a video player'
case C.USAGE_GAME: case C.USAGE_GAME:
case C.USAGE_MEDIA: case C.USAGE_MEDIA:
return C.AUDIOFOCUS_GAIN; return AUDIOFOCUS_GAIN;
// Special usages: USAGE_UNKNOWN shouldn't be used. Request audio focus to prevent // Special usages: USAGE_UNKNOWN shouldn't be used. Request audio focus to prevent
// multiple media playback happen at the same time. // multiple media playback happen at the same time.
@ -294,13 +325,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
TAG, TAG,
"Specify a proper usage in the audio attributes for audio focus" "Specify a proper usage in the audio attributes for audio focus"
+ " handling. Using AUDIOFOCUS_GAIN by default."); + " handling. Using AUDIOFOCUS_GAIN by default.");
return C.AUDIOFOCUS_GAIN; return AUDIOFOCUS_GAIN;
// Javadoc says 'AUDIOFOCUS_GAIN_TRANSIENT: An example is for playing an alarm, or // Javadoc says 'AUDIOFOCUS_GAIN_TRANSIENT: An example is for playing an alarm, or
// during a VoIP call' // during a VoIP call'
case C.USAGE_ALARM: case C.USAGE_ALARM:
case C.USAGE_VOICE_COMMUNICATION: case C.USAGE_VOICE_COMMUNICATION:
return C.AUDIOFOCUS_GAIN_TRANSIENT; return AUDIOFOCUS_GAIN_TRANSIENT;
// Javadoc says 'AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: Examples are when playing // Javadoc says 'AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: Examples are when playing
// driving directions or notifications' // driving directions or notifications'
@ -312,28 +343,28 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
case C.USAGE_NOTIFICATION_COMMUNICATION_REQUEST: case C.USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
case C.USAGE_NOTIFICATION_EVENT: case C.USAGE_NOTIFICATION_EVENT:
case C.USAGE_NOTIFICATION_RINGTONE: case C.USAGE_NOTIFICATION_RINGTONE:
return C.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK; return AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
// Javadoc says 'AUDIOFOCUS_GAIN_EXCLUSIVE: This is typically used if you are doing // Javadoc says 'AUDIOFOCUS_GAIN_EXCLUSIVE: This is typically used if you are doing
// audio recording or speech recognition'. // audio recording or speech recognition'.
// Assistant is considered as both recording and notifying developer // Assistant is considered as both recording and notifying developer
case C.USAGE_ASSISTANT: case C.USAGE_ASSISTANT:
if (Util.SDK_INT >= 19) { if (Util.SDK_INT >= 19) {
return C.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; return AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE;
} else { } else {
return C.AUDIOFOCUS_GAIN_TRANSIENT; return AUDIOFOCUS_GAIN_TRANSIENT;
} }
// Special usages: // Special usages:
case C.USAGE_ASSISTANCE_ACCESSIBILITY: case C.USAGE_ASSISTANCE_ACCESSIBILITY:
if (audioAttributes.contentType == C.CONTENT_TYPE_SPEECH) { if (audioAttributes.contentType == C.CONTENT_TYPE_SPEECH) {
// Voice shouldn't be interrupted by other playback. // Voice shouldn't be interrupted by other playback.
return C.AUDIOFOCUS_GAIN_TRANSIENT; return AUDIOFOCUS_GAIN_TRANSIENT;
} }
return C.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK; return AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
default: default:
Log.w(TAG, "Unidentified audio usage: " + audioAttributes.usage); Log.w(TAG, "Unidentified audio usage: " + audioAttributes.usage);
return C.AUDIOFOCUS_NONE; return AUDIOFOCUS_NONE;
} }
} }