Users of all ages can now generate images in the Gemini app when signed into their Workspace account

What’s changing

We’re expanding image generation powered by Nano Banana in the Gemini app to Google Workspace users of all ages. 

This update brings a highly requested and powerful creative tool to younger users, helping them visualize ideas and bring their work to life. For example, a student working on a presentation can now ask Gemini to "create an image of a cell's mitochondria for my biology project" or "generate a picture of a public square in ancient Rome."

Expanding access to this feature provides a more consistent creative experience for all Workspace users.

Users under 18 years old can improve upon their generated images with follow-ups, but cannot edit them directly or use uploaded images for image generation. To prepare to bring image generation to younger users, we conducted rigorous testing specific to users under 18. We’ve trained Gemini to recognize areas that are inappropriate to youth, and implemented safety features and guardrails, including content filters, to help prevent unsafe content, such as illegal or age-gated substances, from appearing in its responses to these users.  As a reminder, these filters aren't perfect, so please grant access as appropriate for different age levels. Teachers and staff should continue to help students use Gemini responsibly.

Getting started

Rollout pace

Availability

  • Available for Google Workspace for Education Fundamentals, Standard, and Plus users of all ages

Resources

Google Workspace audit log API enhancements now available

To support more granular incident investigations, we’re expanding the Workspace audit logging datasets available on the Admin SDK (Reports API) to include these additional datasets:

  • Admin data action logs
  • Contacts logs
  • Assignments logs
  • Directory Sync logs
  • Profile logs
  • Graduation logs
  • LDAP logs
  • Meet hardware logs
  • Takeout logs
  • Tasks logs
  • Cloud search logs
  • Access evaluation logs
  • Data migration logs
Additionally, the Reports API now supports in-depth filtering on resource details. You can now filter by labels and resources from your audit logs, allowing for fetching more granular logs. To learn more about this in detail, you can check out the activities list API documentation.

Granular audit logs are critical to helping organizations investigate cybersecurity incidents and understand their data usage. The changes announced today expand the depth of analysis that can be performed.

Rollout pace

Getting started

Availability

 

Media3 1.9.0 – What’s new

Posted by Kristina Simakova, Engineering Manager



Media3 1.9.0 – What's new?

Media3 1.9.0 is out! Besides the usual bug fixes and performance improvements, the latest release also contains four new or largely rewritten modules:
  • media3-inspector - Extract metadata and frames outside of playback

  • media3-ui-compose-material3 - Build a basic Material3 Compose Media UI in just a few steps

  • media3-cast - Automatically handle transitions between Cast and local playbacks

  • media3-decoder-av1 - Consistent AV1 playback with the rewritten extension decoder based on the dav1d library


We also added caching and memory management improvements to PreloadManager, and provided several new ExoPlayer, Transformer and MediaSession simplifications. 


This release also gives you the first experimental access to CompositionPlayer to preview media edits.  


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.

Extract metadata and frames outside of playback

There are many cases where you want to inspect media without starting a playback. For example, you might want to detect which formats it contains or what its duration is, or to retrieve thumbnails.

The new media3-inspector module combines all utilities to inspect media without playback in one place:

  • MetadataRetriever to read duration, format and static metadata from a MediaItem.

  • FrameExtractor to get frames or thumbnails from an item. 

  • MediaExtractorCompat as a direct replacement for the Android platform MediaExtractor class, to get detailed information about samples in the file.


MetadataRetriever and FrameExtractor follow a simple AutoCloseable pattern. Have a look at our new guide pages for more details.

suspend fun extractThumbnail(mediaItem: MediaItem) {
  FrameExtractor.Builder(context, mediaItem).build().use {
    val thumbnail = frameExtractor.getThumbnail().await()
  } 
}

Build a basic Material3 Compose Media UI in just a few steps

In previous releases we started providing connector code between Compose UI elements and your Player instance. With Media3 1.9.0, we added a new module media3-ui-compose-material3 with fully-styled Material3 buttons and content elements. They allow you to build a media UI in just a few steps, while providing all the flexibility to customize style. If you prefer to build your own UI style, you can use the building blocks that take care of all the update and connection logic, so you only need to concentrate on designing the UI element. Please check out our extended guide pages for the Compose UI modules.

We are also still working on even more Compose components, like a prebuilt seek bar, a complete out-of-the-box replacement for PlayerView, as well as subtitle and ad integration.


@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
  Column(modifier) {
    ContentFrame(player)  // Video surface and shutter logic
    Row (Modifier.align(Alignment.CenterHorizontally)) {                 
      SeekBackButton(player)   // Simple controls
      PlayPauseButton(player)
      SeekForwardButton(player)
    }
  }
}

Simple Compose player UI with out-of-the-box elements

Automatically handle transitions between Cast and local playbacks

The CastPlayer in the media3-cast module has been rewritten to automatically handle transitions between local playback (for example with ExoPlayer) and remote Cast playback.

When you set up your MediaSession, simply build a CastPlayer around your ExoPlayer and add a MediaRouteButton to your UI and you're done!


// MediaSession setup with CastPlayer 
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, player)
// MediaRouteButton in UI 
@Composable fun UIWithMediaRouteButton() {
  MediaRouteButton()
}


New CastPlayer integration in Media3 session demo app


Consistent AV1 playback with the rewritten extension based on dav1d

The 1.9.0 release contains a completely rewritten AV1 extension module based on the popular dav1d library.

As with all extension decoder modules, please note that it requires building from source to bundle the relevant native code correctly. Bundling a decoder provides consistency and format support across all devices, but because it runs the decoding in your process, it's best suited for content you can trust. 

Integrate caching and memory management into PreloadManager

We made our PreloadManager even better as well. It already enabled you to preload media into memory outside of playback and then seamlessly hand it over to a player when needed. Although pretty performant, you still had to be careful to not exceed memory limits by accidentally preloading too much. So with Media3 1.9.0, we added two features that makes this a lot easier and more stable:


  1. Caching support – When defining how far to preload, you can now choose PreloadStatus.specifiedRangeCached(0, 5000) as a target state for preloaded items. This will add the specified range to your cache on disk instead of loading the data to memory. With this, you can provide a much larger range of items for preloading as the ones further away from the current item no longer need to occupy memory. Note that this requires setting a Cache in DefaultPreloadManager.Builder.

  2. Automatic memory management – We also updated our LoadControl interface to better handle the preload case so you are now able to set an explicit upper memory limit for all preloaded items in memory. It's 144 MB by default, and you can configure the limit in DefaultLoadControl.Builder. The DefaultPreloadManager will automatically stop preloading once the limit is reached, and automatically releases memory of lower priority items if required.

Rely on new simplified default behaviors in ExoPlayer

As always, we added lots of incremental improvements to ExoPlayer as well. To name just a few:
  • Mute and unmute – We already had a setVolume method, but have now added the convenience mute and unmute methods to easily restore the previous volume without keeping track of it yourself.

  • Stuck player detection – In some rare cases the player can get stuck in a buffering or playing state without making any progress, for example, due to codec issues or misconfigurations. Your users will be annoyed, but you never see these issues in your analytics! To make this more obvious, the player now reports a StuckPlayerException when it detects a stuck state.

  • Wakelock by default – The wake lock management was previously opt-in, resulting in hard to find edge cases where playback progress can be delayed a lot when running in the background. Now this feature is opt-out, so you don't have to worry about it and can also remove all manual wake lock handling around playback.

  • Simplified setting for CC button logic Changing TrackSelectionParameters to say "turn subtitles on/off" was surprisingly hard to get right, so we added a simple boolean selectTextByDefault option for this use case.

Simplify your media button preferences in MediaSession

Until now, defining your preferences for which buttons should show up in the media notification drawer on Android Auto or WearOS required defining custom commands and buttons, even if you simply wanted to trigger a standard player method.

Media3 1.9.0 has new functionality to make this a lot simpler – you can now define your media button preferences with a standard player command, requiring no custom command handling at all.


session.setMediaButtonPreferences(listOf(
    CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
      .setDisplayName(R.string.skip_forward)
      .setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action 
      .build()
))

Media button preferences with fast forward button

CompositionPlayer for real-time preview

The 1.9.0 release introduces CompositionPlayer under a new @ExperimentalApi annotation. The annotation indicates that it is available for experimentation, but is still under development. 

CompositionPlayer is a new component in the Media3 editing APIs designed for real-time preview of media edits. Built upon the familiar Media3 Player interface, CompositionPlayer allows users to see their changes in action before committing to the export process. It uses the same Composition object that you would pass to Transformer for exporting, streamlining the editing workflow by unifying the data model for preview and export.

We encourage you to start using CompositionPlayer and share your feedback, and keep an eye out for forthcoming posts and updates to the documentation for more details.

InAppMuxer as a default muxer in Transformer

Transformer now uses InAppMp4Muxer as the default muxer for writing media container files. Internally, InAppMp4Muxer depends on the Media3 Muxer module, providing consistent behaviour across all API versions. 
Note that while Transformer no longer uses the Android platform's MediaMuxer by default, you can still provide FrameworkMuxer.Factory via setMuxerFactory if your use case requires it.

New speed adjustment APIs

The 1.9.0 release simplifies speed adjustments APIs for media editing. We've introduced new methods directly on EditedMediaItem.Builder to control speed, making the API more intuitive. You can now change the speed of a clip by calling setSpeed(SpeedProvider provider) on the EditedMediaItem.Builder:

val speedProvider = object : SpeedProvider {
    override fun getSpeed(presentationTimeUs: Long): Float {
        return speed
    }

    override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
        return C.TIME_UNSET
    }
}

EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
    .setSpeed(speedProvider)
    .build()


This new approach replaces the previous method of using Effects#createExperimentalSpeedChangingEffects(), which we've deprecated and will remove in a future release.

Introducing track types for EditedMediaItemSequence

In the 1.9.0 release, EditedMediaItemSequence requires specifying desired output track types during sequence creation. This change ensures track handling is more explicit and robust across the entire Composition.

This is done via a new EditedMediaItemSequence.Builder constructor that accepts a set of track types (e.g., C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO). 

To simplify creation, we've added new static convenience methods:

  • EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)

  • EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)

  • EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)

We encourage you to migrate to the new constructor or the convenience methods for clearer and more reliable sequence definitions.

Example of creating a video-only sequence:

EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()


---


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!

Real-World Agent Examples with Gemini 3

Gemini 3 is powering the next generation of reliable, production-ready AI agents. This post highlights 6 open-source framework collaborations (ADK, Agno, Browser Use, Eigent, Letta, mem0), demonstrating practical agentic workflows for tasks like deep search, multi-agent systems, browser and enterprise automation, and stateful agents with advanced memory. Clone the examples and start building today.

Google Workspace Updates Weekly Recap – December 19, 2025

A summary of announcements from the last week:

The announcements below were published on the Workspace Updates blog over the last week. Please refer to the original blog posts for complete details.

Accelerate validation of Google Meet eCDN configuration at scale with Silent Test Mode

We are introducing Silent Test mode, a new offering that lets you run a large-scale eCDN (Enterprise Content Delivery Network) test with your users and devices, across your entire network, while minimizing any risk of impacting the viewer experience. | Learn more about accelerating validation of Google Meet eCDN configuration at scale with Silent Test Mode.

Share stereo sound with audio content in Google Meet

Presenters will now be able to share stereo sound when presenting content with stereo audio in Google Meet. During virtual meetings, presenters often share content with audio, such as music before a meeting starts, videos for review or discussion during the meeting, and more. | Learn more about sharing stereo sound with audio content in Google Meet.

Share your device’s audio when presenting in Google Meet

Sharing your screen is an essential part of collaborating and presenting in Google Meet. Often, you may also want to share audio as part of your presentation. We’re excited to announce that you can now share your device audio when presenting a specific window or your entire screen. | Learn more about sharing your device’s audio when presenting in Google Meet.

Keep your team informed: Introducing the Feeds app for Google Chat

We’re excited to introduce the new Feeds app for  Google Chat. This app makes it simple for teams to bring important, real-time external updates—such as news, blog posts, and industry research from any Atom or RSS feed—directly into their group conversations and spaces. | Learn more about the new Feeds app for Google Chat.

Block messages from unknown senders in Google Chat

We’re introducing a new setting in Google Chat that gives users more control over who can invite them to 1:1 conversations and spaces. While the default setting allows invitations from anyone, users can now choose to restrict incoming requests to known senders only. | Learn more about blocking messages from unknown senders in Google Chat.

Our best avatars in Google Vids yet, now powered by Veo 3.1

Earlier this year we launched AI avatars in Google Vids to streamline video creation, and today we’re excited to announce that our avatars are now powered by Veo 3.1, Google’s state-of-the-art video generation model. | Learn more about the new avatars in Google Vids, now powered by Veo 3.1.

Introducing Gemini 3 Flash for the Gemini app

Introducing Gemini 3 Flash, our latest model with frontier intelligence built for speed, in the Gemini app. It delivers next-generation intelligence at lightning speeds.Built on the foundation of Gemini 3, our most intelligent model, 3 Flash is designed to get answers now, make light work of daily tasks, and connect to the real world instantly. | Learn more about Gemini 3 Flash for the Gemini app.

Google AI Ultra for Business plan adds enhanced NotebookLM experience

Specifically designed for organizations with high demand research needs, Google AI Ultra for Business, an add-on plan for Workspace customers, provides teams with the highest-tier access to Gemini models, unparalleled feature limits, and the capacity to handle the most intricate models. | Learn more about the enhanced NotebookLM experience in the Google AI Ultra for Business plan.