برچسب: Whats

  • Media3 1.6.0 — what’s new?



    Posted by Andrew Lewis – Software Engineer

    This article is cross-published on Medium

    This release includes a host of bug fixes, performance improvements and new features. Read on to find out more, and as always please check out the full release notes for a comprehensive overview of changes in this release.


    Playback, MediaSession and UI

    ExoPlayer now supports HLS interstitials for ad insertion in HLS streams. To play these ads using ExoPlayer’s built-in playlist support, pass an HlsInterstitialsAdsLoader.AdsMediaSourceFactory as the media source factory when creating the player. For more information see the official documentation.

    This release also includes experimental support for ‘pre-warming’ decoders. Without pre-warming, transitions from one playlist item to the next may not be seamless in some cases, for example, we may need to switch codecs, or decode some video frames to reach the start position of the new media item. With pre-warming enabled, a secondary video renderer can start decoding the new media item earlier, giving near-seamless transitions. You can try this feature out by enabling it on the DefaultRenderersFactory. We’re actively working on further improvements to the way we interact with decoders, including adding a ‘fast seeking mode’ so stay tuned for updates in this area.

    Media3 1.6.0 introduces a new media3-ui-compose module that contains functionality for building Compose UIs for playback. You can find a reference implementation in the Media3 Compose demo and learn more in Getting started with Compose-based UI. At this point we’re providing a first set of foundational state classes that link to the Player, in addition to some basic composable building blocks. You can use these to build your own customized UI widgets. We plan to publish default Material-themed composables in a later release.

    Some other improvements in this release include: moving system calls off the application’s main thread to the background (which should reduce ANRs), a new decoder module wrapping libmpegh (for bundling object-based audio decoding in your app), and a fix for the Cast extension for apps targeting API 34+. There are also fixes across MPEG-TS and WebVTT extraction, DRM, downloading/caching, MediaSession and more.

    Media extraction and frame retrieval

    The new MediaExtractorCompat is a drop-in replacement for the framework MediaExtractor but implemented using Media3’s extractors. If you’re using the Android framework MediaExtractor, consider migrating to get consistent behavior across devices and reduce crashes.

    We’ve also added experimental support for retrieving video frames in a new class ExperimentalFrameExtractor, which can act as a replacement for the MediaMetadataRetriever getFrameAtTime methods. There are a few benefits over the framework implementation: HDR input is supported (by default tonemapping down to SDR, but with the option to produce HLG bitmaps from Android 14 onwards), Media3 effects can be applied (including Presentation to scale the output to a desired size) and it runs faster on some devices due to moving color space conversion to the GPU. Here’s an example of using the new API:

    val bitmap =
        withContext(Dispatchers.IO) {
            val configuration =
                ExperimentalFrameExtractor.Configuration
                    .Builder()
                    .setExtractHdrFrames(true)
                    .build()
            val frameExtractor =
                ExperimentalFrameExtractor(
                    context,
                    configuration,
                )
    
            frameExtractor.setMediaItem(mediaItem, /*effects*/ listOf())
    
            val frame = frameExtractor.getFrame(timestamps).await()
            frameExtractor.release()
            frame.bitmap
        }
    

    Editing, transcoding and export

    Media3 1.6.0 includes performance, stability and functional improvements in Transformer. Highlights include: support for transcoding/transmuxing Dolby Vision streams on devices that support this format and a new MediaProjectionAssetLoader for recording from the screen, which you can try out in the Transformer demo app.

    Check out Common media processing operations with Jetpack Media3 Transformer for some code snippets showing how to process media with Transformer, and tips to reduce latency.

    This release also includes a new Kotlin-based demo app showcasing Media3’s video effects framework. You can select from a variety of video effects and preview them via ExoPlayer.setVideoEffects.

    Media3 video effect animation

    Animation showing contrast adjustment and a confetti effect in the new demo app

    Get started with Media3 1.6.0

    Please get in touch via the Media3 issue Tracker if you run into any bugs, or if you have questions or feature requests. We look forward to hearing from you!



    Source link

  • What’s new in the Jetpack Compose April ’25 release



    Posted by Jolanda Verhoef – Developer Relations Engineer

    Today, as part of the Compose April ‘25 Bill of Materials, we’re releasing version 1.8 of Jetpack Compose, Android’s modern, native UI toolkit, used by many developers. This release contains new features like autofill, various text improvements, visibility tracking, and new ways to animate a composable’s size and location. It also stabilizes many experimental APIs and fixes a number of bugs.

    To use today’s release, upgrade your Compose BOM version to 2025.04.01 :

    implementation(platform("androidx.compose:compose-bom:2025.04.01"))
    

    Note: If you are not using the Bill of Materials, make sure to upgrade Compose Foundation and Compose UI at the same time. Otherwise, autofill will not work correctly.

    Autofill

    Autofill is a service that simplifies data entry. It enables users to fill out forms, login screens, and checkout processes without manually typing in every detail. Now, you can integrate this functionality into your Compose applications.

    Setting up Autofill in your Compose text fields is straightforward:

    TextField(
      state = rememberTextFieldState(),
      modifier = Modifier.semantics {
        contentType = ContentType.Username 
      }
    )
    

    For full details on how to implement autofill in your application, see the Autofill in Compose documentation.

    Text

    When placing text inside a container, you can now use the autoSize parameter in BasicText to let the text size automatically adapt to the container size:

    Box {
        BasicText(
            text = "Hello World",
            maxLines = 1,
            autoSize = TextAutoSize.StepBased()
        )
    }
    

    moving image of Hello World text inside a container

    You can customize sizing by setting a minimum and/or maximum font size and define a step size. Compose Foundation 1.8 contains this new BasicText overload, with Material 1.4 to follow soon with an updated Text overload.

    Furthermore, Compose 1.8 enhances text overflow handling with new TextOverflow.StartEllipsis or TextOverflow.MiddleEllipsis options, which allow you to display ellipses at the beginning or middle of a text line.

    val text = "This is a long text that will overflow"
    Column(Modifier.width(200.dp)) {
      Text(text, maxLines = 1, overflow = TextOverflow.Ellipsis)
      Text(text, maxLines = 1, overflow = TextOverflow.StartEllipsis)
      Text(text, maxLines = 1, overflow = TextOverflow.MiddleEllipsis)
    }
    

    text overflow handling displaying ellipses at the beginning and middle of a text line

    And finally, we’re expanding support for HTML formatting in AnnotatedString, with the addition of bulleted lists:

    Text(
      AnnotatedString.fromHtml(
        """
        <h1>HTML content</h1>
        <ul>
          <li>Hello,</li>
          <li>World</li>
        </ul>
        """.trimIndent()
      )
    )
    

    a bulleted list of two items

    Visibility tracking

    Compose UI 1.8 introduces a new modifier: onLayoutRectChanged. This API solves many use cases that the existing onGloballyPositioned modifier does; however, it does so with much less overhead. The onLayoutRectChanged modifier can debounce and throttle the callback per what the use case demands, which helps with performance when it’s added onto an item in LazyColumn or LazyRow.

    This new API unlocks features that depend on a composable’s visibility on screen. Compose 1.9 will add higher-level abstractions to this low-level API to simplify common use cases.

    Animate composable bounds

    Last year we introduced shared element transitions, which smoothly animate content in your apps. The 1.8 Animation module graduates LookaheadScope to stable, includes numerous performance and stability improvements, and includes a new modifier, animateBounds. When used inside a LookaheadScope, this modifier automatically animates its composable’s size and position on screen, when those change:

    Box(
      Modifier
        .width(if(expanded) 180.dp else 110.dp)
        .offset(x = if (expanded) 0.dp else 100.dp)
        .animateBounds(lookaheadScope = this@LookaheadScope)
        .background(Color.LightGray, shape = RoundedCornerShape(12.dp))
        .height(50.dp)
    ) {
      Text("Layout Content", Modifier.align(Alignment.Center))
    }
    

    a moving image depicting animate composable bounds

    Increased API stability

    Jetpack Compose has utilized @Experimental annotations to mark APIs that are liable to change across releases, for features that require more than a library’s alpha period to stabilize. We have heard your feedback that a number of features have been marked as experimental for some time with no changes, contributing to a sense of instability. We are actively looking at stabilizing existing experimental APIs—in the UI and Foundation modules, we have reduced the experimental APIs from 172 in the 1.7 release to 70 in the 1.8 release. We plan to continue this stabilization trend across modules in future releases.

    Deprecation of contextual flow rows and columns

    As part of the work to reduce experimental annotations, we identified APIs added in recent releases that are less than optimal solutions for their use cases. This has led to the decision to deprecate the experimental ContextualFlowRow and ContextualFlowColumn APIs, added in Foundation 1.7. If you need the deprecated functionality, our recommendation for now is to copy over the implementation and adapt it as needed, while we work on a plan for future components that can cover these functionalities better.

    The related APIs FlowRow and FlowColumn are now stable; however, the new overflow parameter that was added in the last release is now deprecated.

    Improvements and fixes for core features

    In response to developer feedback, we have shipped some particularly in-demand features and bug fixes in our core libraries:

      • Make dialogs go edge to edge: When displayed full screen, dialogs now take into account the full size of the screen and will draw behind system bars.

    Get started!

    We’re grateful for all of the bug reports and feature requests submitted to our issue tracker – they help us to improve Compose and build the APIs you need. Continue providing your feedback, and help us make Compose better.

    Happy composing!



    Source link