diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java index 52849a580f..4dc3f66026 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayer.java @@ -1175,7 +1175,6 @@ public interface ExoPlayer extends Player { * * @param listener The listener to be added. */ - @UnstableApi void addAnalyticsListener(AnalyticsListener listener); /** @@ -1183,7 +1182,6 @@ public interface ExoPlayer extends Player { * * @param listener The listener to be removed. */ - @UnstableApi void removeAnalyticsListener(AnalyticsListener listener); /** Returns the number of renderers. */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 31ea116b57..2c9345409f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -81,10 +81,10 @@ import java.util.List; * #onIsPlayingChanged(EventTime, boolean)}) or {@link #onEvents(Player, Events)}, which is called * after one or more events occurred together. */ -@UnstableApi public interface AnalyticsListener { /** A set of {@link EventFlags}. */ + @UnstableApi final class Events { private final FlagSet flags; @@ -164,6 +164,7 @@ public interface AnalyticsListener { */ // @Target list includes both 'default' targets and TYPE_USE, to ensure backwards compatibility // with Kotlin usages from before TYPE_USE was added. + @UnstableApi @Documented @Retention(RetentionPolicy.SOURCE) @Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE, TYPE_USE}) @@ -233,140 +234,146 @@ public interface AnalyticsListener { }) @interface EventFlags {} /** {@link Player#getCurrentTimeline()} changed. */ - int EVENT_TIMELINE_CHANGED = Player.EVENT_TIMELINE_CHANGED; + @UnstableApi int EVENT_TIMELINE_CHANGED = Player.EVENT_TIMELINE_CHANGED; /** * {@link Player#getCurrentMediaItem()} changed or the player started repeating the current item. */ - int EVENT_MEDIA_ITEM_TRANSITION = Player.EVENT_MEDIA_ITEM_TRANSITION; + @UnstableApi int EVENT_MEDIA_ITEM_TRANSITION = Player.EVENT_MEDIA_ITEM_TRANSITION; /** {@link Player#getCurrentTracks()} changed. */ - int EVENT_TRACKS_CHANGED = Player.EVENT_TRACKS_CHANGED; + @UnstableApi int EVENT_TRACKS_CHANGED = Player.EVENT_TRACKS_CHANGED; /** {@link Player#isLoading()} ()} changed. */ - int EVENT_IS_LOADING_CHANGED = Player.EVENT_IS_LOADING_CHANGED; + @UnstableApi int EVENT_IS_LOADING_CHANGED = Player.EVENT_IS_LOADING_CHANGED; /** {@link Player#getPlaybackState()} changed. */ - int EVENT_PLAYBACK_STATE_CHANGED = Player.EVENT_PLAYBACK_STATE_CHANGED; + @UnstableApi int EVENT_PLAYBACK_STATE_CHANGED = Player.EVENT_PLAYBACK_STATE_CHANGED; /** {@link Player#getPlayWhenReady()} changed. */ - int EVENT_PLAY_WHEN_READY_CHANGED = Player.EVENT_PLAY_WHEN_READY_CHANGED; + @UnstableApi int EVENT_PLAY_WHEN_READY_CHANGED = Player.EVENT_PLAY_WHEN_READY_CHANGED; /** {@link Player#getPlaybackSuppressionReason()} changed. */ + @UnstableApi int EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED = Player.EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED; /** {@link Player#isPlaying()} changed. */ - int EVENT_IS_PLAYING_CHANGED = Player.EVENT_IS_PLAYING_CHANGED; + @UnstableApi int EVENT_IS_PLAYING_CHANGED = Player.EVENT_IS_PLAYING_CHANGED; /** {@link Player#getRepeatMode()} changed. */ - int EVENT_REPEAT_MODE_CHANGED = Player.EVENT_REPEAT_MODE_CHANGED; + @UnstableApi int EVENT_REPEAT_MODE_CHANGED = Player.EVENT_REPEAT_MODE_CHANGED; /** {@link Player#getShuffleModeEnabled()} changed. */ - int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; + @UnstableApi int EVENT_SHUFFLE_MODE_ENABLED_CHANGED = Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED; /** {@link Player#getPlayerError()} changed. */ - int EVENT_PLAYER_ERROR = Player.EVENT_PLAYER_ERROR; + @UnstableApi int EVENT_PLAYER_ERROR = Player.EVENT_PLAYER_ERROR; /** * A position discontinuity occurred. See {@link * Player.Listener#onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int)}. */ - int EVENT_POSITION_DISCONTINUITY = Player.EVENT_POSITION_DISCONTINUITY; + @UnstableApi int EVENT_POSITION_DISCONTINUITY = Player.EVENT_POSITION_DISCONTINUITY; /** {@link Player#getPlaybackParameters()} changed. */ - int EVENT_PLAYBACK_PARAMETERS_CHANGED = Player.EVENT_PLAYBACK_PARAMETERS_CHANGED; + @UnstableApi int EVENT_PLAYBACK_PARAMETERS_CHANGED = Player.EVENT_PLAYBACK_PARAMETERS_CHANGED; /** {@link Player#getAvailableCommands()} changed. */ - int EVENT_AVAILABLE_COMMANDS_CHANGED = Player.EVENT_AVAILABLE_COMMANDS_CHANGED; + @UnstableApi int EVENT_AVAILABLE_COMMANDS_CHANGED = Player.EVENT_AVAILABLE_COMMANDS_CHANGED; /** {@link Player#getMediaMetadata()} changed. */ - int EVENT_MEDIA_METADATA_CHANGED = Player.EVENT_MEDIA_METADATA_CHANGED; + @UnstableApi int EVENT_MEDIA_METADATA_CHANGED = Player.EVENT_MEDIA_METADATA_CHANGED; /** {@link Player#getPlaylistMetadata()} changed. */ - int EVENT_PLAYLIST_METADATA_CHANGED = Player.EVENT_PLAYLIST_METADATA_CHANGED; + @UnstableApi int EVENT_PLAYLIST_METADATA_CHANGED = Player.EVENT_PLAYLIST_METADATA_CHANGED; /** {@link Player#getSeekBackIncrement()} changed. */ - int EVENT_SEEK_BACK_INCREMENT_CHANGED = Player.EVENT_SEEK_BACK_INCREMENT_CHANGED; + @UnstableApi int EVENT_SEEK_BACK_INCREMENT_CHANGED = Player.EVENT_SEEK_BACK_INCREMENT_CHANGED; /** {@link Player#getSeekForwardIncrement()} changed. */ + @UnstableApi int EVENT_SEEK_FORWARD_INCREMENT_CHANGED = Player.EVENT_SEEK_FORWARD_INCREMENT_CHANGED; /** {@link Player#getMaxSeekToPreviousPosition()} changed. */ + @UnstableApi int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED; /** {@link Player#getTrackSelectionParameters()} changed. */ + @UnstableApi int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED; /** Audio attributes changed. */ - int EVENT_AUDIO_ATTRIBUTES_CHANGED = Player.EVENT_AUDIO_ATTRIBUTES_CHANGED; + @UnstableApi int EVENT_AUDIO_ATTRIBUTES_CHANGED = Player.EVENT_AUDIO_ATTRIBUTES_CHANGED; /** An audio session id was set. */ - int EVENT_AUDIO_SESSION_ID = Player.EVENT_AUDIO_SESSION_ID; + @UnstableApi int EVENT_AUDIO_SESSION_ID = Player.EVENT_AUDIO_SESSION_ID; /** The volume changed. */ - int EVENT_VOLUME_CHANGED = Player.EVENT_VOLUME_CHANGED; + @UnstableApi int EVENT_VOLUME_CHANGED = Player.EVENT_VOLUME_CHANGED; /** Skipping silences was enabled or disabled in the audio stream. */ - int EVENT_SKIP_SILENCE_ENABLED_CHANGED = Player.EVENT_SKIP_SILENCE_ENABLED_CHANGED; + @UnstableApi int EVENT_SKIP_SILENCE_ENABLED_CHANGED = Player.EVENT_SKIP_SILENCE_ENABLED_CHANGED; /** The surface size changed. */ - int EVENT_SURFACE_SIZE_CHANGED = Player.EVENT_SURFACE_SIZE_CHANGED; + @UnstableApi int EVENT_SURFACE_SIZE_CHANGED = Player.EVENT_SURFACE_SIZE_CHANGED; /** The video size changed. */ - int EVENT_VIDEO_SIZE_CHANGED = Player.EVENT_VIDEO_SIZE_CHANGED; + @UnstableApi int EVENT_VIDEO_SIZE_CHANGED = Player.EVENT_VIDEO_SIZE_CHANGED; /** * The first frame has been rendered since setting the surface, since the renderer was reset or * since the stream changed. */ - int EVENT_RENDERED_FIRST_FRAME = Player.EVENT_RENDERED_FIRST_FRAME; + @UnstableApi int EVENT_RENDERED_FIRST_FRAME = Player.EVENT_RENDERED_FIRST_FRAME; /** Metadata associated with the current playback time was reported. */ - int EVENT_METADATA = Player.EVENT_METADATA; + @UnstableApi int EVENT_METADATA = Player.EVENT_METADATA; /** {@link Player#getCurrentCues()} changed. */ - int EVENT_CUES = Player.EVENT_CUES; + @UnstableApi int EVENT_CUES = Player.EVENT_CUES; /** {@link Player#getDeviceInfo()} changed. */ - int EVENT_DEVICE_INFO_CHANGED = Player.EVENT_DEVICE_INFO_CHANGED; + @UnstableApi int EVENT_DEVICE_INFO_CHANGED = Player.EVENT_DEVICE_INFO_CHANGED; /** {@link Player#getDeviceVolume()} changed. */ - int EVENT_DEVICE_VOLUME_CHANGED = Player.EVENT_DEVICE_VOLUME_CHANGED; + @UnstableApi int EVENT_DEVICE_VOLUME_CHANGED = Player.EVENT_DEVICE_VOLUME_CHANGED; /** A source started loading data. */ + @UnstableApi int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events /** A source started completed loading data. */ - int EVENT_LOAD_COMPLETED = 1001; + @UnstableApi int EVENT_LOAD_COMPLETED = 1001; /** A source canceled loading data. */ - int EVENT_LOAD_CANCELED = 1002; + @UnstableApi int EVENT_LOAD_CANCELED = 1002; /** A source had a non-fatal error loading data. */ - int EVENT_LOAD_ERROR = 1003; + @UnstableApi int EVENT_LOAD_ERROR = 1003; /** The downstream format sent to renderers changed. */ - int EVENT_DOWNSTREAM_FORMAT_CHANGED = 1004; + @UnstableApi int EVENT_DOWNSTREAM_FORMAT_CHANGED = 1004; /** Data was removed from the end of the media buffer. */ - int EVENT_UPSTREAM_DISCARDED = 1005; + @UnstableApi int EVENT_UPSTREAM_DISCARDED = 1005; /** The bandwidth estimate has been updated. */ - int EVENT_BANDWIDTH_ESTIMATE = 1006; + @UnstableApi int EVENT_BANDWIDTH_ESTIMATE = 1006; /** An audio renderer was enabled. */ - int EVENT_AUDIO_ENABLED = 1007; + @UnstableApi int EVENT_AUDIO_ENABLED = 1007; /** An audio renderer created a decoder. */ - int EVENT_AUDIO_DECODER_INITIALIZED = 1008; + @UnstableApi int EVENT_AUDIO_DECODER_INITIALIZED = 1008; /** The format consumed by an audio renderer changed. */ - int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1009; + @UnstableApi int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1009; /** The audio position has increased for the first time since the last pause or position reset. */ - int EVENT_AUDIO_POSITION_ADVANCING = 1010; + @UnstableApi int EVENT_AUDIO_POSITION_ADVANCING = 1010; /** An audio underrun occurred. */ - int EVENT_AUDIO_UNDERRUN = 1011; + @UnstableApi int EVENT_AUDIO_UNDERRUN = 1011; /** An audio renderer released a decoder. */ - int EVENT_AUDIO_DECODER_RELEASED = 1012; + @UnstableApi int EVENT_AUDIO_DECODER_RELEASED = 1012; /** An audio renderer was disabled. */ - int EVENT_AUDIO_DISABLED = 1013; + @UnstableApi int EVENT_AUDIO_DISABLED = 1013; /** The audio sink encountered a non-fatal error. */ - int EVENT_AUDIO_SINK_ERROR = 1014; + @UnstableApi int EVENT_AUDIO_SINK_ERROR = 1014; /** A video renderer was enabled. */ - int EVENT_VIDEO_ENABLED = 1015; + @UnstableApi int EVENT_VIDEO_ENABLED = 1015; /** A video renderer created a decoder. */ - int EVENT_VIDEO_DECODER_INITIALIZED = 1016; + @UnstableApi int EVENT_VIDEO_DECODER_INITIALIZED = 1016; /** The format consumed by a video renderer changed. */ - int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1017; + @UnstableApi int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1017; /** Video frames have been dropped. */ - int EVENT_DROPPED_VIDEO_FRAMES = 1018; + @UnstableApi int EVENT_DROPPED_VIDEO_FRAMES = 1018; /** A video renderer released a decoder. */ - int EVENT_VIDEO_DECODER_RELEASED = 1019; + @UnstableApi int EVENT_VIDEO_DECODER_RELEASED = 1019; /** A video renderer was disabled. */ - int EVENT_VIDEO_DISABLED = 1020; + @UnstableApi int EVENT_VIDEO_DISABLED = 1020; /** Video frame processing offset data has been reported. */ - int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1021; + @UnstableApi int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1021; /** A DRM session has been acquired. */ - int EVENT_DRM_SESSION_ACQUIRED = 1022; + @UnstableApi int EVENT_DRM_SESSION_ACQUIRED = 1022; /** DRM keys were loaded. */ - int EVENT_DRM_KEYS_LOADED = 1023; + @UnstableApi int EVENT_DRM_KEYS_LOADED = 1023; /** A non-fatal DRM session manager error occurred. */ - int EVENT_DRM_SESSION_MANAGER_ERROR = 1024; + @UnstableApi int EVENT_DRM_SESSION_MANAGER_ERROR = 1024; /** DRM keys were restored. */ - int EVENT_DRM_KEYS_RESTORED = 1025; + @UnstableApi int EVENT_DRM_KEYS_RESTORED = 1025; /** DRM keys were removed. */ - int EVENT_DRM_KEYS_REMOVED = 1026; + @UnstableApi int EVENT_DRM_KEYS_REMOVED = 1026; /** A DRM session has been released. */ - int EVENT_DRM_SESSION_RELEASED = 1027; + @UnstableApi int EVENT_DRM_SESSION_RELEASED = 1027; /** The player was released. */ - int EVENT_PLAYER_RELEASED = 1028; + @UnstableApi int EVENT_PLAYER_RELEASED = 1028; /** The audio codec encountered an error. */ - int EVENT_AUDIO_CODEC_ERROR = 1029; + @UnstableApi int EVENT_AUDIO_CODEC_ERROR = 1029; /** The video codec encountered an error. */ - int EVENT_VIDEO_CODEC_ERROR = 1030; + @UnstableApi int EVENT_VIDEO_CODEC_ERROR = 1030; /** Time information of an event. */ + @UnstableApi final class EventTime { /** @@ -515,6 +522,7 @@ public interface AnalyticsListener { * @deprecated Use {@link #onPlaybackStateChanged(EventTime, int)} and {@link * #onPlayWhenReadyChanged(EventTime, boolean, int)} instead. */ + @UnstableApi @Deprecated default void onPlayerStateChanged( EventTime eventTime, boolean playWhenReady, @Player.State int playbackState) {} @@ -525,6 +533,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param state The new {@link Player.State playback state}. */ + @UnstableApi default void onPlaybackStateChanged(EventTime eventTime, @Player.State int state) {} /** @@ -534,6 +543,7 @@ public interface AnalyticsListener { * @param playWhenReady Whether playback will proceed when ready. * @param reason The {@link Player.PlayWhenReadyChangeReason reason} of the change. */ + @UnstableApi default void onPlayWhenReadyChanged( EventTime eventTime, boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) {} @@ -543,6 +553,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param playbackSuppressionReason The new {@link PlaybackSuppressionReason}. */ + @UnstableApi default void onPlaybackSuppressionReasonChanged( EventTime eventTime, @PlaybackSuppressionReason int playbackSuppressionReason) {} @@ -552,6 +563,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param isPlaying Whether the player is playing. */ + @UnstableApi default void onIsPlayingChanged(EventTime eventTime, boolean isPlaying) {} /** @@ -560,6 +572,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param reason The reason for the timeline change. */ + @UnstableApi default void onTimelineChanged(EventTime eventTime, @TimelineChangeReason int reason) {} /** @@ -569,6 +582,7 @@ public interface AnalyticsListener { * @param mediaItem The media item. * @param reason The reason for the media item transition. */ + @UnstableApi default void onMediaItemTransition( EventTime eventTime, @Nullable MediaItem mediaItem, @@ -578,6 +592,7 @@ public interface AnalyticsListener { * @deprecated Use {@link #onPositionDiscontinuity(EventTime, Player.PositionInfo, * Player.PositionInfo, int)} instead. */ + @UnstableApi @Deprecated default void onPositionDiscontinuity(EventTime eventTime, @DiscontinuityReason int reason) {} @@ -589,6 +604,7 @@ public interface AnalyticsListener { * @param newPosition The position after the discontinuity. * @param reason The reason for the position discontinuity. */ + @UnstableApi default void onPositionDiscontinuity( EventTime eventTime, Player.PositionInfo oldPosition, @@ -600,6 +616,7 @@ public interface AnalyticsListener { * Player.PositionInfo, int)} instead, listening to changes with {@link * Player#DISCONTINUITY_REASON_SEEK}. */ + @UnstableApi @Deprecated default void onSeekStarted(EventTime eventTime) {} @@ -607,6 +624,7 @@ public interface AnalyticsListener { * @deprecated Seeks are processed without delay. Use {@link #onPositionDiscontinuity(EventTime, * int)} with reason {@link Player#DISCONTINUITY_REASON_SEEK} instead. */ + @UnstableApi @Deprecated default void onSeekProcessed(EventTime eventTime) {} @@ -616,6 +634,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param playbackParameters The new playback parameters. */ + @UnstableApi default void onPlaybackParametersChanged( EventTime eventTime, PlaybackParameters playbackParameters) {} @@ -625,6 +644,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param seekBackIncrementMs The seek back increment, in milliseconds. */ + @UnstableApi default void onSeekBackIncrementChanged(EventTime eventTime, long seekBackIncrementMs) {} /** @@ -633,6 +653,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param seekForwardIncrementMs The seek forward increment, in milliseconds. */ + @UnstableApi default void onSeekForwardIncrementChanged(EventTime eventTime, long seekForwardIncrementMs) {} /** @@ -642,6 +663,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param maxSeekToPreviousPositionMs The maximum seek to previous position, in milliseconds. */ + @UnstableApi default void onMaxSeekToPreviousPositionChanged( EventTime eventTime, long maxSeekToPreviousPositionMs) {} @@ -651,6 +673,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param repeatMode The new repeat mode. */ + @UnstableApi default void onRepeatModeChanged(EventTime eventTime, @Player.RepeatMode int repeatMode) {} /** @@ -659,6 +682,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param shuffleModeEnabled Whether the shuffle mode is enabled. */ + @UnstableApi default void onShuffleModeChanged(EventTime eventTime, boolean shuffleModeEnabled) {} /** @@ -667,11 +691,13 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param isLoading Whether the player is loading. */ + @UnstableApi default void onIsLoadingChanged(EventTime eventTime, boolean isLoading) {} /** * @deprecated Use {@link #onIsLoadingChanged(EventTime, boolean)} instead. */ + @UnstableApi @Deprecated default void onLoadingChanged(EventTime eventTime, boolean isLoading) {} @@ -681,6 +707,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param availableCommands The available commands. */ + @UnstableApi default void onAvailableCommandsChanged(EventTime eventTime, Player.Commands availableCommands) {} /** @@ -692,6 +719,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param error The error. */ + @UnstableApi default void onPlayerError(EventTime eventTime, PlaybackException error) {} /** @@ -703,6 +731,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param error The new error, or null if the error is being cleared. */ + @UnstableApi default void onPlayerErrorChanged(EventTime eventTime, @Nullable PlaybackException error) {} /** @@ -711,6 +740,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param tracks The tracks. Never null, but may be of length zero. */ + @UnstableApi default void onTracksChanged(EventTime eventTime, Tracks tracks) {} /** @@ -719,6 +749,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param trackSelectionParameters The new {@link TrackSelectionParameters}. */ + @UnstableApi default void onTrackSelectionParametersChanged( EventTime eventTime, TrackSelectionParameters trackSelectionParameters) {} @@ -732,6 +763,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param mediaMetadata The combined {@link MediaMetadata}. */ + @UnstableApi default void onMediaMetadataChanged(EventTime eventTime, MediaMetadata mediaMetadata) {} /** @@ -740,6 +772,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param playlistMetadata The playlist {@link MediaMetadata}. */ + @UnstableApi default void onPlaylistMetadataChanged(EventTime eventTime, MediaMetadata playlistMetadata) {} /** @@ -749,6 +782,7 @@ public interface AnalyticsListener { * @param loadEventInfo The {@link LoadEventInfo} defining the load event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ + @UnstableApi default void onLoadStarted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {} @@ -759,6 +793,7 @@ public interface AnalyticsListener { * @param loadEventInfo The {@link LoadEventInfo} defining the load event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ + @UnstableApi default void onLoadCompleted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {} @@ -769,6 +804,7 @@ public interface AnalyticsListener { * @param loadEventInfo The {@link LoadEventInfo} defining the load event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ + @UnstableApi default void onLoadCanceled( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {} @@ -788,6 +824,7 @@ public interface AnalyticsListener { * @param error The load error. * @param wasCanceled Whether the load was canceled as a result of the error. */ + @UnstableApi default void onLoadError( EventTime eventTime, LoadEventInfo loadEventInfo, @@ -801,6 +838,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param mediaLoadData The {@link MediaLoadData} defining the newly selected media data. */ + @UnstableApi default void onDownstreamFormatChanged(EventTime eventTime, MediaLoadData mediaLoadData) {} /** @@ -810,6 +848,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param mediaLoadData The {@link MediaLoadData} defining the media being discarded. */ + @UnstableApi default void onUpstreamDiscarded(EventTime eventTime, MediaLoadData mediaLoadData) {} /** @@ -820,6 +859,7 @@ public interface AnalyticsListener { * @param totalBytesLoaded The total bytes loaded this update is based on. * @param bitrateEstimate The bandwidth estimate, in bits per second. */ + @UnstableApi default void onBandwidthEstimate( EventTime eventTime, int totalLoadTimeMs, long totalBytesLoaded, long bitrateEstimate) {} @@ -829,6 +869,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param metadata The metadata. */ + @UnstableApi default void onMetadata(EventTime eventTime, Metadata metadata) {} /** @@ -840,12 +881,14 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param cues The {@link Cue Cues}. May be empty. */ + @UnstableApi default void onCues(EventTime eventTime, List cues) {} /** * @deprecated Use {@link #onAudioEnabled} and {@link #onVideoEnabled} instead. */ @Deprecated + @UnstableApi default void onDecoderEnabled( EventTime eventTime, int trackType, DecoderCounters decoderCounters) {} @@ -853,6 +896,7 @@ public interface AnalyticsListener { * @deprecated Use {@link #onAudioDecoderInitialized} and {@link #onVideoDecoderInitialized} * instead. */ + @UnstableApi @Deprecated default void onDecoderInitialized( EventTime eventTime, int trackType, String decoderName, long initializationDurationMs) {} @@ -861,12 +905,14 @@ public interface AnalyticsListener { * @deprecated Use {@link #onAudioInputFormatChanged(EventTime, Format, DecoderReuseEvaluation)} * and {@link #onVideoInputFormatChanged(EventTime, Format, DecoderReuseEvaluation)}. instead. */ + @UnstableApi @Deprecated default void onDecoderInputFormatChanged(EventTime eventTime, int trackType, Format format) {} /** * @deprecated Use {@link #onAudioDisabled} and {@link #onVideoDisabled} instead. */ + @UnstableApi @Deprecated default void onDecoderDisabled( EventTime eventTime, int trackType, DecoderCounters decoderCounters) {} @@ -878,6 +924,7 @@ public interface AnalyticsListener { * @param decoderCounters {@link DecoderCounters} that will be updated by the renderer for as long * as it remains enabled. */ + @UnstableApi default void onAudioEnabled(EventTime eventTime, DecoderCounters decoderCounters) {} /** @@ -889,6 +936,7 @@ public interface AnalyticsListener { * finished. * @param initializationDurationMs The time taken to initialize the decoder in milliseconds. */ + @UnstableApi default void onAudioDecoderInitialized( EventTime eventTime, String decoderName, @@ -898,6 +946,7 @@ public interface AnalyticsListener { /** * @deprecated Use {@link #onAudioDecoderInitialized(EventTime, String, long, long)}. */ + @UnstableApi @Deprecated default void onAudioDecoderInitialized( EventTime eventTime, String decoderName, long initializationDurationMs) {} @@ -905,6 +954,7 @@ public interface AnalyticsListener { /** * @deprecated Use {@link #onAudioInputFormatChanged(EventTime, Format, DecoderReuseEvaluation)}. */ + @UnstableApi @Deprecated default void onAudioInputFormatChanged(EventTime eventTime, Format format) {} @@ -917,6 +967,7 @@ public interface AnalyticsListener { * decoder instance can be reused for the new format, or {@code null} if the renderer did not * have a decoder. */ + @UnstableApi default void onAudioInputFormatChanged( EventTime eventTime, Format format, @@ -930,6 +981,7 @@ public interface AnalyticsListener { * @param playoutStartSystemTimeMs The approximate derived {@link System#currentTimeMillis()} at * which playout started. */ + @UnstableApi default void onAudioPositionAdvancing(EventTime eventTime, long playoutStartSystemTimeMs) {} /** @@ -941,6 +993,7 @@ public interface AnalyticsListener { * encoded audio. {@link C#TIME_UNSET} if the output buffer contains non-PCM encoded audio. * @param elapsedSinceLastFeedMs The time since audio was last written to the output buffer. */ + @UnstableApi default void onAudioUnderrun( EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {} @@ -950,6 +1003,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param decoderName The decoder that was released. */ + @UnstableApi default void onAudioDecoderReleased(EventTime eventTime, String decoderName) {} /** @@ -958,6 +1012,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param decoderCounters {@link DecoderCounters} that were updated by the renderer. */ + @UnstableApi default void onAudioDisabled(EventTime eventTime, DecoderCounters decoderCounters) {} /** @@ -966,6 +1021,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param audioSessionId The audio session ID. */ + @UnstableApi default void onAudioSessionIdChanged(EventTime eventTime, int audioSessionId) {} /** @@ -974,6 +1030,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param audioAttributes The audio attributes. */ + @UnstableApi default void onAudioAttributesChanged(EventTime eventTime, AudioAttributes audioAttributes) {} /** @@ -982,6 +1039,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. */ + @UnstableApi default void onSkipSilenceEnabledChanged(EventTime eventTime, boolean skipSilenceEnabled) {} /** @@ -999,6 +1057,7 @@ public interface AnalyticsListener { * AudioSink.InitializationException}, a {@link AudioSink.WriteException}, or an {@link * AudioSink.UnexpectedDiscontinuityException}. */ + @UnstableApi default void onAudioSinkError(EventTime eventTime, Exception audioSinkError) {} /** @@ -1015,6 +1074,7 @@ public interface AnalyticsListener { * @param audioCodecError The error. Typically a {@link CodecException} if the renderer uses * {@link MediaCodec}, or a {@link DecoderException} if the renderer uses a software decoder. */ + @UnstableApi default void onAudioCodecError(EventTime eventTime, Exception audioCodecError) {} /** @@ -1023,6 +1083,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param volume The new volume, with 0 being silence and 1 being unity gain. */ + @UnstableApi default void onVolumeChanged(EventTime eventTime, float volume) {} /** @@ -1031,6 +1092,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param deviceInfo The new {@link DeviceInfo}. */ + @UnstableApi default void onDeviceInfoChanged(EventTime eventTime, DeviceInfo deviceInfo) {} /** @@ -1040,6 +1102,7 @@ public interface AnalyticsListener { * @param volume The new device volume, with 0 being silence and 1 being unity gain. * @param muted Whether the device is muted. */ + @UnstableApi default void onDeviceVolumeChanged(EventTime eventTime, int volume, boolean muted) {} /** @@ -1049,6 +1112,7 @@ public interface AnalyticsListener { * @param decoderCounters {@link DecoderCounters} that will be updated by the renderer for as long * as it remains enabled. */ + @UnstableApi default void onVideoEnabled(EventTime eventTime, DecoderCounters decoderCounters) {} /** @@ -1060,6 +1124,7 @@ public interface AnalyticsListener { * finished. * @param initializationDurationMs The time taken to initialize the decoder in milliseconds. */ + @UnstableApi default void onVideoDecoderInitialized( EventTime eventTime, String decoderName, @@ -1069,6 +1134,7 @@ public interface AnalyticsListener { /** * @deprecated Use {@link #onVideoDecoderInitialized(EventTime, String, long, long)}. */ + @UnstableApi @Deprecated default void onVideoDecoderInitialized( EventTime eventTime, String decoderName, long initializationDurationMs) {} @@ -1076,6 +1142,7 @@ public interface AnalyticsListener { /** * @deprecated Use {@link #onVideoInputFormatChanged(EventTime, Format, DecoderReuseEvaluation)}. */ + @UnstableApi @Deprecated default void onVideoInputFormatChanged(EventTime eventTime, Format format) {} @@ -1088,6 +1155,7 @@ public interface AnalyticsListener { * decoder instance can be reused for the new format, or {@code null} if the renderer did not * have a decoder. */ + @UnstableApi default void onVideoInputFormatChanged( EventTime eventTime, Format format, @@ -1102,6 +1170,7 @@ public interface AnalyticsListener { * is timed from when the renderer was started or from when dropped frames were last reported * (whichever was more recent), and not from when the first of the reported drops occurred. */ + @UnstableApi default void onDroppedVideoFrames(EventTime eventTime, int droppedFrames, long elapsedMs) {} /** @@ -1110,6 +1179,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param decoderName The decoder that was released. */ + @UnstableApi default void onVideoDecoderReleased(EventTime eventTime, String decoderName) {} /** @@ -1118,6 +1188,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param decoderCounters {@link DecoderCounters} that were updated by the renderer. */ + @UnstableApi default void onVideoDisabled(EventTime eventTime, DecoderCounters decoderCounters) {} /** @@ -1135,6 +1206,7 @@ public interface AnalyticsListener { * rendered since the last call to this method. * @param frameCount The number to samples included in {@code totalProcessingOffsetUs}. */ + @UnstableApi default void onVideoFrameProcessingOffset( EventTime eventTime, long totalProcessingOffsetUs, int frameCount) {} @@ -1152,6 +1224,7 @@ public interface AnalyticsListener { * @param videoCodecError The error. Typically a {@link CodecException} if the renderer uses * {@link MediaCodec}, or a {@link DecoderException} if the renderer uses a software decoder. */ + @UnstableApi default void onVideoCodecError(EventTime eventTime, Exception videoCodecError) {} /** @@ -1163,6 +1236,7 @@ public interface AnalyticsListener { * however may also be other output types (e.g., a {@link VideoDecoderOutputBufferRenderer}). * @param renderTimeMs {@link SystemClock#elapsedRealtime()} when the first frame was rendered. */ + @UnstableApi default void onRenderedFirstFrame(EventTime eventTime, Object output, long renderTimeMs) {} /** @@ -1172,11 +1246,13 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param videoSize The new size of the video. */ + @UnstableApi default void onVideoSizeChanged(EventTime eventTime, VideoSize videoSize) {} /** * @deprecated Implement {@link #onVideoSizeChanged(EventTime eventTime, VideoSize)} instead. */ + @UnstableApi @Deprecated default void onVideoSizeChanged( EventTime eventTime, @@ -1194,11 +1270,13 @@ public interface AnalyticsListener { * @param height The surface height in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if * the video is not rendered onto a surface. */ + @UnstableApi default void onSurfaceSizeChanged(EventTime eventTime, int width, int height) {} /** * @deprecated Implement {@link #onDrmSessionAcquired(EventTime, int)} instead. */ + @UnstableApi @Deprecated default void onDrmSessionAcquired(EventTime eventTime) {} @@ -1208,6 +1286,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param state The {@link DrmSession.State} of the session when the acquisition completed. */ + @UnstableApi default void onDrmSessionAcquired(EventTime eventTime, @DrmSession.State int state) {} /** @@ -1215,6 +1294,7 @@ public interface AnalyticsListener { * * @param eventTime The event time. */ + @UnstableApi default void onDrmKeysLoaded(EventTime eventTime) {} /** @@ -1230,6 +1310,7 @@ public interface AnalyticsListener { * @param eventTime The event time. * @param error The error. */ + @UnstableApi default void onDrmSessionManagerError(EventTime eventTime, Exception error) {} /** @@ -1237,6 +1318,7 @@ public interface AnalyticsListener { * * @param eventTime The event time. */ + @UnstableApi default void onDrmKeysRestored(EventTime eventTime) {} /** @@ -1244,6 +1326,7 @@ public interface AnalyticsListener { * * @param eventTime The event time. */ + @UnstableApi default void onDrmKeysRemoved(EventTime eventTime) {} /** @@ -1251,6 +1334,7 @@ public interface AnalyticsListener { * * @param eventTime The event time. */ + @UnstableApi default void onDrmSessionReleased(EventTime eventTime) {} /** @@ -1258,6 +1342,7 @@ public interface AnalyticsListener { * * @param eventTime The event time. */ + @UnstableApi default void onPlayerReleased(EventTime eventTime) {} /** @@ -1287,5 +1372,6 @@ public interface AnalyticsListener { * @param player The {@link Player}. * @param events The {@link Events} that occurred in this iteration. */ + @UnstableApi default void onEvents(Player player, Events events) {} } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java index 88986f4e1d..effe728080 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/EventLogger.java @@ -49,7 +49,6 @@ import java.util.Locale; /** Logs events from {@link Player} and other core components using {@link Log}. */ @SuppressWarnings("UngroupedOverloads") -@UnstableApi public class EventLogger implements AnalyticsListener { private static final String DEFAULT_TAG = "EventLogger"; @@ -91,6 +90,7 @@ public class EventLogger implements AnalyticsListener { * @param trackSelector This parameter is ignored. * @deprecated Use {@link EventLogger()} */ + @UnstableApi @Deprecated public EventLogger(@Nullable MappingTrackSelector trackSelector) { this(DEFAULT_TAG); @@ -103,6 +103,7 @@ public class EventLogger implements AnalyticsListener { * @param tag The tag used for logging. * @deprecated Use {@link EventLogger(String)} */ + @UnstableApi @Deprecated public EventLogger(@Nullable MappingTrackSelector trackSelector, String tag) { this(tag); @@ -110,16 +111,19 @@ public class EventLogger implements AnalyticsListener { // AnalyticsListener + @UnstableApi @Override public void onIsLoadingChanged(EventTime eventTime, boolean isLoading) { logd(eventTime, "loading", Boolean.toString(isLoading)); } + @UnstableApi @Override public void onPlaybackStateChanged(EventTime eventTime, @Player.State int state) { logd(eventTime, "state", getStateString(state)); } + @UnstableApi @Override public void onPlayWhenReadyChanged( EventTime eventTime, boolean playWhenReady, @Player.PlayWhenReadyChangeReason int reason) { @@ -129,6 +133,7 @@ public class EventLogger implements AnalyticsListener { playWhenReady + ", " + getPlayWhenReadyChangeReasonString(reason)); } + @UnstableApi @Override public void onPlaybackSuppressionReasonChanged( EventTime eventTime, @PlaybackSuppressionReason int playbackSuppressionReason) { @@ -138,21 +143,25 @@ public class EventLogger implements AnalyticsListener { getPlaybackSuppressionReasonString(playbackSuppressionReason)); } + @UnstableApi @Override public void onIsPlayingChanged(EventTime eventTime, boolean isPlaying) { logd(eventTime, "isPlaying", Boolean.toString(isPlaying)); } + @UnstableApi @Override public void onRepeatModeChanged(EventTime eventTime, @Player.RepeatMode int repeatMode) { logd(eventTime, "repeatMode", getRepeatModeString(repeatMode)); } + @UnstableApi @Override public void onShuffleModeChanged(EventTime eventTime, boolean shuffleModeEnabled) { logd(eventTime, "shuffleModeEnabled", Boolean.toString(shuffleModeEnabled)); } + @UnstableApi @Override public void onPositionDiscontinuity( EventTime eventTime, @@ -200,12 +209,14 @@ public class EventLogger implements AnalyticsListener { logd(eventTime, "positionDiscontinuity", builder.toString()); } + @UnstableApi @Override public void onPlaybackParametersChanged( EventTime eventTime, PlaybackParameters playbackParameters) { logd(eventTime, "playbackParameters", playbackParameters.toString()); } + @UnstableApi @Override public void onTimelineChanged(EventTime eventTime, @Player.TimelineChangeReason int reason) { int periodCount = eventTime.timeline.getPeriodCount(); @@ -244,6 +255,7 @@ public class EventLogger implements AnalyticsListener { logd("]"); } + @UnstableApi @Override public void onMediaItemTransition( EventTime eventTime, @Nullable MediaItem mediaItem, int reason) { @@ -255,11 +267,13 @@ public class EventLogger implements AnalyticsListener { + "]"); } + @UnstableApi @Override public void onPlayerError(EventTime eventTime, PlaybackException error) { loge(eventTime, "playerFailed", error); } + @UnstableApi @Override public void onTracksChanged(EventTime eventTime, Tracks tracks) { logd("tracks [" + getEventTimeString(eventTime)); @@ -303,6 +317,7 @@ public class EventLogger implements AnalyticsListener { logd("]"); } + @UnstableApi @Override public void onMetadata(EventTime eventTime, Metadata metadata) { logd("metadata [" + getEventTimeString(eventTime)); @@ -310,23 +325,27 @@ public class EventLogger implements AnalyticsListener { logd("]"); } + @UnstableApi @Override public void onAudioEnabled(EventTime eventTime, DecoderCounters decoderCounters) { logd(eventTime, "audioEnabled"); } + @UnstableApi @Override public void onAudioDecoderInitialized( EventTime eventTime, String decoderName, long initializationDurationMs) { logd(eventTime, "audioDecoderInitialized", decoderName); } + @UnstableApi @Override public void onAudioInputFormatChanged( EventTime eventTime, Format format, @Nullable DecoderReuseEvaluation decoderReuseEvaluation) { logd(eventTime, "audioInputFormat", Format.toLogString(format)); } + @UnstableApi @Override public void onAudioUnderrun( EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) { @@ -337,21 +356,25 @@ public class EventLogger implements AnalyticsListener { /* throwable= */ null); } + @UnstableApi @Override public void onAudioDecoderReleased(EventTime eventTime, String decoderName) { logd(eventTime, "audioDecoderReleased", decoderName); } + @UnstableApi @Override public void onAudioDisabled(EventTime eventTime, DecoderCounters decoderCounters) { logd(eventTime, "audioDisabled"); } + @UnstableApi @Override public void onAudioSessionIdChanged(EventTime eventTime, int audioSessionId) { logd(eventTime, "audioSessionId", Integer.toString(audioSessionId)); } + @UnstableApi @Override public void onAudioAttributesChanged(EventTime eventTime, AudioAttributes audioAttributes) { logd( @@ -366,64 +389,76 @@ public class EventLogger implements AnalyticsListener { + audioAttributes.allowedCapturePolicy); } + @UnstableApi @Override public void onSkipSilenceEnabledChanged(EventTime eventTime, boolean skipSilenceEnabled) { logd(eventTime, "skipSilenceEnabled", Boolean.toString(skipSilenceEnabled)); } + @UnstableApi @Override public void onVolumeChanged(EventTime eventTime, float volume) { logd(eventTime, "volume", Float.toString(volume)); } + @UnstableApi @Override public void onVideoEnabled(EventTime eventTime, DecoderCounters decoderCounters) { logd(eventTime, "videoEnabled"); } + @UnstableApi @Override public void onVideoDecoderInitialized( EventTime eventTime, String decoderName, long initializationDurationMs) { logd(eventTime, "videoDecoderInitialized", decoderName); } + @UnstableApi @Override public void onVideoInputFormatChanged( EventTime eventTime, Format format, @Nullable DecoderReuseEvaluation decoderReuseEvaluation) { logd(eventTime, "videoInputFormat", Format.toLogString(format)); } + @UnstableApi @Override public void onDroppedVideoFrames(EventTime eventTime, int droppedFrames, long elapsedMs) { logd(eventTime, "droppedFrames", Integer.toString(droppedFrames)); } + @UnstableApi @Override public void onVideoDecoderReleased(EventTime eventTime, String decoderName) { logd(eventTime, "videoDecoderReleased", decoderName); } + @UnstableApi @Override public void onVideoDisabled(EventTime eventTime, DecoderCounters decoderCounters) { logd(eventTime, "videoDisabled"); } + @UnstableApi @Override public void onRenderedFirstFrame(EventTime eventTime, Object output, long renderTimeMs) { logd(eventTime, "renderedFirstFrame", String.valueOf(output)); } + @UnstableApi @Override public void onVideoSizeChanged(EventTime eventTime, VideoSize videoSize) { logd(eventTime, "videoSize", videoSize.width + ", " + videoSize.height); } + @UnstableApi @Override public void onLoadStarted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { // Do nothing. } + @UnstableApi @Override public void onLoadError( EventTime eventTime, @@ -434,64 +469,76 @@ public class EventLogger implements AnalyticsListener { printInternalError(eventTime, "loadError", error); } + @UnstableApi @Override public void onLoadCanceled( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { // Do nothing. } + @UnstableApi @Override public void onLoadCompleted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { // Do nothing. } + @UnstableApi @Override public void onBandwidthEstimate( EventTime eventTime, int totalLoadTimeMs, long totalBytesLoaded, long bitrateEstimate) { // Do nothing. } + @UnstableApi @Override public void onSurfaceSizeChanged(EventTime eventTime, int width, int height) { logd(eventTime, "surfaceSize", width + ", " + height); } + @UnstableApi @Override public void onUpstreamDiscarded(EventTime eventTime, MediaLoadData mediaLoadData) { logd(eventTime, "upstreamDiscarded", Format.toLogString(mediaLoadData.trackFormat)); } + @UnstableApi @Override public void onDownstreamFormatChanged(EventTime eventTime, MediaLoadData mediaLoadData) { logd(eventTime, "downstreamFormat", Format.toLogString(mediaLoadData.trackFormat)); } + @UnstableApi @Override public void onDrmSessionAcquired(EventTime eventTime, @DrmSession.State int state) { logd(eventTime, "drmSessionAcquired", "state=" + state); } + @UnstableApi @Override public void onDrmSessionManagerError(EventTime eventTime, Exception error) { printInternalError(eventTime, "drmSessionManagerError", error); } + @UnstableApi @Override public void onDrmKeysRestored(EventTime eventTime) { logd(eventTime, "drmKeysRestored"); } + @UnstableApi @Override public void onDrmKeysRemoved(EventTime eventTime) { logd(eventTime, "drmKeysRemoved"); } + @UnstableApi @Override public void onDrmKeysLoaded(EventTime eventTime) { logd(eventTime, "drmKeysLoaded"); } + @UnstableApi @Override public void onDrmSessionReleased(EventTime eventTime) { logd(eventTime, "drmSessionReleased"); @@ -502,6 +549,7 @@ public class EventLogger implements AnalyticsListener { * * @param msg The message to log. */ + @UnstableApi protected void logd(String msg) { Log.d(tag, msg); } @@ -511,6 +559,7 @@ public class EventLogger implements AnalyticsListener { * * @param msg The message to log. */ + @UnstableApi protected void loge(String msg) { Log.e(tag, msg); }