Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Nov 20, 2025

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Type Update Change Age Confidence
actions/cache action major v4v5 age confidence
actions/checkout action major v5v6 age confidence
actions/upload-artifact action major v5v6 age confidence
gradle (source) minor 9.2.19.3.1 age confidence
com.diffplug.spotless plugin minor 8.0.08.2.1 age confidence
com.google.android.wearable.watchface.validator:validator-push dependencies patch 1.0.0-alpha081.0.0-alpha09 age confidence
androidx.wear.compose:compose-material3 (source) dependencies patch 1.5.51.5.6 age confidence
androidx.compose.ui:ui-test-junit4 (source) dependencies minor 1.9.41.10.2 age confidence
androidx.compose.ui:ui-test-manifest (source) dependencies minor 1.9.41.10.2 age confidence
io.github.takahirom.roborazzi plugin minor 1.51.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi-junit-rule dependencies minor 1.51.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose dependencies minor 1.51.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi dependencies minor 1.51.01.58.0 age confidence
org.robolectric:robolectric (source) dependencies patch 4.164.16.1 age confidence
io.github.takahirom.roborazzi plugin minor 1.56.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi-junit-rule dependencies minor 1.56.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi-compose dependencies minor 1.56.01.58.0 age confidence
io.github.takahirom.roborazzi:roborazzi dependencies minor 1.56.01.58.0 age confidence
androidx.datastore:datastore-preferences (source) dependencies minor 1.1.71.2.0 age confidence
androidx.wear.compose:compose-ui-tooling (source) dependencies patch 1.5.51.5.6 age confidence
androidx.compose.ui:ui-tooling-preview (source) dependencies minor 1.9.41.10.2 age confidence
androidx.compose.ui:ui-tooling (source) dependencies minor 1.9.41.10.2 age confidence
androidx.activity:activity-compose (source) dependencies patch 1.12.21.12.3 age confidence
androidx.wear.compose:compose-navigation (source) dependencies patch 1.5.51.5.6 age confidence
androidx.wear.compose:compose-foundation (source) dependencies patch 1.5.51.5.6 age confidence
androidx.compose:compose-bom dependencies patch 2026.01.002026.01.01 age confidence
androidx.lifecycle:lifecycle-viewmodel-ktx (source) dependencies minor 2.9.42.10.0 age confidence
androidx.wear.compose:compose-material (source) dependencies patch 1.5.51.5.6 age confidence
androidx.lifecycle:lifecycle-viewmodel-compose (source) dependencies minor 2.9.42.10.0 age confidence
androidx.lifecycle:lifecycle-runtime-ktx (source) dependencies minor 2.9.42.10.0 age confidence
androidx.media3:media3-exoplayer-workmanager dependencies minor 1.8.01.9.1 age confidence
androidx.media3:media3-exoplayer dependencies minor 1.8.01.9.1 age confidence
androidx.media3:media3-common dependencies minor 1.8.01.9.1 age confidence
androidx.compose:compose-bom dependencies major 2025.11.002026.01.01 age confidence
androidx.activity:activity-compose (source) dependencies minor 1.11.01.12.3 age confidence
androidx.activity:activity-compose (source) dependencies patch 1.12.0-rc011.12.3 age confidence
com.android.application (source) plugin major 8.13.19.0.0 age confidence
com.android.test (source) plugin major 8.13.19.0.0 age confidence

Release Notes

actions/cache (actions/cache)

v5

Compare Source

actions/checkout (actions/checkout)

v6

Compare Source

actions/upload-artifact (actions/upload-artifact)

v6

Compare Source

gradle/gradle (gradle)

v9.3.1: 9.3.1

Compare 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:

./gradlew wrapper --gradle-version=9.3.1 && ./gradlew 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.0

Compare Source

takahirom/roborazzi (io.github.takahirom.roborazzi)

v1.58.0

Compare 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.0

Compare Source

Fix AGP 9.0 KMP preview screenshots

We had been using unitTestSources?.**java**?.addGeneratedSourceDirectory, but this approach proved ineffective when we adopted com.android.kotlin.multiplatform.library. Consequently, we migrated to unitTestSources?.**kotlin**?.addGeneratedSourceDirectory for the KMP plugin. Unfortunately, when applying com.android.library, unitTestSources?.kotlin remains 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.)

  val isKmpLibrary = project.plugins.hasPlugin("com.android.kotlin.multiplatform.library")
  if (isKmpLibrary) {
    unitTestSources?.kotlin?.addGeneratedSourceDirectory(
      generateTestsTask,
      GenerateComposePreviewRobolectricTestsTask::outputDir
    )
  } else {
    unitTestSources?.java?.addGeneratedSourceDirectory(
      generateTestsTask,
      GenerateComposePreviewRobolectricTestsTask::outputDir
    )
  }
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 invoke

      composeTestRule.mainClock.advanceTimeByFrame()
      composeTestRule.waitForIdle()

Reproducing screenshots image

What's Changed

Full Changelog: takahirom/roborazzi@1.56.0...1.57.0

v1.56.0

Compare Source

Added AGP 9.0 compatibility to RoborazziPlugin

Roborazzi was previously using APIs and classes that have since been deprecated, such as Variant.unitTest and 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:

composeRuleFactory = { createAndroidComposeRule<RoborazziActivity>() as AndroidComposeTestRule<ActivityScenarioRule<out ComponentActivity>, *> },
What's Changed

Full Changelog: takahirom/roborazzi@1.55.0...1.56.0

v1.55.0

Compare Source

Bugfix: Fix WebP ClassCastException
What happened
  • Robolectric runs inside a custom class loader named SdkSandboxClassLoader.
  • Roborazzi's WebP support relies on ImageIO.getImageWritersByMIMEType, which internally caches writers in a static field. When the writer is first created, the code is executed by SdkSandboxClassLoader1.
  • Subsequently, when another test runs with a different SDK (e.g., 35), a second SdkSandboxClassLoader (SdkSandboxClassLoader2) is spawned. Because ImageIO's cached instance was loaded by a different class loader, attempting to cast it triggers a ClassCastException.

class com.luciad.imageio.webp.WebPWriteParam cannot be cast to class com.luciad.imageio.webp.WebPWriteParam (com.luciad.imageio.webp.WebPWriteParam is in unnamed module of loader org.robolectric.internal.AndroidSandbox$SdkSandboxClassLoader @​1dbb650b; com.luciad.imageio.webp.WebPWriteParam is in unnamed module of loader org.robolectric.internal.AndroidSandbox$SdkSandboxClassLoader @​3e48e859)

What we did

We leveraged reflection to force ImageIO.getImageWritersByMIMEType to 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.0

Compare Source

Breaking change: Report HTML and JSON paths have changed

The HTML report used to be at build/reports/roborazzi/index.html but is now located at build/reports/roborazzi/<build_variant>/index.html. This is a first step toward fixing a long-standing issue where running recordRoborazzi (instead of recordRoborazziDebug) 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.

@&#8203;Preview
@&#8203;Composable
fun PreviewOnSizeChanged() {
  var size by remember { mutableStateOf("unknown") }
  Box(
    modifier = Modifier
      .size(100.dp)
      .background(Color.Blue)
      .onSizeChanged { size = "${it.width}x${it.height}" } // Now invoked! (It used to be skipped.)
  ) {
    Text(text = size, color = Color.White)
  }
}

If you encounter issues with infinite animations—such as CircularProgressIndicator—you can configure frame-based captures using @RoboComposePreviewOptions.

@&#8203;RoboComposePreviewOptions(
  manualClockOptions = [ManualClockOptions(advanceTimeMillis = 0L)]
)

Thank you for reporting this issue, @​savvasenok!

What's Changed

Full Changelog: takahirom/roborazzi@1.53.0...1.54.0

v1.53.0

Compare Source

New feature generatedTestClassCount and behavior changes to Compose Preview support

We've added the generatedTestClassCount option, which enables us to run Preview tests in parallel when you set maxParallelForks to a value greater than 1.

roborazzi {
  generateComposePreviewRobolectricTests {
    generatedTestClassCount = 4
  }
}

As the name generatedTestClassCount suggests, this option generates as many test classes as specified. It creates tests whose previewIndex % 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 verifyComposablePreviewScannerVersion method 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.writeToFile silently fails when parent directories don't exist.

The fix ensures parent directories are automatically created before writing files using NSFileManager.defaultManager.createDirectoryAtPath with withIntermediateDirectories = 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

Full Changelog: takahirom/roborazzi@1.52.0...1.53.0

v1.52.0

Compare Source

Support for com.android.kotlin.multiplatform.library plugin

Even though we can use androidUnitTest in 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 like recordRoborazziAndroidHostTest. 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.1

Compare Source

This release includes the following changes since
1.9.0 release:

  • Common Library:
    • Support date-time strings with only hours in the timezone offset
      (#​2929).
  • ExoPlayer:
    • Allow dynamic scheduling to slow doSomeWork interval only after audio
      starts to support smoother A/V sync at beginning of playback.
    • Fix bug in DefaultLoadErrorHandlingPolicy where
      FileNotFoundException and similar exception types were retried
      multiple times.
    • Fix bug with dynamic scheduling where the calculated time for the next
      doSomeWork was mistakenly reduced by the elapsed time of the current
      iteration of doSomeWork. Addressing this hopefully extends CPU idle
      time and saves power.
    • Fix issue where some playbacks of Dolby Vision files fail when
      attempting to use a fallback AVC or HEVC codec.
    • Fix bug where loading continues after playback ended when removing the
      currently playing item from a playlist
      (#​2873).
    • Avoid leaking MediaItem instances when repeatedly using
      ExoPlayer.replaceMediaItem on the same item
      (#​2993).
    • Prevent potential ANRs caused by emergency wake lock releases
      (#​2979).
  • Extractors:
    • MP3: Parse LAME ReplayGain data
      (#​2840).
  • Audio:
    • Correctly remove support for AC4Profile22 and other legacy profiles
      when assessing AC-4 decoder support in Automotive scenarios
      (#​2609).
  • Video:
    • Discard video codecs on devices below API 30 when the content frame rate
      changes to avoid stuttering playback
      (#​2941).
  • Text:
    • VobSub: Fix some missing subtitles by correctly handling SPUs that
      either contain only a single control sequence, or have critical info
      split across multiple control sequences
      (#​2935).
  • IMA extension:
    • Bug fix: Corrected an issue where the ad MIME type did not match the
      MIME type provided in the IMA LOADED event. The fix now maps the ad MIME
      type using the ad pod index and ad position.
    • Add a null check before accessing result of getAdsManager() and
      AdEvent.getAd().
  • Session:
    • Fix bug where stopping a MediaController connected to a platform
      session crashed the app if stop happened during ad playback
      (#​2948).
    • Add additional verifications on extras Bundle instances in various
      classes to guard against malformed Bundle instances sent from other
      processes.
    • Fix issue where missing commands for COMMAND_SEEK_NEXT or
      COMMAND_SEEK_BACK can cause gaps in the system media notification
      (#​2976).
    • Move bitmap scaling for notification icon off the main thread
      (#​2829).
    • Fix bug where author, writer and composer were not used as a fallback
      when converting from legacy MediaMetadataCompat and
      MediaDescriptionCompat
      (#​3018).
  • Downloads:
    • Fix potential infinite loops when a PriorityTooLowException is handled
      by SegmentDownloader (for DASH, HLS and SmoothStreaming). Custom
      overrides of SegmentDownloader using the protected execute method
      need to provide their task wrapped in a Supplier so it can be
      recreated (#​2931).
  • HLS extension:
    • Pass the raw asset list JSON document to
      Listener.onAssetListLoadCompleted callback. This is a breaking change
      in an unstable API that requires apps that implement this callback to
      add an additional argument of type JSONObject
      (#​2950).
  • RTSP extension:
    • Correctly handle RTP Packets with timestamps that wrap around
      (#​2930).
  • Decoder extensions (FFmpeg, VP9, AV1, etc.):
    • Fix potential NullPointerException that can occur when seeking prior
      to processing the first video frame
      (#​2965).
  • Cast extension:
    • Fix bug preventing the RemoteCastPlayer timeline from updating
      correctly when replacing the playlist.

v1.9.0

Compare Source

  • Common Library:
    • Update minSdk to 23 in line with other AndroidX libraries.
    • Add PlayerTransferState, which facilitates transferring the playback
      state across Player instances.
    • Add void mute() and void unmute() methods to Player that preserve
      and consequently restore Player's volume before and after setting it to
      zero.
    • Publish utility classes WakeLockManager, WifiLockManager,
      AudioFocusManager, AudioBecomingNoisyManager and
      StuckPlayerDetector previously used by ExoPlayer internally to allow
      reuse for other players
      (#​1893).
    • Fix ForwardingPlayer listener handling when the underlying delegate
      player uses reference equality for comparing listener instances
      (#​2675).
    • Add a Player.listenTo suspending extension function in the
      media3-common-ktx library that specifies the particular
      Player.Events that should be acted upon.
    • Fix a crash in BasePlayer.getBufferedPercentage resulting from integer
      overflow when the reported buffered position is implausibly much larger
      than the reported duration
      (#​2750).
    • Fix auto-detection of TrackGroup track type by not ignoring custom
      sample MIME type and falling back to using the potentially wrong track
      type from the container MIME type
      (#​2860).
  • ExoPlayer:
    • Add a stuck player detection that triggers a StuckPlayerException
      player error if the player seems stuck. This happens in the following
      cases, where each default timeout can be configured in
      ExoPlayer.Builder if required:
      • After 10 minutes of STATE_BUFFERING while trying to play and no
        buffering progress.
      • After 10 seconds of STATE_READY while trying to play and no
        playback progress.
      • After 1 minute of STATE_READY beyond the declared duration without
        reaching the end of the item.
      • After 10 minutes with a playback suppression reason while trying to
        play.
    • Enable wake lock handling by default to fix issues with buffering during
      background playback. This is equivalent to setting
      ExoPlayer.Builder.setWakeMode to C.WAKE_MODE_LOCAL.
    • Add listening logic to automatically update the virtual device ID when a
      change is reported to the Context originally passed to
      ExoPlayer.Builder.
    • Add ExoPlayer.setVirtualDeviceId to manually update the virtual device
      ID obtained from the Context passed to ExoPlayer.Builder.
    • Ensure renderers don't consume data from the next playlist item more
      than 10 seconds before the end of the current item.
    • Add setSeekBackIncrementMs, setSeekForwardIncrementMs and
      setMaxSeekToPreviousPositionMs to ExoPlayer to update these settings
      after construction
      (#​2736).
    • Add pre-caching functionality in DefaultPreloadManager. Apps now can
      return
      DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) or
      DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)
      via TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)
      to indicate that a media item needs to be pre-cached.
    • Use pre-caching functionality of DefaultPreloadManager in shortform
      demo app.
    • Add DefaultLoadControl.Builder setters for local playback and adjust
      default values of DefaultLoadControl to work well with a wide range of
      local files.
    • Fix bug where setting an empty playlist can leave the player in
      STATE_READY or STATE_BUFFERING.
    • Enhance the preload manager APIs:
      • Add addMediaItems(List<MediaItem>, List<T>) and
        addMediaSources(List<MediaSource>, List<T>) that add the media
        items or media sources in batch, and automatically call
        invalidate() afterwards.
      • Add removeMediaItems((List<MediaItem>) and
        removeMediaSources(List<MediaSource>) that remove the media items
        or media sources in batch, and make sure that preload manager does
        not start to preload or continue preloading any of them after
        removal.
      • Allow DefaultPreloadManager.setCurrentPlayingIndex(int) to
        invalidate itself automatically. Apps don't need to call
        invalidate() explicitly anymore after updating the current playing
        index.
    • Add capability to skip keyframe reset for forward seeks within the same
      group of pictures while in scrubbing mode.
    • Add DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)
      for apps to set a value of target buffer bytes for a player with the
      specified playerName. The DefaultLoadControl can now make decisions
      of each player separately based on its own allocated bytes and target
      buffer bytes.
    • Add SkipInfo to the AdPlaybackState.AdGroup to carry skip
      information for each ad in the ad group.
    • Fix bug where calling removeMediaItems(List) during playing a
      post-roll created a crash
      (#​2746).
    • Fix some stuttering in playlist playback where frames were mistakenly
      always set as the last sample and rendered.
    • Enable retry path if player fails to generate audio session ID
      (#​2382,
      #​2678).
    • Add support to control the total buffer bytes for the sources in
      DefaultPreloadManager to avoid total buffer bytes for preloading from
      growing arbitrarily. To use the default control logic, Apps can set the
      target buffer bytes for preloading via
      DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) for
      a playerName of PlayerId.Preload.name ("preload"), and inject the
      created DefaultLoadControl via
      DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Add cloneAndSet(int, int) to ShuffleOrder with a default
      implementation (#​2834).
    • Append content resume offset when skipping ad playback after seek
      adjustment or auto transition
      (#​2484).
    • Add API to set and observe codec parameters for audio and video tracks.
      This feature is implemented for MediaCodec based renderers and
      requires API 29+.
      • Use ExoPlayer.setAudioCodecParameters() and
        ExoPlayer.setVideoCodecParameters() to apply parameters.
      • Use ExoPlayer.addAudioCodecParametersChangeListener() and
        ExoPlayer.addVideoCodecParametersChangeListener() to listen for
        changes. Observing vendor-specific keys requires API 31+.
    • Fix IllegalStateException caused by setting an empty media source
      after seeking to a non-zero position and then preparing the player with
      a non-empty media source.
    • Fix bug where seeking into other media items while in scrubbing mode
      could cause IllegalStateException.
    • Fix potential NullPointerException in DefaultPlaybackSessionManager
      (#​2885).
    • Enable improvements in seeking performance for eligible videos.
    • Re-enable use of asynchronous decryption in MediaCodec on API 36+ where
      timeout issues with this platform API have been fixed
      (#​1641).
    • Change the default value of
      MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs
      to 15ms and enable more efficient dropping of video frames before
      decoding for eligible videos.
    • Add maximum memory limit to the automatic memory calculation in
      DefaultLoadControl. This should only take effect if an excessive
      number of tracks get selected
      (#​2860).
    • Fix bug where, if playing in a playlist or repeat mode, seeking in scrub
      mode near the end could cause a seek to the next media item.
  • CompositionPlayer:
    • Publish CompositionPlayer under a new @ExperimentalApi annotation to
      indicate 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).
    • Add support for COMMAND_SET_AUDIO_ATTRIBUTES and audio focus handling
      in CompositionPlayer.
    • Add support for speed changing in secondary sequences in
      CompositionPlayer.
    • Add support for EditedMediaItem.removeVideo.
  • Transformer:
    • Use InAppMp4Muxer as default muxer.
    • Add EditedMediaItem.Builder#setSpeed() and deprecate
      Effects#createExperimentalSpeedChangingEffects().
    • Replace forceAudioTrack and forceVideoTrack with trackTypes in
      EditedMediaItemSequence.
  • Track Selection:
    • Add TrackSelectionParameters.selectTextByDefault to prefer the
      selection of any text track without specifying other more specific
      preferences.
    • Add preferredVideoLabels, preferredAudioLabels and
      preferredTextLabels in TrackSelectionParameters to specify a
      preference for tracks with a specific label, for example those read from
      HLS NAME tags (#​1666).
  • Extractors:
    • FLAC: Tighten header detection to reduce the chance of finding spurious
      headers in the encoded FLAC data, resulting in decoding errors
      (#​558).
    • MP3: Allow gaps between (and before) ID3 tags at the beginning of MP3
      files (#​811,
      #​5718).
    • MP3: Increase sniffing limit to 128kB to match the existing search limit
      for a sync byte
      (#​2713).
    • MP3: Change FLAG_ENABLE_INDEX_SEEKING to prefer seeking information
      from 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).
    • MP3: Change Mp3Extractor to default to a constant bitrate (CBR)
      assumption when no seeking metadata (e.g., Xing, VBRI) is found, even
      when FLAG_ENABLE_INDEX_SEEKING is set. This is based on the MP3
      specification'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).
    • MP4: Disambiguate between audio/mpeg (MP3), audio/mpeg-L1 and
      audio/mpeg-L2 MIME types by peeking the layer value of the first
      sample before emitting a track format from the extractor
      (#​2683).
    • MP4: Improve sniffing efficiency of very large files by assuming a
      stbl box larger than 1MB implies the file must be non-fragmented
      (#​2650).
    • MP4: Add support for ©mvn (movement name) and ©mvi (movement index)
      metadata, these are now emitted as TextInformationFrame objects in
      Format.metadata with IDs of MVNM and MVIN respectively
      (#​2754).
    • MP4: Ignore tracks with missing stsd box (instead of failing to parse
      the whole file).
    • Matroska: Add support for DTS-HD detection
      (#​6225).
    • Fix an issue in MatroskaExtractor where seeking could be inaccurate
      for files with multiple tracks. Cue points are now correctly associated
      with their respective tracks, leading to more precise seeking.
    • MPEG-TS: Fix IllegalArgumentException from ReorderingBufferQueue
      caused by PES packets with no timestamp
      (#​2764).
    • Add support for extracting HEIC Motion Photos. The HeifExtractor can
      now parse HEIC files containing embedded video and audio tracks.
  • Inspector:
    • Introduced a new :media3-inspector module to serve as the dedicated
      home for media inspection utilities. This module now houses a new
      androidx.media3.inspector.MetadataRetriever, which will provide a
      unified API for both metadata and frame extraction. The existing
      androidx.media3.exoplayer.MetadataRetriever is now deprecated in favor
      of this new version.
    • Introduced androidx.media3.inspector.FrameExtractor, a new public API
      for frame extraction. This AutoCloseable class provides a way to
      extract frames with support for HDR video, video effects, and custom
      decoder selection. It should be created via its Builder for a specific
      MediaItem.
    • FrameExtractor: Add getThumbnail() to extract a representative
      thumbnail frame from a media file without requiring a specific
      timestamp.
    • Add androidx.media3.inspector.MediaExtractorCompat, a drop-in
      replacement 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.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot force-pushed the renovate/all branch 4 times, most recently from 89db000 to c81039d Compare November 26, 2025 16:35
@renovate renovate bot force-pushed the renovate/all branch 3 times, most recently from 75beb07 to f0fdb82 Compare December 5, 2025 11:08
@renovate renovate bot force-pushed the renovate/all branch 7 times, most recently from 9d8281b to 2fea6d7 Compare December 17, 2025 23:46
@renovate renovate bot force-pushed the renovate/all branch 2 times, most recently from 68fd968 to 13f396c Compare January 3, 2026 13:28
@renovate renovate bot force-pushed the renovate/all branch 2 times, most recently from fb2a73d to 94a6097 Compare January 9, 2026 17:15
@renovate renovate bot force-pushed the renovate/all branch 5 times, most recently from b0ce7e9 to 83951b3 Compare January 21, 2026 01:03
@renovate renovate bot force-pushed the renovate/all branch 4 times, most recently from ad3a3ab to 850ffaa Compare January 26, 2026 14:32
@renovate renovate bot force-pushed the renovate/all branch 7 times, most recently from 61f4517 to 002bc78 Compare February 2, 2026 14:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants