All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Use consumer pro guard rules defined in proguard-consumer-rules.pro instead of @Keep to prevent obfuscation of DTOs
- Added explicit runtime dependency to kotlin-parcelize-runtime to fix R8 issues, and changed publish script to also add runtime deps to pom.xml
- The StackTrace used for errorDetails didn't include the Exception that was thrown.
- Use Throwable.toString() as fallback for the errorMessage in case there is no error message provided
- [Internal] Updated test dependencies
- Increased targetSdkVersion and compileSdkVersion to 35 (Android 15)
- [Internal] Upgraded agp to 8.7 and gradle to 8.9
- Upgraded bitmovin player to 3.94.0, amazon ivs player to 1.34.0 and media3-exoplayer to 1.5.0
- Handle Bitmovin Decoding ErrorDetails correctly to not cut them off anymore in most cases
- Synchronized all methods of ObservableSupport due to crashes seen in android sdk index
- [Internal] Enable testreports directly in github ui
- Tracking of SSAI ad quartiles is off by default and can be enabled via the
ssaiEngagementTrackingEnabled
config in AnalyticsConfig
- [AN-4201] Made sequenceNumber and impressionId resetting atomic + refactoring
- CSAI: Added missing pageLoadType = 1 to request (also fixed on server side)
- Binary compatibility issues with Bitmovin player bundling that was introduced with
3.9.0
(AnaltyicsConfig
data class change)
- Cache UserId since retrieval is not so cheap can cause the app to hang (as seen in android sdk console logs)
- Make handling of listeners in observable thread safe (seen crashes in android sdk console logs)
- New Config to configure the LogLevel of the SDK (default is LogLevel.ERROR)
- All players: Send out sample on detaching of collector to improve data quality
- [Internal] Upgraded
bitmovin player
from3.78.0
to3.81.0
- [Internal] Upgraded
media3 exoplayer
from1.4.0
to1.4.1
- New API to report ssai ad quartiles
- [Internal] API checks for the
collector
module. - [Internal] Github Action's System tests sends a Slack message whenever it fails on the main branch.
- Changed
appcompat
version from1.7.0
to1.6.1
to have same version as bitmovin player
- [Internal] Removed DebugListener related classes from core collector
- Enhanced source format and source URL detection for Exoplayer and Media3 ExoPlayer.
- Race condition that could cause a crash in case the ssai API is called before attaching the collector to the player.
- [Internal] Jacoco Coverage do not ignore Robolectric powered tests anymore.
- [Internal] Added an hardcoded sequence number limit (1000).
- [Internal] Upgraded
bitmovin player
from3.75.0
to3.78.0
- [Internal] Upgraded
media3 exoplayer
from1.3.1
to1.4.0
- Adding download speed metrics tracking to the Bitmovin Player Collector.
- Removed unnecessary logging of every downloaded file
- Media3 Exoplayer and ExoPlayer: Potential crashes in rare events when DownloadSpeedMeter reports Infinity or NaN values
- [Internal] Fixed the SonarQube test coverage report.
- Adding auto play detection for the Bitmovin Player
- [internal] Added the token for the Google SDK indexing to each of the non-test modules.
- [Internal] Run SystemTests through GitHub Actions on every PR
- Upgraded
gson
from2.10.1
to2.11.0
- Upgraded
kotlinx-coroutines
from1.8.0
to1.8.1
- Upgraded
appcompat
from1.6.1
to1.7.0
- [Internal] Upgraded
bitmovin player
from3.64.0
to3.75.0
- [Internal] Upgraded
amazon-ivs
from1.27.0
to1.29.0
- [Internal] Fixed IVS SystemTest setup to be able to run it in CI
- [Internal] The tests samples are now forwarded to the real server.
- [Internal] The tests metadata are now named according to the test name.
- [Internal] Tests that involve blocking actions are now awaited for the result to be available before continuing to increase consistency.
- [Internal] The runBlockingTest function hides it's presence in the stack trace to enhance readability.
- [Internal] The impression id now appears in the error message when a blocking test (which use
runBlockingTest
) fails. - [Internal] Adding a waiting for all requests mechanism to the tests to ensure that all requests are sent before the test extract the impressions.
- Policy violations when using
StrictMode.detectDiskWrites()
,StrictMode.detectDiskReads()
andStrictMode.detectCustomSlowCalls()
, due to mainScope usage for persistent event queue
- [internal] API docs for ssai feature
- new api to flag part of the collected information as ssai stream
- Increased minimum required compileSdk to 34
- Updated bitmovin player (v3.68.0), media3-exoplayer (v1.3.1) and amazon-ivs (v1.27.0)
- Upgraded kotlin version to 1.9.23
- Upgraded kotlinx-coroutines-android to 1.8.0
- [Internal] Optin for com.bitmovin.player.core.internal.InternalPlayerApi to have access to BuildInfo for bitmovin player version
- [Internal] Updated systemtests for bitmovinplayer to handle newly introduced error codes in player v3.63.0
- java.lang.IllegalAccessException when using strict mode with detectIncorrectContextUse() due to WindowManager usage
- [Internal] Changed Systemtest Managed Devices to use image with API Level 34 and moved all except amazon ivs tests to google image since aosp-atd doesn't support drm anymore
- Seek events in paused state not tracked correctly (bitmovin, media3, and exoplayer)
- Upgraded to Kotlin 1.9.21
- Upgraded compileSdk and targetSdkVersion to 34
- Upgraded collector dependencies (okhttp3 to 4.12.0, gson to 2.10.1, kotlinx-coroutines-core to 1.7.3)
- Upgraded to latest bitmovin player (v3.54.0)
- [Internal] Upgraded to gradle 8.2
- [Internal] Upgraded test dependencies to latest (mockk to 1.13.7, robolectric to 4.11.1, mockito-inline to 5.2.0, ima to 3.31.0, work-runtime-ktx to 2.9.0)
- [Internal] Upgraded build tools (spotless, jacoco)
- IVS Player: Added tracking of source path for ivs player version >= 1.23.0
- All Players: Added tracking of AV1 support on device.
- Upgraded to latest bitmovin player (v3.53.0)
- Upgraded to latest amazon ivs player (1.23.0)
- Changed minimum required android version to android 5.0 (API level 21)
- Upgrade example apps to latest bitmovin player (v3.46.0) and ivs player (v1.22.0)
- ExoPlayer/Media3 ExoPlayer: Use position of event object instead of player.position on seek events
- Support for media3-exoplayer
- Subtitle tracking for exoplayer
- Upgrade example apps to latest bitmovin player (v3.42.0), ivs player (v1.21.0) and exoplayer (v2.19.1)
- [internal] Refactoring of exoplayer collector + increase of testcoverage
- [internal] AN-3404 - Replaced usage of deprecated Handler() with explicit usage of looper (Handler(looper))
- Upgrade example app to latest bitmovin player (v3.41.0)
- Backwards compatibility for bitmovin player to support versions before 3.39.0
- Introduced new API v3 for all players with breaking changes compared to v2
- Upgraded to Kotlin 1.8.20
- ExoPlayer: More specific PlaybackException mapping (using errorCodes instead of error types and errorCode names are now part of description)
- Upgrade example app to latest bitmovin player (v3.40.0), latest ivs player (v1.20.0) and latest exoplayer (v2.19.0)
- Bitmovin Player: Throw exception if two bitmovin analytics collector instances are attached to the same player instance
- SourceUrls are autodetected and cannot be specified through metadata anymore
- Prevent context leaking through using context.applicationContext in constructors
- Set current position for videoTimeStart and videoTimeEnd when customData event is sent
- IVS Player: Ignore isLive property for IVS player since it is just a fallback in case the player does not provide the information and IVS player doesn't differentiate between live and source not loaded, so it cannot be used there. This streamlines the behaviour with other players.
- ExoPlayer: More reliable tracking if player is muted
- Upgrade example app to latest bitmovin player (v3.38.0) and latest exoplayer version (v2.18.7)
CollectorConfig.longTermRetryEnabled
with default value offalse
. When set totrue
, analytics events that have failed to be sent are cached in a persistent way and re-sent as soon as there is network again
- [internal] Bitmovin player collector depends on
player-core
package instead ofplayer
- All collectors use
compileOnly
dependency to players instead ofimplementation
- Upgrade example app to latest bitmovin player (v3.37.0)
- Upgrade example app to latest exoplayer version (v2.18.6)
- IVS Player and ExoPlayer: Streamlined reporting of video duration for live streams to be 0, to be consistent with other players/platforms
- [internal] New
AnalyticsConfig
which can be used to create aAnalyticsCollector
- Upgrade example apps to use latest amazon ivs player (v1.18.0) and latest bitmovin player (v3.35.2)
- [internal] Systemtests for Bitmovin and Exoplayer collectors
- Bitmovin Player: New quality on quality change events was tracked one sample too early
- IVS Player: Wrong initialization order on startup
- IVS Player: Wrong order of releasing of resources when collector is detached
- IVS Player: Reporting of negative droppedFrames in certain edgecases
- Exo Player and Bitmovin Player: Tracking if player is muted
- All players: Reporting of
videostartup_time = 0
on certain edgecases where startup was very fast
- [internal] Bitmovin player version detection catches
ClassNotFoundException
and fallbacks to core module BuildConfig. - Upgraded example apps to latest bitmovin player (v3.35.1) and latest exoplayer (v2.18.5)
- [internal] Systemtests for IVS collector
- Calculation of dropped frames on IVS collector
- Workaround issue in Bitmovin Player version 3.34.0 and 3.35.0 that would lead to a
ClassNotFoundException
when detecting the player version.
- Example app with Amazon IVS setup
- Amazon IVS adapter
- Interfaces for each collector
- Descriptive error messages for analytics errors
- [internal] obsolete test dependencies
- [internal] unnecessary TODOs
- [internal] cleaned obsolete parts of mavenpublish script
- Deprecated v1 Collectors
- [internal] updated gradle plugin and build dependencies
- [internal] updated spotless config
- [internal] move to main as default branch
- [internal] refactored PlayerTech to be constant and part of adapters
- [internal] fix AdPosition and AdTagType enums to return configured string representation
- [internal] Converted all Java classes that were left to kotlin
- [internal] cleanup of exoplayer example app and added more scenarios
- [internal] use
System.getProperty("http.agent")
for user agent tracking - Upgraded okhttp3 to v4.10.0 (this is a major version upgrade from v3 to v4)
- Upgraded gson dependency to v2.8.9
- Upgraded androidx.appcompat dependency to v1.6.1
- Upgraded example apps to latest bitmovin player (v3.33.0) and latest exoplayer (v2.18.4)
- Deprecated obsolete PlayerType config in AnalyticsConfig
- Made all bitmovin and exoplayer collector classes that are not part of the public API internal
- Stopped sending samples once player is released and collector is still attached
- [internal] reporting of videoTimeStart and videoTimeEnd for audioTrackChange, subtitleChange, qualityChange
- [internal] tracking of http status codes on exoplayer
- Tracking of bitmovin player key when it is specified in the manifest
- Tracking of audiolanguage, audiocodec and videocodec for exoplayer
- Serialization issues when ProGuard is used for obfuscation
- ExoPlayer v2.18.3 could crash on detaching of analytics listener on certain scenarios
- BitmovinPlayer: Improved ad tracking
- Detection of FireOS 8
- Detection of UHD screens on AndroidTVs
- BitmovinPlayer: Improved ad tracking
- Deprecated v1 Collector
- Detection of FireOS 8
- Detection of UHD screens on AndroidTVs
- increases error stacktrace size to 50 lines
- [internal] changed from sonarQube to sonarCloud
- increases error stacktrace size to 50 lines
- [internal] changed from sonarQube to sonarCloud
- Made FeatureManager threadsafe
- Upgraded kotlin version to 1.7.20
- Upgraded targetSdkVersion and compileSdkVersion to 33
- Upgraded to gradle 7.3.1
- Updated example apps
- Made FeatureManager threadsafe
- Upgraded kotlin version to 1.7.20
- Upgraded targetSdkVersion and compileSdkVersion to 33
- Upgraded to gradle 7.3.1
- Updated example apps
- updates ExoPlayer to
2.18.1
- updates BitmovinPlayer to
3.25.1
- improve null checks when extracting Status code from
LoadEventInfo
inExoPlayerHttpRequestTrackingAdapter
- Fixes concurrency bug that could cause issues in certain edge cases where many http requests are sent by the player
- improve null checks when extracting Status code from
LoadEventInfo
inExoPlayerHttpRequestTrackingAdapter
- Fixes concurrency bug that could cause issues in certain edge cases where many http requests are sent by the player
progUrl
toBitmovinAnalyticsConfig
andSourceMetadata
progUrl
toBitmovinAnalyticsConfig
andSourceMetadata
- updates ExoPlayer to
2.18.x
- fixed issue where late attaching of collector caused
videoStartupTime
= 0
- fixed issue where late attaching of collector caused
videoStartupTime
= 0
- Add exception message to
error_message
field of sample for ExoPlayer collector
- Add exception message to
error_message
field of sample for ExoPlayer collector
- expose used
userId
on Collector - BitmovinPlayer: if
playerKey
is not set onBitmovinAnalyticsConfig
we set the value from the player
- Heartbeat interval duration configuration on
BitmovinAnalyticsConfig
- [INTERNAL] upgrades gradle and gradle plugin to latest version
- expose used
userId
on Collector - BitmovinPlayer: if
playerKey
is not set onBitmovinAnalyticsConfig
we set the value from the player
- Heartbeat interval duration configuration on
BitmovinAnalyticsConfig
- [INTERNAL] upgrades gradle and gradle plugin to latest version
- displayed wrong screen size for devices with a logical display density != 1
- displayed wrong screen size for devices with a logical display density != 1
- updates ExoPlayer to
2.17.0
- Support for SimpleExoPlayer class
ExoPlayerCollector
- Wrong transitions from
startup
state topaused
state
- Wrong transitions from
startup
state topaused
state
- improved exception handing on error detail tracking feature
- improved exception handing on error detail tracking feature
- [Internal] Extracted
StateMachineListener
fromBitmovinAnalytics
- player and kotlin dependency to latest versions
- [Internal] Changed gradle player dependencies from
implementation
toapi
so they are included in the published pom file - player and kotlin dependency to latest versions
- custom data fields 26-30
- updates BitmovinPlayer to 3.2.0
- custom data fields 26-30
- Detection of FireOS devices
- Detection of FireOS devices
version
property on Collector classes
version
property on Collector classes
- customData 8-25 fields
- customData 8-25 fields
- BitmovinPlayerCollector didn't report some metrics with sub-second granularity
- ExoPlayerCollector used wrong field to track audioBitrate
- ExoPlayerCollector reported
qualitychange
events although the quality did not change
- Error detail tracking feature
castTech
field- [Internal] example-shared project
- Unintended public methods from Collector classes
- BitmovinPlayerCollector didn't report some metrics with sub-second granularity
- ExoPlayerCollector used wrong field to track audioBitrate
- ExoPlayerCollector reported
qualitychange
events although the quality did not change
- Error detail tracking feature
castTech
field- [Internal] example-shared project
- Unintended public methods from Collector classes
- Option to generate randomized
userId
value
- Option to generate randomized
userId
value
- Support for BitmovinPlayer v3
- Support for ExoPlayer version >= 2.12
- BitmovinPlayer v3 collector behaviour when using
setCustomData
andsetCustomDataOnce
and custom source configs
- Support attachment of already playing ExoPlayer to ExoPlayerCollector
- Support for BitmovinPlayer version >= 3
setCustomData
andsetCustomDataOnce
- [Internal] BitmovinPlayer v3 - handling of multiple sources in PlaylistConfig
- [Internal] Handling of playerStartupTime in cases where the adapter supports multiple sources
- Support attachment of already playing ExoPlayer to ExoPlayerCollector
- Added default implementation of AnalyticsListener.onPlayerStateChanged to avoid ExoPlayer crashes on certain devices
setCustomData
andsetCustomDataOnce
- Added default implementation of AnalyticsListener.onPlayerStateChanged to avoid ExoPlayer crashes on certain devices
-
Support for ExoPlayer version >= 2.12
-
[Internal] Separated BitmovinPlayer v2 and v3 collectors and example modules
- example apps (v1 and latest) package and id renaming
- example apps (v1 and latest) icons and colors change
-
[Internal] Separated exoplayer collector projects
-
[Internal] Added new sample app for testing older versions of exoplayer collector
-
[Internal]
FeatureManager
allows dynamically adding and disabling features based on player support. -
[Internal]
SegmentTrackingFeature
to always track the latestn
downloaded elements -
[Internal]
ErrorDetailsFeature
to track additional details in case an error occurs -
[Internal] Enabled code style checks on pre-push and publish
-
[Internal] Added new release process for future releases
- Added upper exclusive bound of 2.12.0 for ExoPlayer dependency
- Ability to attach the
ExoPlayerCollector
to a player that's already in a loading state. - [Internal] Added code formatting
- Functionality to retry sending of samples that couldn't be sent due to a HTTP timeout
- ability to override
mpdUrl
andm3u8Url
with the analytics configuration (AN-1919)
- [Internal] refactored
EventData
field population to use anEventDataManipulationPipeline
(AN-1919)
- If the video startup fails due to a timeout, we add a
ANALYTICS_VIDEOSTART_TIMEOUT_REACHED
error to the sample, so it can be easily filtered in the dashboard
- We now stop collecting events after the collector encounters a video startup failure
- Calculations for available screen width and height to now include screen density and be more independent of physical pixel
- Make collectors more resilient to exceptions in event listeners
- Restricted number of quality changes tracked per period of time (AN-1560)
- Timeout for rebuffering event (AN-1559)
- tracking of video startup times when having autoplay enabled to be consistent with web platform
CountDownTimer
potentially continues running after the player adapter is released (AN-1595)
- don't send quality change sample if the quality did not change
- Bitmovin, ExoPlayer: changed player error mapping to improve transparency (AN-1507)
- persist
drmType
in every sample
- bitmovin player crashed when
onAdError
was fired with empty ad tag url (AN-1572)
errorData
to samples for bitmovin player (AN-1456)
isTV
to sample to distinguish androidTVs from android mobiles- Playback start failure metrics to ExoPlayer
- support libraries changed to androidX libraries
- getting audio codec data on BitmovinPlayer
- download speed metric reset
- heartbeat to Rebuffering state (AN-1281)
- Data downloaded metrics to ExoPlayer
- ExoPlayer: seeking transitioned to rebuffering although no rebuffering state allowed
- root Project extension references in gradle files
drmLoadTime
anddrmTime
to Sample (ExoPlayer, BitmovinPlayer)
- Clean build.gradle files, fix bitmovinanalyticsexample build error and use project ext props for deps version sharing
- collector crash when
isLive
was not set in the analytics config (AN-1092)
BitmovinAnalytics.addDebugListener
adds the possibility to listen to debug events
- empty MPD URL when manifest location is null (AN-1068)
- exoplayer demo crash when calling
releasePlayer()
- Time difference calculation now uses
SystemClock.elapsedRealtime()
to be immune to changes of the phone's date
PlaybackFinished
event will set thevideoTimeEnd
tovideoDuration
, ascurrentTime
might not be accurate due to rounding errors
- exoplayer collector crashes when specific exoplayer modules have not been loaded (AN-966)
- added
customData6
andcustomData7
to the EventData and AdEventData
- player started state transition before the player was ready
- pause state activated heartbeat and sent out unnecessary payload
- Added Analytics AdAdapter for Bitmovin Player
- New boolean configuration field called
isLive
to indicate if the upcoming stream is a live stream. Will be overridden once playback metadata is available.
- tracking of metrics
percentageInViewport
andtimeInView
not possible in Android
- Error message contained too much data, so that grouping is not useful
- Stacktrace is now part of the errorData that is logged, to ease analysis
- Log unexpected
ExoPlaybackException
s and unchecked exceptions
- Sending out information about selected audio track language and subtitle language for the Bitmovin Player.
- Sending out Device Information about
Build.MANUFACTURER
andBuild.MODEL
as part of the Sample
BitmovinAnalyticsConfig
is parcelable now.- Android
Context
is now passed seperately where needed. - Old constructors requiring Context have been marked as
@Deprecated
BitmovinSdkAdapter
didn't transition to thepause
state on a pause eventdroppedFrames
was not collected
- Fixed a possible NullPointerException if the licensing backend responded with a malformed message that didn't contain a message
- Correct reporting of sources in
BitmovinSdkAdapter
(fieldsstreamFormat
,m3u8Url
,mpdUrl
,progUrl
)
- Can't get progressive source from
Exoplayer
videoTimeStart
andvideoTimeEnd
were not set when sending out heartbeats- Exoplayer Collector now reports
playerVersion
asexoplayer-<SDK-version>
- Bitmovin Collector now reports
playerVersion
asbitmovin-<SDK-version>
supportedVideoCodecs
in outgoing payload
- In the
collector-bitmovin-player
, theuserAgent
contained the player version the collector was compiled against instead of the runtime version
audioCodec
andvideoCodec
in outgoing payload
- Changed
title
property in payload tovideoTitle
- In some cases the collector reported the player version it was compiled against, not the version in use (both Exoplayer and Bitmovin Player)
- Logging around LicenseCall responses
- Sequence Number of outgoing Analytics samples
platform
= android field in outgoing payload