Releases: SRGSSR/pillarbox-android
4.0.0
New features
- ComScore page view tracking has been removed, as asked by the GD.
- Support time API. See Player#getUnixTimeMs(Long, Window) and Player#seekToUnixTimeMs(Long, Window).
- Support for sprite sheets. See SRGAssetLoaderConfig#spriteSheetLoader(SpriteSheetLoader).
- Support for playlist's preload configuration.
Breaking changes
- Remove Ktor dependency.
SRGAnalytics.sendPageView
no longer sendsComScorePageView
.SRGAssetLoader
no longer supports custom URL to load a media composition.MetricsCollector
no longer implementsPillarboxAnalyticsListener
andPlaybackSessionManager.Listener
.MonitoringConfigFactory
's constructor is no longer public.PillarboxBuilder.create()
is no longer public.PillarboxPreloadManager
constructor has changed:- The
rendererCapabilitiesListFactory: RendererCapabilitiesList.Factory
argument was removed. - The
allocator: DefaultAllocator
argument was removed. - The
renderersFactory: RenderersFactory
argument was added. - The
loadControl: LoadControl
argument was added.
- The
- Remove the following from
pillarbox-ui
:ToggleableBox()
.DelayedVisibilityState
.rememberDelayedVisibilityState(Boolean, Boolean, Duration)
.rememberDelayedVisibilityState(Player, Boolean, Boolean, Duration)
.Modifier.toggleable(Boolean, Role?, DelayedVisibilityState)
.Modifier.toggleable(Boolean, Role?, Indication?, MutableInteractionSource?, DelayedVisibilityState)
.Modifier.maintainVisibleOnFocus(DelayedVisibilityState)
.
What's Changed
- Update
pillarbox-player
module documentation by @MGaetan89 in #792 - Move config files to the
config
folder by @MGaetan89 in #795 - Bump the androidx group with 6 updates by @dependabot in #796
- Update to Gradle 8.11 by @MGaetan89 in #788
- Make some symbols
internal
/private
by @MGaetan89 in #800 - Sprite sheet by @StaehliJ in #777
- Upgrade to Coil 3.0.3 by @MGaetan89 in #801
- Bump robolectric from 4.14 to 4.14.1 by @dependabot in #806
- Bump com.autonomousapps.dependency-analysis from 2.4.2 to 2.5.0 by @dependabot in #807
- Move lint.xml to the root of the project by @StaehliJ in #809
- Update to AndroidX Media3 1.5.0 by @MGaetan89 in #794
- Bump coil from 3.0.3 to 3.0.4 by @dependabot in #813
- Downgrade Ktor to 2.3.13 by @MGaetan89 in #811
- Update GitHub Actions workflows by @MGaetan89 in #818
- Update documentation for the
pillarbox-player
module by @MGaetan89 in #817 - Bump kotlin from 2.0.21 to 2.1.0 by @dependabot in #816
- 802 player time api by @StaehliJ in #814
- Bump com.autonomousapps.dependency-analysis from 2.5.0 to 2.6.0 by @dependabot in #827
- Bump android-gradle-plugin from 8.7.2 to 8.7.3 by @dependabot in #826
- Improve accessibility in the demo app by @MGaetan89 in #820
- Improve accessibility in "Showcases" and on the player by @MGaetan89 in #821
- Remove Ktor dependency by @MGaetan89 in #829
- Bump com.autonomousapps.dependency-analysis from 2.6.0 to 2.6.1 by @dependabot in #838
- Bump kotlinx-kover from 0.8.3 to 0.9.0 by @dependabot in #836
- 822 remove toggleablebox by @StaehliJ in #828
- 824 enforce official supported integration hostname by @StaehliJ in #833
- Bump dokka from 2.0.0-Beta to 2.0.0 by @dependabot in #837
- Add emoji for debug and nigthly build by @StaehliJ in #839
- Bump the srgssr group with 3 updates by @dependabot in #835
- Bump the androidx group with 6 updates by @dependabot in #834
- Improve Gradle scripts by @MGaetan89 in #840
- Bump mockk from 1.13.13 to 1.13.14 by @dependabot in #843
- Update Tataki media URL by @MGaetan89 in #844
- 830 reduce flakiness of some tests by @MGaetan89 in #846
- Bump the androidx group with 12 updates by @dependabot in #841
- Bump Gradle from 8.11.1 to 8.12 by @MGaetan89 in #845
- Bump kotlinx-coroutines from 1.9.0 to 1.10.1 by @dependabot in #842
- Bump org.json:json from 20240303 to 20241224 by @dependabot in #851
- Fix bad substitution when printing by @StaehliJ in #852
- Bump kotlinx-kover from 0.9.0 to 0.9.1 by @dependabot in #854
- Bump org.json:json from 20241224 to 20250107 by @dependabot in #855
- Bump mockk from 1.13.14 to 1.13.16 by @dependabot in #857
- Bump com.autonomousapps.dependency-analysis from 2.6.1 to 2.7.0 by @dependabot in #858
- Fix failing test by @StaehliJ in #862
- Bump kotlinx-serialization from 1.7.3 to 1.8.0 by @dependabot in #850
- Bump android-gradle-plugin from 8.7.3 to 8.8.0 by @dependabot in #853
- Correctly forward MediaPeriod.Callback with PillarboxMediaPeriod. by @StaehliJ in #861
- Bump com.squareup.okio:okio from 3.9.1 to 3.10.2 by @dependabot in #856
- Bump the srgssr group with 3 updates by @dependabot in #865
- Bump the androidx group with 6 updates by @dependabot in #864
- Remove comscore pageview tracking by @StaehliJ in #863
Full Changelog: 3.0.0...4.0.0
3.0.1
3.0.0
New features
Playback monitoring
Pillarbox records various metrics related to playback performance (bitrate, stalls, playback duration, ...).
You can retrieve these values by using the following:
val player = PillarboxExoPlayer(context)
player.getCurrentMetrics() // Get the current PlaybackMetrics
player.currentMetricsAsFlow() // Get PlaybackMetrics as a Flow
player.getPeriodicallyCurrentMetricsAsState() // Get PlaybackMetrics as a Compose State
By default, these metrics are sent to a Pillarbox monitoring service when using PillarboxExoPlayer
from pillarbox-core-business
, or discarded when using PillarboxExoPlayer
from pillarbox-player
. You can customize this by doing:
val player = PillarboxExoPlayer(context) {
// Disable monitoring handling
disableMonitoring()
// Output metrics to Logcat
monitoring(Logcat)
// Send metrics to a remote server
monitoring(Remote) {
config(endpointUrl = "...")
}
}
Improved block reason support
The BlockReasonException
is now a sealed class, possibly containing more information about a specific error.
val error = player.playerError
when (error) {
is BlockReasonException.GeoBlock -> TODO("This chapter is geo-blocked")
is BlockReasonException.StartDate -> TODO("This chapter will be available on ${error.instant}")
is BlockReasonException.EndDate -> TODO("This chapter is no longer available since ${error.instant}")
// Handle other types...
}
Customize the surface type used by the player
When using PlayerSurface
from pillarbox-ui
, you can now specify the type of surface you want to use:
PlayerSurface(
player = player,
surfaceType = SurfaceType.Surface, // Or `Texture` or `Spherical`
)
See SurfaceType
for more information.
Other features
- Pillarbox API documentation is now available online.
- Chapters are available in the media item metadata. You can get them using
MediaItem.mediaMetadata.chapters
. - Credits are available in the media item metadata. You can get them using
MediaItem.mediaMetadata.credits
. MediaItem.tag
is no longer reserved for Pillarbox usage.- Introduce
PillarboxPreloadManager
helper for Media3PreloadManager
. Note that these APIs are incubating on Media3 side and will change in future versions.
Breaking changes
Introduce a DSL to create a player
The PillarboxExoPlayer
constructor and the DefaultPillarbox
have been removed.
Instead, you can use the PillarboxExoPlayer
builder function, which comes in two variants:
PillarboxExoPlayer
frompillarbox-player
: closely matches a defaultExoPlayer
, with Pillarbox monitoring disabled.PillarboxExoPlayer
frompillarbox-core-business
: suited for the SRG SSR needs, i.e. it can play URN and sends playback metrics to Pillarbox monitoring.
val player = PillarboxExoPlayer(context, Default) // from pillarbox-player
val srgPlayer = PillarboxExoPlayer(context) // from pillarbox-core-business
You can customize the player during creation:
val player = PillarboxExoPlayer(context) {
addAssetLoader(CustomAssetLoader())
seekBackwardIncrement(5.seconds)
seekForwardIncrement(10.seconds)
}
Removal of deprecated symbols
Symbol | Replacement | Comment |
---|---|---|
MediaItemUrn |
SRGMediaItemBuilder |
|
Player.disableTextTrack() |
Player.disableTextTrack() |
Use the extension from ch.srgssr.pillarbox.player.tracks instead |
Player.setDefaultTextTrack() |
Player.setAutoTextTrack() |
|
Player.disableAudioTrack() |
Player.disableAudioTrack() |
Use the extension from ch.srgssr.pillarbox.player.tracks instead |
Player.setDefaultAudioTrack() |
Player.setAutoAudioTrack() |
|
Tracks.text |
Tracks.textTracks |
|
Tracks.audio |
Tracks.audioTracks |
|
Tracks.video |
Tracks.videoTracks |
Others breaking changes
- Remove
DefaultHttpClient
. UsePillarboxHttpClient
instead.
What's Changed
- Check device capabilities to display picture in picture button by @StaehliJ in #663
- Bump gradle/actions from 3 to 4 in the actions group by @dependabot in #668
- Fix
PillarboxSlider
min/max values by @MGaetan89 in #671 - Bump android-gradle-plugin from 8.5.1 to 8.5.2 by @dependabot in #675
- Bump kotlin from 2.0.0 to 2.0.10 by @dependabot in #674
- Bump the androidx group with 4 updates by @dependabot in #673
- Update Gradle to 8.10 by @MGaetan89 in #679
- Bump the androidx group with 2 updates by @dependabot in #681
- Move Chapters and Credits into MediaMetadata by @StaehliJ in #687
- Bump madrapps/jacoco-report from 1.6.1 to 1.7.0 in the actions group by @dependabot in #689
- Bump kotlin from 2.0.10 to 2.0.20 by @dependabot in #686
- Bump kotlinx-serialization from 1.7.1 to 1.7.2 by @dependabot in #692
- Bump android-gradle-plugin from 8.5.2 to 8.6.0 by @dependabot in #691
- Bump the androidx group across 1 directory with 12 updates by @dependabot in #693
- Bump com.autonomousapps.dependency-analysis from 1.33.0 to 2.0.1 by @dependabot in #690
- Bump the androidx group across 1 directory with 8 updates by @dependabot in #700
- Update AndroidX Compose by @MGaetan89 in #698
- Bump detekt from 1.23.6 to 1.23.7 by @dependabot in #696
- Qos by @StaehliJ in #694
- Extract Detekt config in a dedicated plugin and simplify config by @MGaetan89 in #703
- Update to AndroidX Navigation 2.8.0 by @MGaetan89 in #701
- Bump com.autonomousapps.dependency-analysis from 2.0.1 to 2.0.2 by @dependabot in #707
- Bump kotlinx-coroutines from 1.8.1 to 1.9.0 by @dependabot in #706
- Fix
ComScoreTrackerIntegrationTest
flakiness by @MGaetan89 in #711 - Store pillarbox data into current tracks by @StaehliJ in #704
- Fix
MonitoringTest
by usingPillarboxExoPlayer
directly by @MGaetan89 in #714 - Remove
ModalNavigationDrawer
positioning hack inPlaybackSettingsDrawer
by @MGaetan89 in #712 - 708 revisit timerange trackers by @StaehliJ in #713
- Bump madrapps/jacoco-report from 1.7.0 to 1.7.1 in the actions group by @dependabot in #721
- 716 update monitoring data format by @StaehliJ in #724
- Add missing Detekt rules by @MGaetan89 in #725
- Bump the androidx group with 5 updates by @dependabot in #7...
2.3.0
What's Changed
- PLAY-6636 CommandersAct media event send media_audiodescription_on by @StaehliJ in #629
- Use local MediaComposition for Live urns by @StaehliJ in #633
- Bump robolectric from 4.12.2 to 4.13 by @dependabot in #630
- Bump Gradle from 8.8 to 8.9 by @MGaetan89 in #636
- Bump mockk from 1.13.11 to 1.13.12 by @dependabot in #641
- Bump android-gradle-plugin from 8.5.0 to 8.5.1 by @dependabot in #642
- Bump the androidx group with 3 updates by @dependabot in #640
- Bump kotlinx-kover from 0.8.2 to 0.8.3 by @dependabot in #647
- Bump coil from 2.6.0 to 2.7.0 by @dependabot in #648
- Update to AndroidX Media3 1.4.0 by @MGaetan89 in #618
- Move
TVSlider
topillarbox-demo-shared
by @MGaetan89 in #650 - Remove leanback by @MGaetan89 in #651
- Bump com.autonomousapps.dependency-analysis from 1.32.0 to 1.33.0 by @dependabot in #661
- Bump the androidx group with 10 updates by @dependabot in #660
- Enable edge-to-edge in the demo application by @MGaetan89 in #658
- Add argument to set
Player.getMaxSeekToPreviousPosition
when creating aPillarboxExoPlayer
by @MGaetan89 in #659
Full Changelog: 2.2.1...2.3.0
2.2.1
This release updates AndroidX Lifecycle to 2.8.3, to fix an issue with code shrinking.
What's Changed
- Bump kotlinx-kover from 0.8.1 to 0.8.2 by @dependabot in #622
- Cherry-pick test changes from #615 by @MGaetan89 in #620
- Update AndroidX Lifecycle to 2.8.3 by @MGaetan89 in #617
- Bump kotlinx-serialization from 1.7.0 to 1.7.1 by @dependabot in #623
- Improve version regex and add tests by @MGaetan89 in #616
Full Changelog: 2.2.0...2.2.1
2.2.0
Fixes
- Fix wrong
media_position
send to CommandersAct when removing the current MediaItem from the player. ( PLAYRTS-5583) - Fix ANR when displaying notification with low to no internet.
- Fix current chapter and credit not clear when seek back.
What's Changed
- Don't let Dependabot update ComScore and CommandersAct by @MGaetan89 in #585
- Fix current time range reset by @StaehliJ in #581
- Bump kotlinx-serialization from 1.6.3 to 1.7.0 by @dependabot in #586
- Bump android-gradle-plugin from 8.4.1 to 8.4.2 by @dependabot in #576
- Avoid send null current chapter when not needed by @StaehliJ in #587
- 580 implements custom listeners like media3 by @StaehliJ in #589
- Replace the fondue video in demo by @MGaetan89 in #591
- Bump the androidx group with 7 updates by @dependabot in #594
- Bump android-gradle-plugin from 8.4.2 to 8.5.0 by @dependabot in #595
- Fix: use
runUntilPendingCommandsAreFullyHandled
inCommandersActTrackerIntegrationTest
by @MGaetan89 in #603 - Run Bitmap decoding not on main thread by @StaehliJ in #601
- Bump ktor from 2.3.11 to 2.3.12 by @dependabot in #602
- 605 bad commandersact stop position after removing item by @StaehliJ in #606
Full Changelog: 2.1.2...2.2.0
2.1.2 - Fix CommandersAct crash
Important
This release reverts back CommandersAct version dependency
- CommandersAct core to 5.4.3
- CommandersAct service side to 5.5.2
That introduce application crashes.
What's Changed
- Use DefaultPillarbox setup from the DI by @StaehliJ in #573
- Bump kotlinx-kover from 0.8.0 to 0.8.1 by @dependabot in #577
- Update
.gitignore
by @MGaetan89 in #579 - Bump kotlinx-serialization from 1.6.3 to 1.7.0 by @dependabot in #578
- Revert "Bump kotlinx-serialization from 1.6.3 to 1.7.0 (#578)" by @StaehliJ in #584
- Rollback commandersAct version to a stable version by @StaehliJ in #583
Full Changelog: 2.1.1...2.1.2
2.1.1
What's Changed
- Fix typos in documentation. by @Loic-Dumas in #569
- Audio main chapter always returns empty list of Player chapter by @StaehliJ in #570
- Remove lifecyle 2.8.1 by @StaehliJ in #572
Full Changelog: 2.1.0...2.1.1
2.1.0
SRGAnalytics
- Fix "ghost start" issue. Comscore will start only when the first
Activity
is created.
Player
- Fix DRM issue with new LSVS DRM streams.
- Pillarbox 2.1.0 introduce new kinds of Asset meta data that are linked to a
MediaItem
.
- Chapters : a time range that contains metadata of a Chapter, player will call
PillarboxPlayer.Listener.onChapterChanged
when player enter or exit a chapter. - Blocked time range : a time range where the player can't reach anytime, player will call
PillarboxPlayer.Listener.onBlockedTimeRangeReached
when the player jump to the end of the blocked range. - Credits (Opening and Closing) : a time range that contains credis metadata, player will call
PillarboxPlayer.Listener.onCreditChanged
when player enter or exit a chapter.
New apis
val player : PillarboxPlayer
player.getCurrentChapters()
player.getChapterAtPosition()
player.getChapterAtPosition(positionMs)
player.getCurrentChapterAsFlow()
player.getCurrentChapterAsState()
player.getCurrentCredits()
player.getCreditAtPosition()
player.getCreditAtPosition(positionMs)
player.getCurrentCreditAsFlow()
player.getCurrentCreditAsState()
Core business
SRGAssetLoader
read and fill the chapter, credits and blocked time range from theMediaComposition
.
Known bugs
- Live DRM can't be played
- Audio stream with multiple chapters can't be played
What's Changed
- Update guide to setup the GitHub repository by @MGaetan89 in #534
- Bump the androidx group with 4 updates by @dependabot in #522
- Bump android-gradle-plugin from 8.3.2 to 8.4.0 by @dependabot in #523
- Custom blocked segments by @StaehliJ in #539
- Replace usages of
MediaItemUrn
withSRGMediaItemBuilder
by @MGaetan89 in #537 - Add journalistic blocking reason by @MGaetan89 in #538
- Bump ktor from 2.3.10 to 2.3.11 by @dependabot in #542
- Bump kotlinx-coroutines from 1.8.0 to 1.8.1 by @dependabot in #541
- Bump mockk from 1.13.10 to 1.13.11 by @dependabot in #548
- Bump robolectric from 4.12.1 to 4.12.2 by @dependabot in #545
- Bump android-gradle-plugin from 8.4.0 to 8.4.1 by @dependabot in #547
- Bump kotlinx-kover from 0.7.6 to 0.8.0 by @dependabot in #546
- Bump the androidx group with 10 updates by @dependabot in #544
- Add a seek bar to the TV demo player by @MGaetan89 in #543
- Bump kotlin from 1.9.23 to 2.0.0 by @dependabot in #549
- 517 helper for media route button display by @StaehliJ in #525
- Bump com.autonomousapps.dependency-analysis from 1.31.0 to 1.32.0 by @dependabot in #554
- Simplify JVM toolchain setup by @MGaetan89 in #556
- Bump the androidx group with 5 updates by @dependabot in #560
- Bump com.tagcommander.lib:ServerSide from 5.5.3 to 5.5.4 by @dependabot in #562
- Revert toolchain changes from #556 by @MGaetan89 in #563
- Enable multi session for drm by @StaehliJ in #566
- 559 ghost start issue by @StaehliJ in #564
Full Changelog: 2.0.0...2.1.0
2.0.0
Player
- Improved system integration and background playback through custom
MediaController
andMediaSession
classes. Check the documentation for more information. - Added a new
Player.isAtLiveEdge(Long, Window)
method to know if the media is at live edge. - New way to load a media from a custom source by providing a custom
AssetLoader
implementation:
val player = PillarboxExoPlayer(
context = context,
mediaSourceFactory = PillarboxMediaSourceFactory(context).apply {
addAssetLoader(SRGAssetLoader(context)) // Provided by pillarbox-core-business to handled URNs
addAssetLoader(MyCustomAssetLoader())
},
)
- Added new methods to easily manage tracks:
val player: Player = ...
val currentTracks: Tracks = player.currentTracks
val tracks: List<Track> = currentTracks.tracks // Get all the supported tracks
val audioTracks: List<AudioTrack> = currentTracks.audioTracks // Get all the supported audio tracks
val textTracks: List<TextTrack> = currentTracks.textTracks // Get all the supported text tracks
val videoTracks: List<VideoTrack> = currentTracks.videoTracks // Get all the supported video tracks
player.selectTrack(Track) // Select a single track
player.enable<Audio|Text|Video>Track() // Enable a specific type of track
player.disable<Audio|Text|Video>Track() // Disable a specific type of track
player.setAuto<Audio|Text|Video>Track() // Restore the default track of a specific type
- Added support for blocked segments.
- Added support for chapters. You can use the following methods to access the corresponding information:
Player.getCurrentChapters(): List<Chapter> // Get all the chapters for the current media
Player.getChapterAtPosition(Long): Chapter? // Get the chapter at the provided position
Player.getCurrentChapterAsFlow(): Flow<Chapter?> // Observe the chapter currently playing as Flow
Player.getCurrentChapterAsState(): State<Chapter?> // Observe the chapter currently playing as State
- Added support for time intervals (intro/credits). You can use the following methods to access the corresponding information:
Player.getCurrentCredits(): List<Credit> // Get all the credits for the current media (opening credits, closing credits)
Player.getCreditAtPosition(Long): Credit? // Get the credit at the provided position
Player.getCurrentCreditAsFlow(): Flow<Credit?> // Observe the credit currently active as Flow
Player.getCurrentCreditAsState(): State<Credit?> // Observe the credit currently active as State
Core business
- Extract information about blocked segments, chapters and credits.
Demo
- The multi-player showcase has been improved to only have one player playing audio at a given time.
- Added a showcase to toggle repeat mode and to pause the media item when it ends.
- Added a showcase to display chapters.
- Added a showcase with a blocked segment.
Breaking changes
- The
mediaItemSource
anddataSourceFactory
arguments of theDefaultPillarbox
constructor have been removed. Please provide aMediaCompositionService
directly. TheMediaCompositionMediaItemSource
class and its related classes have been removed. PillarboxExoPlayer
is now a concrete class, whilePillarboxPlayer
has become an interface. Simply replace your usages ofPillarboxPlayer
byPillarboxExoPlayer
, andPillarboxExoPlayer
byPillarboxPlayer
:
// Pillarbox 1.0.0
val player: PillarboxExoPlayer = PillarboxPlayer(...)
// Pillarbox 2.0.0
val player: PillarboxPlayer = PillarboxExoPlayer(...)
Note
Following a change in AndroidX Media3 1.3.0, you should setup Java 8 APIs desugaring, by following this guide.
This is new requirement should be reverted in an upcoming version of AndroidX Media3 (see androidx/media#1312 (comment) for more information).
This should be done even if your min SDK version is 24+.
What's Changed
- Update README.md by @StaehliJ in #471
- Use movable content to swap players by @StaehliJ in #472
- Refactor Gradle build logic by @MGaetan89 in #474
- Refactor media loading by @StaehliJ in #475
- Update dependencies by @MGaetan89 in #481
- Update Robolectric to 4.12.1 by @MGaetan89 in #482
- Improve the multi player showcase by @MGaetan89 in #478
- Extract analytics from
CurrentMediaItemTracker
by @MGaetan89 in #483 - Don't filter out unsupported/forced tracks by @MGaetan89 in #487
- Improve media controller service by @StaehliJ in #485
- Add live indicator by @StaehliJ in #489
- Update the "Add to playlist" dialog by @MGaetan89 in #490
- Rework the main
Readme
by @MGaetan89 in #491 - Update dependencies by @MGaetan89 in #494
- Update 12h45 stream in the demo app by @waliid in #498
- Setup Dependabot by @MGaetan89 in #496
- Bump the actions group with 2 updates by @dependabot in #502
- Bump the androidx group with 6 updates by @dependabot in #504
- Improve live edge detection and provide Player extension by @StaehliJ in #505
- 451 handle chapters and blocked segments by @StaehliJ in #501
- Provide simplified tracks management by @MGaetan89 in #495
- Enable desugaring of java 8+ feature for android < 24 by @StaehliJ in #509
- Mitigate missing aspect ratio issue by @MGaetan89 in #507
- Add a showcase to customise playback settings by @MGaetan89 in #510
- 499 add chapters demo by @StaehliJ in #513
- 506 remove audio chapters by @StaehliJ in #514
- Add support for "Skip intro"/"Skip credits" by @MGaetan89 in #516
- Improve controls usability in the TV demo by @MGaetan89 in #520
- 519 simplify TimeRange management by @StaehliJ in #521
- Separate TimeRanges are it is a sealed interface and we don't really … by @StaehliJ in #524
- Make the Dependency Analysis plugin only fails for unused dependencies by @MGaetan89 in #526
- Fix urn name in the demo by @StaehliJ in #527
- Integrate Dokka by @MGaetan89 in #529
New Contributors
- @waliid made their first contribution in #498
- @dependabot made their first contribution in #502
Full Changelog: 1.0.0...2.0.0