From a506d245d13a9262ad58566a7002e571c39323ea Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 4 Feb 2022 16:17:25 +0000 Subject: [PATCH] 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 --- .../java/com/google/android/exoplayer2/C.java | 28 --------- .../android/exoplayer2/AudioFocusManager.java | 63 ++++++++++++++----- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/C.java b/library/common/src/main/java/com/google/android/exoplayer2/C.java index 44a546486f..0876cfc0e6 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/C.java @@ -471,34 +471,6 @@ public final class C { /** See {@link android.media.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 * #BUFFER_FLAG_KEY_FRAME}, {@link #BUFFER_FLAG_END_OF_STREAM}, {@link #BUFFER_FLAG_LAST_SAMPLE}, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/AudioFocusManager.java b/library/core/src/main/java/com/google/android/exoplayer2/AudioFocusManager.java index 276fcc914a..00d09cb562 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/AudioFocusManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/AudioFocusManager.java @@ -95,6 +95,37 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Audio focus has been temporarily lost, but playback may continue with reduced volume. */ 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 float VOLUME_MULTIPLIER_DUCK = 0.2f; @@ -106,7 +137,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Nullable private AudioAttributes audioAttributes; @AudioFocusState private int audioFocusState; - @C.AudioFocusGain private int focusGainToRequest; + private @AudioFocusGain int focusGainToRequest; private float volumeMultiplier = VOLUME_MULTIPLIER_DEFAULT; private @MonotonicNonNull AudioFocusRequest audioFocusRequest; @@ -147,7 +178,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; this.audioAttributes = audioAttributes; focusGainToRequest = convertAudioAttributesToFocusGain(audioAttributes); 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."); } } @@ -185,7 +216,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } 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 @@ -266,12 +297,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * @param audioAttributes The audio attributes associated with this focus request. * @return The type of audio focus gain that should be requested. */ - @C.AudioFocusGain - private static int convertAudioAttributesToFocusGain(@Nullable AudioAttributes audioAttributes) { + private static @AudioFocusGain int convertAudioAttributesToFocusGain( + @Nullable AudioAttributes audioAttributes) { if (audioAttributes == null) { // 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) - return C.AUDIOFOCUS_NONE; + return AUDIOFOCUS_NONE; } 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. // Don't request audio focus here. 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 // playback, for a game or a video player' case C.USAGE_GAME: case C.USAGE_MEDIA: - return C.AUDIOFOCUS_GAIN; + return AUDIOFOCUS_GAIN; // Special usages: USAGE_UNKNOWN shouldn't be used. Request audio focus to prevent // multiple media playback happen at the same time. @@ -294,13 +325,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; TAG, "Specify a proper usage in the audio attributes for audio focus" + " 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 // during a VoIP call' case C.USAGE_ALARM: 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 // 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_EVENT: 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 // audio recording or speech recognition'. // Assistant is considered as both recording and notifying developer case C.USAGE_ASSISTANT: if (Util.SDK_INT >= 19) { - return C.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; + return AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE; } else { - return C.AUDIOFOCUS_GAIN_TRANSIENT; + return AUDIOFOCUS_GAIN_TRANSIENT; } // Special usages: case C.USAGE_ASSISTANCE_ACCESSIBILITY: if (audioAttributes.contentType == C.CONTENT_TYPE_SPEECH) { // 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: Log.w(TAG, "Unidentified audio usage: " + audioAttributes.usage); - return C.AUDIOFOCUS_NONE; + return AUDIOFOCUS_NONE; } }