Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v4→v5v5→v6v5→v69.2.1→9.3.18.0.0→8.2.11.0.0-alpha08→1.0.0-alpha091.5.5→1.5.61.9.4→1.10.21.9.4→1.10.21.51.0→1.58.01.51.0→1.58.01.51.0→1.58.01.51.0→1.58.04.16→4.16.11.56.0→1.58.01.56.0→1.58.01.56.0→1.58.01.56.0→1.58.01.1.7→1.2.01.5.5→1.5.61.9.4→1.10.21.9.4→1.10.21.12.2→1.12.31.5.5→1.5.61.5.5→1.5.62026.01.00→2026.01.012.9.4→2.10.01.5.5→1.5.62.9.4→2.10.02.9.4→2.10.01.8.0→1.9.11.8.0→1.9.11.8.0→1.9.12025.11.00→2026.01.011.11.0→1.12.31.12.0-rc01→1.12.38.13.1→9.0.08.13.1→9.0.0Release Notes
actions/cache (actions/cache)
v5Compare Source
actions/checkout (actions/checkout)
v6Compare Source
actions/upload-artifact (actions/upload-artifact)
v6Compare Source
gradle/gradle (gradle)
v9.3.1: 9.3.1Compare Source
This is a patch release for 9.3.0. We recommend using 9.3.1 instead of 9.3.0.
The following issues were resolved:
Read the Release Notes
Upgrade instructions
Switch your build to use Gradle 9.3.1 by updating your wrapper:
See the Gradle 9.x upgrade guide to learn about deprecations, breaking changes and other considerations when upgrading.
For Java, Groovy, Kotlin and Android compatibility, see the full compatibility notes.
Reporting problems
If you find a problem with this release, please file a bug on GitHub Issues adhering to our issue guidelines.
If you're not sure you're encountering a bug, please use the forum.
We hope you will build happiness with Gradle, and we look forward to your feedback via Twitter or on GitHub.
v9.3.0Compare Source
takahirom/roborazzi (io.github.takahirom.roborazzi)
v1.58.0Compare Source
Bugfix: Fixed NoClassDefFoundError in RoborazziPlugin when the Android Plugin is not applied
Previously, we never touched the Android Plugin class when it wasn’t in use; nevertheless, a NoClassDefFoundError was raised because the plugin contained a method that referenced the Android Plugin class. I therefore extracted Android-related code into a separate class to resolve the issue. Thank you, @rnett, for reporting this.
Update: Device qualifiers
You can now specify device qualifiers via RobolectricDeviceQualifiers. The list has been expanded with new devices such as Pixel9, XRGlasses, and even AIGlasses!
Thank you, @joergmis, for your contribution.
What's Changed
New Contributors
Full Changelog: takahirom/roborazzi@1.57.0...1.58.0
v1.57.0Compare Source
Fix AGP 9.0 KMP preview screenshots
We had been using
unitTestSources?.**java**?.addGeneratedSourceDirectory, but this approach proved ineffective when we adoptedcom.android.kotlin.multiplatform.library. Consequently, we migrated tounitTestSources?.**kotlin**?.addGeneratedSourceDirectoryfor the KMP plugin. Unfortunately, when applyingcom.android.library,unitTestSources?.kotlinremains non-functional, so we must toggle between the two depending on the plugin.Thank you for reporting this @HLCaptain !
(This is our plugin code, you don't have to write this.)
Bugfix: Compose Preview’s
onSizeChanged{}wasn’t called when multiple windows exist.There is a bug in which Compose Preview’s
onSizeChanged{}fails to fire when multiple windows are present. This issue arises because we neglected to invokecomposeTestRule.mainClock.advanceTimeByFrame() composeTestRule.waitForIdle()Reproducing screenshots
What's Changed
Full Changelog: takahirom/roborazzi@1.56.0...1.57.0
v1.56.0Compare Source
Added AGP 9.0 compatibility to RoborazziPlugin
Roborazzi was previously using APIs and classes that have since been deprecated, such as
Variant.unitTestand TestedExtension. We have now migrated to alternative, supported classes and methods. Thanks for reporting this, @allanconda-mercari !Behavior changes: Stabilized preview LaunchedEffect execution for Compose Preview support
Previously, screenshots occasionally differed from Android Studio Composable Preview when using LaunchedEffect. We now invoke
composeTestRule.mainClock.advanceTimeByFrame()by default, so some screenshots may appear different. You can restore the previous behavior by implementing a custom tester as follows:What's Changed
Full Changelog: takahirom/roborazzi@1.55.0...1.56.0
v1.55.0Compare Source
Bugfix: Fix WebP ClassCastException
What happened
SdkSandboxClassLoader.ImageIO.getImageWritersByMIMEType, which internally caches writers in a static field. When the writer is first created, the code is executed by SdkSandboxClassLoader1.What we did
We leveraged reflection to force
ImageIO.getImageWritersByMIMETypeto use the System ClassLoader, thereby guaranteeing that the same class definition is shared irrespective of the current SdkSandboxClassLoader.Many thanks to @eygraber for reporting this bug!
What's Changed
Full Changelog: takahirom/roborazzi@1.54.0...1.55.0
v1.54.0Compare Source
Breaking change: Report HTML and JSON paths have changed
The HTML report used to be at
build/reports/roborazzi/index.htmlbut is now located atbuild/reports/roborazzi/<build_variant>/index.html. This is a first step toward fixing a long-standing issue where runningrecordRoborazzi(instead ofrecordRoborazziDebug) could break test results; further work is still needed to make it fully reliable.You should be able to fix it by adding
/debug/(or your build variant) to the path in your CI script. I believe the change is straightforward, but if you run into any cases where it's difficult please let me know.Note: This change does not affect the paths of the generated screenshot images, so most users will not be impacted.
Thank you for your contribution, @vladcudoidem!
Behavioral change: Fixed screenshot timing for Compose Preview Support
Previously, we used Espresso.onIdle() and ShadowLooper.idle(), but these APIs are not suitable for Compose. Consequently, screenshots could not be captured after onSizeChanged completed.
If you encounter issues with infinite animations—such as
CircularProgressIndicator—you can configure frame-based captures using@RoboComposePreviewOptions.Thank you for reporting this issue, @savvasenok!
What's Changed
Full Changelog: takahirom/roborazzi@1.53.0...1.54.0
v1.53.0Compare Source
New feature
generatedTestClassCountand behavior changes to Compose Preview supportWe've added the
generatedTestClassCountoption, which enables us to run Preview tests in parallel when you set maxParallelForks to a value greater than 1.As the name
generatedTestClassCountsuggests, this option generates as many test classes as specified. It creates tests whosepreviewIndex % totalTestClassCount == testClassIndex. However, this option does not modify maxParallelForks, so you must also set maxParallelForks yourself to run tests in parallel. This is our policy: we never alter other plugin(AGP) settings in order to keep one single source of configuration.Behavior changes: generatedTestClassCount now defaults to the same value as maxParallelForks. Therefore, if you already use maxParallelForks during testing, the behavior may change if your tests are non-deterministic—for example, if they depend on the order in which other tests run.
Last but not least, thanks to @sergio-sastre for suggesting this feature, reviewing the code, and confirming the approach works!
Fix configuration-time resolution when using BOM to Compose Preview support
Fixed an error where the version verification logic triggered configuration-time resolution errors when using BOM (Bill of Materials) for dependency management.
The fix simplifies the
verifyComposablePreviewScannerVersionmethod by removing the complex fallback logic that attempted to infer versions from test configurations. Instead, the plugin now only checks explicitly declared versions—when no version is specified (indicating BOM management), verification is skipped.Thanks to @igokoro for reporting this issue!
Fix iOS snapshot not creating parent directories before writing files
Fixed a critical bug where iOS snapshot tests weren't being recorded on the first run. The root cause was that
NSData.writeToFilesilently fails when parent directories don't exist.The fix ensures parent directories are automatically created before writing files using
NSFileManager.defaultManager.createDirectoryAtPathwithwithIntermediateDirectories = true. Additionally, error logging was added to report both successful and failed file operations, preventing silent failures.Thanks to @jl-jonas for reporting this issue!
What's Changed
34e1148by @renovate[bot] in #764Full Changelog: takahirom/roborazzi@1.52.0...1.53.0
v1.52.0Compare Source
Support for
com.android.kotlin.multiplatform.librarypluginEven though we can use
androidUnitTestin Kotlin Multiplatform Plugin, there is a way to add Android target to KMP and this might become mainstream. Roborazzi did not add the task for this plugin so we added tasks likerecordRoborazziAndroidHostTest. Thank you for reporting this issue @xVemu !Support for KMP testRuns API
When we add testRuns in build.gradle, that enables us to control dependencies for tests in KMP, Roborazzi used to fail with
Cannot add task 'clearRoborazziJvm' as a task with that name already exists.. Thank you for reporting this issue as well @xVemu !Fix preview tests plugin when using Bom dependencies
There are patterns that we cannot build with Roborazzi due to configuration cache issues. We addressed this issue using a new API for configuration cache. Thank you for reporting this @igokoro !
What's Changed
Full Changelog: takahirom/roborazzi@1.51.0...1.52.0
androidx/media (androidx.media3:media3-exoplayer-workmanager)
v1.9.1Compare Source
This release includes the following changes since
1.9.0 release:
(#2929).
doSomeWorkinterval only after audiostarts to support smoother A/V sync at beginning of playback.
DefaultLoadErrorHandlingPolicywhereFileNotFoundExceptionand similar exception types were retriedmultiple times.
doSomeWorkwas mistakenly reduced by the elapsed time of the currentiteration of
doSomeWork. Addressing this hopefully extends CPU idletime and saves power.
attempting to use a fallback AVC or HEVC codec.
currently playing item from a playlist
(#2873).
MediaIteminstances when repeatedly usingExoPlayer.replaceMediaItemon the same item(#2993).
(#2979).
(#2840).
AC4Profile22and other legacy profileswhen assessing AC-4 decoder support in Automotive scenarios
(#2609).
changes to avoid stuttering playback
(#2941).
either contain only a single control sequence, or have critical info
split across multiple control sequences
(#2935).
MIME type provided in the IMA LOADED event. The fix now maps the ad MIME
type using the ad pod index and ad position.
getAdsManager()andAdEvent.getAd().MediaControllerconnected to a platformsession crashed the app if stop happened during ad playback
(#2948).
extrasBundleinstances in variousclasses to guard against malformed
Bundleinstances sent from otherprocesses.
COMMAND_SEEK_NEXTorCOMMAND_SEEK_BACKcan cause gaps in the system media notification(#2976).
(#2829).
when converting from legacy
MediaMetadataCompatandMediaDescriptionCompat(#3018).
PriorityTooLowExceptionis handledby
SegmentDownloader(for DASH, HLS and SmoothStreaming). Customoverrides of
SegmentDownloaderusing the protectedexecutemethodneed to provide their task wrapped in a
Supplierso it can berecreated (#2931).
Listener.onAssetListLoadCompletedcallback. This is a breaking changein an unstable API that requires apps that implement this callback to
add an additional argument of type
JSONObject(#2950).
(#2930).
NullPointerExceptionthat can occur when seeking priorto processing the first video frame
(#2965).
RemoteCastPlayertimeline from updatingcorrectly when replacing the playlist.
v1.9.0Compare Source
minSdkto23in line with other AndroidX libraries.PlayerTransferState, which facilitates transferring the playbackstate across
Playerinstances.void mute()andvoid unmute()methods to Player that preserveand consequently restore Player's volume before and after setting it to
zero.
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManagerandStuckPlayerDetectorpreviously used byExoPlayerinternally to allowreuse for other players
(#1893).
ForwardingPlayerlistener handling when the underlying delegateplayer uses reference equality for comparing listener instances
(#2675).
Player.listenTosuspending extension function in themedia3-common-ktxlibrary that specifies the particularPlayer.Eventsthat should be acted upon.BasePlayer.getBufferedPercentageresulting from integeroverflow when the reported buffered position is implausibly much larger
than the reported duration
(#2750).
TrackGrouptrack type by not ignoring customsample MIME type and falling back to using the potentially wrong track
type from the container MIME type
(#2860).
StuckPlayerExceptionplayer error if the player seems stuck. This happens in the following
cases, where each default timeout can be configured in
ExoPlayer.Builderif required:STATE_BUFFERINGwhile trying to play and nobuffering progress.
STATE_READYwhile trying to play and noplayback progress.
STATE_READYbeyond the declared duration withoutreaching the end of the item.
play.
background playback. This is equivalent to setting
ExoPlayer.Builder.setWakeModetoC.WAKE_MODE_LOCAL.change is reported to the
Contextoriginally passed toExoPlayer.Builder.ExoPlayer.setVirtualDeviceIdto manually update the virtual deviceID obtained from the
Contextpassed toExoPlayer.Builder.than 10 seconds before the end of the current item.
setSeekBackIncrementMs,setSeekForwardIncrementMsandsetMaxSeekToPreviousPositionMstoExoPlayerto update these settingsafter construction
(#2736).
DefaultPreloadManager. Apps now canreturn
DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)orDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)via
TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)to indicate that a media item needs to be pre-cached.
DefaultPreloadManagerin shortformdemo app.
DefaultLoadControl.Buildersetters for local playback and adjustdefault values of
DefaultLoadControlto work well with a wide range oflocal files.
STATE_READYorSTATE_BUFFERING.addMediaItems(List<MediaItem>, List<T>)andaddMediaSources(List<MediaSource>, List<T>)that add the mediaitems or media sources in batch, and automatically call
invalidate()afterwards.removeMediaItems((List<MediaItem>)andremoveMediaSources(List<MediaSource>)that remove the media itemsor media sources in batch, and make sure that preload manager does
not start to preload or continue preloading any of them after
removal.
DefaultPreloadManager.setCurrentPlayingIndex(int)toinvalidate itself automatically. Apps don't need to call
invalidate()explicitly anymore after updating the current playingindex.
group of pictures while in scrubbing mode.
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)for apps to set a value of target buffer bytes for a player with the
specified
playerName. TheDefaultLoadControlcan now make decisionsof each player separately based on its own allocated bytes and target
buffer bytes.
SkipInfoto theAdPlaybackState.AdGroupto carry skipinformation for each ad in the ad group.
removeMediaItems(List)during playing apost-roll created a crash
(#2746).
always set as the last sample and rendered.
(#2382,
#2678).
DefaultPreloadManagerto avoid total buffer bytes for preloading fromgrowing arbitrarily. To use the default control logic, Apps can set the
target buffer bytes for preloading via
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)fora
playerNameofPlayerId.Preload.name("preload"), and inject thecreated
DefaultLoadControlviaDefaultPreloadManager.Builder.setLoadControl(LoadControl).cloneAndSet(int, int)toShuffleOrderwith a defaultimplementation (#2834).
adjustment or auto transition
(#2484).
This feature is implemented for
MediaCodecbased renderers andrequires API 29+.
ExoPlayer.setAudioCodecParameters()andExoPlayer.setVideoCodecParameters()to apply parameters.ExoPlayer.addAudioCodecParametersChangeListener()andExoPlayer.addVideoCodecParametersChangeListener()to listen forchanges. Observing vendor-specific keys requires API 31+.
IllegalStateExceptioncaused by setting an empty media sourceafter seeking to a non-zero position and then preparing the player with
a non-empty media source.
could cause
IllegalStateException.NullPointerExceptioninDefaultPlaybackSessionManager(#2885).
timeout issues with this platform API have been fixed
(#1641).
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUsto 15ms and enable more efficient dropping of video frames before
decoding for eligible videos.
DefaultLoadControl. This should only take effect if an excessivenumber of tracks get selected
(#2860).
mode near the end could cause a seek to the next media item.
CompositionPlayerunder a new@ExperimentalApiannotation toindicate it is available for experimentation, but is still under
development. Some APIs are likely to change significantly in future
releases, and there are known issues and limitations with some use-cases
(some undocumented).
COMMAND_SET_AUDIO_ATTRIBUTESand audio focus handlingin
CompositionPlayer.CompositionPlayer.EditedMediaItem.removeVideo.InAppMp4Muxeras default muxer.EditedMediaItem.Builder#setSpeed()and deprecateEffects#createExperimentalSpeedChangingEffects().forceAudioTrackandforceVideoTrackwithtrackTypesinEditedMediaItemSequence.TrackSelectionParameters.selectTextByDefaultto prefer theselection of any text track without specifying other more specific
preferences.
preferredVideoLabels,preferredAudioLabelsandpreferredTextLabelsinTrackSelectionParametersto specify apreference for tracks with a specific label, for example those read from
HLS NAME tags (#1666).
headers in the encoded FLAC data, resulting in decoding errors
(#558).
files (#811,
#5718).
for a sync byte
(#2713).
FLAG_ENABLE_INDEX_SEEKINGto prefer seeking informationfrom metadata headers (like Xing and VBRI) when available, falling back
to index-based seeking if no other seeking information is present. This
improves performance for files with seeking metadata
(#2839).
Mp3Extractorto default to a constant bitrate (CBR)assumption when no seeking metadata (e.g., Xing, VBRI) is found, even
when
FLAG_ENABLE_INDEX_SEEKINGis set. This is based on the MP3specification's history, where CBR was standard and VBR requires
explicit headers. This improves immediate seekability for files without
metadata at the cost of potential accuracy for VBR files lacking
headers. Index seeking is now used as a fallback if the CBR assumption
is not seekable (e.g., for streams of unknown length)
(#2848).
audio/mpeg(MP3),audio/mpeg-L1andaudio/mpeg-L2MIME types by peeking the layer value of the firstsample before emitting a track format from the extractor
(#2683).
stblbox larger than 1MB implies the file must be non-fragmented(#2650).
©mvn(movement name) and©mvi(movement index)metadata, these are now emitted as
TextInformationFrameobjects inFormat.metadatawith IDs ofMVNMandMVINrespectively(#2754).
stsdbox (instead of failing to parsethe whole file).
(#6225).
MatroskaExtractorwhere seeking could be inaccuratefor files with multiple tracks. Cue points are now correctly associated
with their respective tracks, leading to more precise seeking.
IllegalArgumentExceptionfromReorderingBufferQueuecaused by PES packets with no timestamp
(#2764).
HeifExtractorcannow parse HEIC files containing embedded video and audio tracks.
:media3-inspectormodule to serve as the dedicatedhome for media inspection utilities. This module now houses a new
androidx.media3.inspector.MetadataRetriever, which will provide aunified API for both metadata and frame extraction. The existing
androidx.media3.exoplayer.MetadataRetrieveris now deprecated in favorof this new version.
androidx.media3.inspector.FrameExtractor, a new public APIfor frame extraction. This
AutoCloseableclass provides a way toextract frames with support for HDR video, video effects, and custom
decoder selection. It should be created via its
Builderfor a specificMediaItem.getThumbnail()to extract a representativethumbnail frame from a media file without requiring a specific
timestamp.
androidx.media3.inspector.MediaExtractorCompat, a drop-inreplacement for the platform's `android.m
Configuration
📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.