)]}'
{
  "log": [
    {
      "commit": "05f828f92a695da08c611feb4b7d6b13d6a14936",
      "tree": "65c65976fa6e7b02704c4c114df3c6f051178ccc",
      "parents": [
        "11da3bab8a8509475bdcab657d16be7d6527f995"
      ],
      "author": {
        "name": "palmoni5",
        "email": "d8401948@gmail.com",
        "time": "Fri Nov 13 01:13:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 12 23:13:28 2026 +0000"
      },
      "message": "[flutter_svg] Add a byte budget for the compiled SVG cache (#13596)\n\nMerged main (14f9933a8) in d01b5b2d0, preserving branch history. Main now contains the pending-load changes from #13595. The Files changed tab shows the byte-budget implementation, tests, and release metadata.\n\nAdds a byte budget to the compiled SVG cache: Cache.maximumByteSize defaults to 32 MiB, Cache.currentByteSize reports retained compiled-data bytes, and completed entries obey both the existing count limit and the byte limit using LRU eviction. Oversized results are returned to callers without displacing cached entries. Reducing a limit evicts immediately; zero disables retention. Adds API documentation, regression tests, version 2.4.0 and changelog.\n\nRelated memory report: https://github.com/flutter/flutter/issues/184564. This proposal bounds retained compiled cache data; it does not claim to solve the report\u0027s peak memory during compilation or memory retained by live widgets.\n\nValidation on Windows: flutter analyze (no issues); complete flutter test suite (84 passed, 1 pre-existing skip); formatting and git diff --check. Tests cover byte/count LRU, changing limits, oversized results, out-of-order completions, and disabling/re-enabling during pending loads. Small platform golden differences are accepted by the existing comparator; no goldens were updated.\n\n## Pre-Review Checklist\n\nThis draft was prepared with AI assistance and remains pending the contributor\u0027s human review and confirmation of the unchecked checklist items."
    },
    {
      "commit": "11da3bab8a8509475bdcab657d16be7d6527f995",
      "tree": "b8ad16aa9283431d6992972aeb02debaf13789a4",
      "parents": [
        "14f9933a8cd60456bba2a47b318c4906b9720379"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Thu Nov 12 10:57:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 12 15:57:34 2026 +0000"
      },
      "message": "Roll Flutter from b98afb524077 to 9c427b5d7b1c (29 revisions) (#13636)\n\nhttps://github.com/flutter/flutter/compare/b98afb524077...9c427b5d7b1c\n\n2026-11-12 engine-flutter-autoroll@skia.org Roll Skia from d67d0f22e3ec to 9aa2513a4ac9 (2 revisions) (flutter/flutter#196429)\n2026-11-12 bkonyi@google.com [flutter_tools] Move CpuArch to flutter_tools_core and define HostPlatform by osName and cpuArch (flutter/flutter#195841)\n2026-11-12 engine-flutter-autoroll@skia.org Roll Skia from 23e7e63789b8 to d67d0f22e3ec (2 revisions) (flutter/flutter#196424)\n2026-11-12 evanwall@buffalo.edu Uber compactify (flutter/flutter#196392)\n2026-11-12 engine-flutter-autoroll@skia.org Roll Skia from 3d7e335da165 to 23e7e63789b8 (12 revisions) (flutter/flutter#196422)\n2026-11-12 engine-flutter-autoroll@skia.org Roll Dart SDK from 13af329ea4f2 to e5add7a25b32 (1 revision) (flutter/flutter#196413)\n2026-11-12 robert.ancell@canonical.com Don\u0027t terminate the shared EGL display when an engine is disposed (flutter/flutter#194520)\n2026-11-11 30870216+gaaclarke@users.noreply.github.com Adds manifest flag to turn on SDFs for Android. (flutter/flutter#196056)\n2026-11-11 boetger@google.com Remove bringup from Linux_pixel_7pro integration_ui_keyboard_inset_jump (flutter/flutter#196334)\n2026-11-11 30870216+gaaclarke@users.noreply.github.com Uses system default locale for text rendering when preferred locale isn\u0027t supported (flutter/flutter#195997)\n2026-11-11 30870216+gaaclarke@users.noreply.github.com [android]: prewarms shaders when the context is created (flutter/flutter#196069)\n2026-11-11 chris@bracken.jp iOS: Recomposite platform views only if their parameters change (flutter/flutter#196287)\n2026-11-11 bkonyi@google.com [flutter_tools] Forward encoding in ErrorHandlingFile.readAsStringSync (flutter/flutter#196136)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from b89c24bbab8c to 3d7e335da165 (8 revisions) (flutter/flutter#196390)\n2026-11-11 737941+loic-sharma@users.noreply.github.com Add Flutter Gardener instructions on how to disable a test (flutter/flutter#196312)\n2026-11-11 zanderso@users.noreply.github.com [Impeller] Enable malioc analysis for framebuffer_blend shaders (flutter/flutter#196343)\n2026-11-11 bkonyi@google.com [flutter_tools] Migrate general.shard Android, asset, and build tests off globals (flutter/flutter#196125)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Dart SDK from 8f15c4ca2d41 to 13af329ea4f2 (1 revision) (flutter/flutter#196386)\n2026-11-11 caimengnan@xiaomi.corp-partner.google.com [Impeller] Do not clamp the local coverage limit to the root render target (flutter/flutter#195860)\n2026-11-11 robert.ancell@canonical.com [Impeller] Use separate uniform buffers on VMware SVGA3D (flutter/flutter#196022)\n2026-11-11 bkonyi@google.com [flutter_tools] Introduce AndroidSdkProvider for lazy native_assets SDK lookup (flutter/flutter#196122)\n2026-11-11 30870216+gaaclarke@users.noreply.github.com Moves linux to ThinLTO. (flutter/flutter#196314)\n2026-11-11 bkonyi@google.com [flutter_tools] Migrate bin/fuchsia_tester.dart off globals and runInContext (flutter/flutter#196074)\n2026-11-11 30870216+gaaclarke@users.noreply.github.com Changes the tolerances for frame_rate_main_test.dart. (flutter/flutter#196304)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Packages from 08faf6409187 to 653628e8a646 (16 revisions) (flutter/flutter#196381)\n2026-11-11 zemanux@users.noreply.github.com Allow SliverCrossAxisGroup children to lay out with zero cross-axis extent instead of asserting (flutter/flutter#191287)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from cc4c54f752ba to b89c24bbab8c (4 revisions) (flutter/flutter#196375)\n2026-11-11 robert.ancell@canonical.com [Linux] Fix layer offset when compositing with glBlitFramebuffer (flutter/flutter#196189)\n2026-11-11 bkonyi@google.com [flutter_tools] Inject CrashReportSender into SwiftPM migration (flutter/flutter#196315)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC quncheng@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "14f9933a8cd60456bba2a47b318c4906b9720379",
      "tree": "f4918fdf911265ad01cf6fdbd08f892f862cef28",
      "parents": [
        "4765bd950d31784578608cfbb0c723453cc49216"
      ],
      "author": {
        "name": "Chandra ObulaReddy",
        "email": "53801679+ChandraChaan@users.noreply.github.com",
        "time": "Thu Nov 12 06:41:18 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 12 01:11:18 2026 +0000"
      },
      "message": "[material_ui] Fix SnackBarThemeData.lerp dropping showCloseIcon (#13449)\n\n`SnackBarThemeData.lerp` never passes `showCloseIcon` to the constructor, so a lerped theme always has `showCloseIcon \u003d\u003d null`. This shows up during `AnimatedTheme` transitions, where a snack bar loses the close icon its theme asked for.\n\nThis adds `showCloseIcon` to `lerp` using the same `t \u003c 0.5` switch as the other non-lerpable fields (`behavior`, `dismissDirection`), and a unit test covering both halves of the animation and a null theme on either side.\n\nFixes https://github.com/flutter/flutter/issues/195390\n\n## Pre-Review Checklist"
    },
    {
      "commit": "4765bd950d31784578608cfbb0c723453cc49216",
      "tree": "48113a01b3c28a71b9891ada06871c7c4691590f",
      "parents": [
        "832d5f2252fd9e1cc203737d2c7d70215e8f5770"
      ],
      "author": {
        "name": "Qun Cheng",
        "email": "36861262+QuncCccccc@users.noreply.github.com",
        "time": "Wed Nov 11 15:36:07 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 23:36:07 2026 +0000"
      },
      "message": "[ci] Update repo for 3.50 stable release (#13628)\n\nDoes the steps for [Updating-Packages-repo-for-a-stable-release.md](https://github.com/flutter/flutter/blob/main/docs/ecosystem/release/Updating-Packages-repo-for-a-stable-release.md) for the 3.50 stable release:\n\n- Adds 3.47.9 (Dart 3.13.7) and 3.50.0 (Dart 3.14.0) to the repo tool\u0027s Flutter-to-Dart version mapping.\n- Moves the legacy analysis tasks to N-1 \u003d 3.47.9 and N-2 \u003d 3.44.9.\n- Raises the repo\u0027s minimum Flutter version to 3.44.0, and updates every package below it with `update-min-sdk --flutter-min\u003d3.44.0`.\n- Adds `NEXT` CHANGELOG entries with `update-release-info --version\u003dnext` (no version bumps, per repo policy), but only to packages whose own minimum SDK changed; packages where only an example or another unpublished pubspec changed get no entry. Packages that haven\u0027t released since the 3.47 update already had a 3.41 SDK-bump line in `NEXT`; that line is removed so each section has only one. `webview_flutter_android`\u0027s `NEXT` section had only a stale 3.41 line (it has required 3.44 since 4.12.1), so that section is removed.\n- Updates the release action to Flutter 3.50.0.\n\nAdditional adjustments needed for CI with the updated versions:\n\n- Applies `dart fix --code\u003dprefer_initializing_formals` across packages whose language version moved to Dart 3.12, adopting private named parameters (`this._foo`; call-site argument names and doc comment references are unchanged).\n- Temporarily disables `prefer_initializing_formals` via a local `analysis_options.yaml` in `packages/pigeon/platform_tests/shared_test_plugin_code` (opted in via `packages/pigeon/ci_config.yaml`), since its Pigeon-generated files under `lib/src/generated/` trigger the lint at language version 3.12+ and cannot be edited by hand.\n- Adds temporary `// ignore` / `// ignore_for_file: uri_does_not_exist_in_doc_import` comments (tracked in https://github.com/flutter/flutter/issues/196406) to 20 files in `cupertino_ui`: with N-1 now at 3.47.9, `cupertino_ui` runs in legacy analysis for the first time, where `remove-dev-dependencies` strips `material_ui` and leaves its `@docImport`s unresolved. Uses `override: no changelog needed` since `cupertino_ui` only receives comment changes.\n\nThe stable pin (`.ci/flutter_stable.version`) is updated separately by the autoroller in #13625.\n\nThere\u0027s no tracking issue for this routine post-release update.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "832d5f2252fd9e1cc203737d2c7d70215e8f5770",
      "tree": "837e2e0ea1fc677cda0b87575c6748a83b65f2e0",
      "parents": [
        "3c72edbc03d9b7ac33972c2c576a745ed05a28b1"
      ],
      "author": {
        "name": "Mac kingsley",
        "email": "48776784+mackings@users.noreply.github.com",
        "time": "Wed Nov 11 22:59:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 21:59:01 2026 +0000"
      },
      "message": "[vector_graphics] Use font-family lists as a family with fallbacks (#13552)\n\nSVG `font-family` can be a list like `\"Roboto, sans-serif\"`, but the whole string was passed to Flutter as one font name, so it never matched and you always got the default font.\n\nNow the list is split. The first name is used as the font and the rest go into `fontFamilyFallback`. Quotes around names are removed too. A single name works the same as before, and since this is only in the listener, SVGs that were already compiled get the fix as well.\n\n`parseFontFamilies` is tested directly in `listener_test.dart`, including the fallback order, so the tests also run on web.\n\nFixes https://github.com/flutter/flutter/issues/187087\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "3c72edbc03d9b7ac33972c2c576a745ed05a28b1",
      "tree": "24bda7da92f826c0624db221fc6f3dfe3ddd61a3",
      "parents": [
        "6c71b0706bd7abc663aba1d1bc678b95d9283c3e"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Wed Nov 11 15:53:23 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 20:53:23 2026 +0000"
      },
      "message": "Roll Flutter (stable) from c197ca5199e9 to ab2912035e16 (1647 revisions) (#13625)\n\nhttps://github.com/flutter/flutter/compare/c197ca5199e9...ab2912035e16\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-stable-packages\nPlease CC quncheng@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Flutter (stable): https://github.com/flutter/flutter/issues/new/choose\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "6c71b0706bd7abc663aba1d1bc678b95d9283c3e",
      "tree": "ef135e0fbbe14fffa53a1a9507da3607735f15bb",
      "parents": [
        "e81cfde730f38f4d71f4c0f914dfab301e63eb5a"
      ],
      "author": {
        "name": "stuartmorgan",
        "email": "stuart.morgan@gmail.com",
        "time": "Wed Nov 11 15:39:47 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 20:39:47 2026 +0000"
      },
      "message": "[shared_prferences] Adopts mockito-kotlin in tests (#13624)\n\nAdopts the `mockito-kotlin` library that has been used in other plugins\u0027 test conversions, which simplifies interacting with Mockito in Kotlin code, reducing some unnecessary test boilerplate."
    },
    {
      "commit": "e81cfde730f38f4d71f4c0f914dfab301e63eb5a",
      "tree": "88fd67b255a980012d30ed8c4810bcb2e7e1d907",
      "parents": [
        "5365902aac0a6cb6cf8e8ad862b74c14dfa30e25"
      ],
      "author": {
        "name": "Aleksandr Lozhkovoi",
        "email": "lozhkovoi@gmail.com",
        "time": "Wed Nov 11 21:12:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 20:12:10 2026 +0000"
      },
      "message": "[cupertino_ui] Dim disabled CupertinoSlider controls (#13419)\n\nDims `CupertinoSlider` to 50% opacity when `onChanged` is null, matching the disabled appearance in native UIKit Slider component on iOS. Adds light/dark regression tests for disabling and re-enabling the slider.\r\n\r\nFixes https://github.com/flutter/flutter/issues/106691.\r\n\r\n### Screenshots\r\n\r\nFlutter before/after: iPhone 16 Pro simulator, iOS 18.6, light mode, value 0.67. The top slider is enabled; the bottom is disabled. The native reference shows stock `UISlider` controls in both themes.\r\n\r\n| Before | After | Native UIKit reference |\r\n| --- | --- | --- |\r\n| \u003cimg src\u003d\"https://raw.githubusercontent.com/Wreos/packages/e755e4de3f50f2505fbd7ecf98240159f22d4f6e/before-ios18.6.jpg\" width\u003d\"240\" alt\u003d\"Before: enabled and disabled sliders look identical\"\u003e | \u003cimg src\u003d\"https://raw.githubusercontent.com/Wreos/packages/e755e4de3f50f2505fbd7ecf98240159f22d4f6e/after-ios18.6.jpg\" width\u003d\"240\" alt\u003d\"After: disabled slider is dimmed\"\u003e | \u003cimg src\u003d\"https://raw.githubusercontent.com/Wreos/packages/e755e4de3f50f2505fbd7ecf98240159f22d4f6e/native-ios18.6.jpg\" width\u003d\"240\" alt\u003d\"Native UIKit: disabled sliders are dimmed in light and dark mode\"\u003e |\r\n\r\nAlso checked native UIKit on [iOS 26.5](https://raw.githubusercontent.com/Wreos/packages/e755e4de3f50f2505fbd7ecf98240159f22d4f6e/native-ios26.5.jpg), where the disabled visual element uses 0.5 opacity. This fixes disabled styling, not the slider\u0027s overall design.\r\n\r\nValidation: all 23 tests in `test/slider_test.dart` pass; targeted analysis and formatting pass. The full package suite has not been run locally. No public API changes.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "5365902aac0a6cb6cf8e8ad862b74c14dfa30e25",
      "tree": "c42eed544bb31b0ca772ab68d6bd148b94203c92",
      "parents": [
        "68b3d02dbe5dab207f81db5442eaae583dd72282"
      ],
      "author": {
        "name": "palmoni5",
        "email": "d8401948@gmail.com",
        "time": "Wed Nov 11 21:26:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 19:26:18 2026 +0000"
      },
      "message": "[flutter_svg] Invalidate pending cache entries on clear and evict (#13595)\n\nRebased on current main (`8041ccab1`), preserving the failed-load fix and its regression test from #13604. This PR adds invalidation of pending loads on `Cache.clear` and `Cache.evict`: an obsolete completion cannot repopulate the cache or remove a replacement request, even when loaders reuse the same Future.\n\nDocuments pending-load invalidation on both methods. The cache lifecycle tests live in `cache_test.dart`. The shared-Future regression checks that an evicted request does not populate the cache before the replacement\u0027s completion callback runs. Preserves synchronous cache hits, coalescing and entry-count LRU. Bumps the package to 2.3.4 with a changelog entry.\n\nRelated: https://github.com/flutter/flutter/issues/182486 (failed-load cleanup is already on main via #13604).\n\nValidation on Windows: `flutter analyze` clean; full `flutter test` suite: 77 passed, 1 existing skip; formatting and `git diff --check` passed. No golden files changed.\n\nOverlapping proposals: #13613 also concerns failed pending loads; main already includes #13604. This PR retains that fix and focuses on clear/evict invalidation. #13596 is stacked on this branch and was rebased with it.\n\n## Pre-Review Checklist\n\nThis draft was prepared with AI assistance and remains pending the contributor\u0027s human review and confirmation of the unchecked checklist items."
    },
    {
      "commit": "68b3d02dbe5dab207f81db5442eaae583dd72282",
      "tree": "341253d5a439a88fdcca243030ca3075790b8ee5",
      "parents": [
        "8041ccab1dd3eaed7a953d28c433e99b6ceea29d"
      ],
      "author": {
        "name": "Laha Luhem",
        "email": "ahalmehul+github@gmail.com",
        "time": "Wed Nov 11 20:05:54 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 19:05:54 2026 +0000"
      },
      "message": "[cupertino_ui] Fix the tinted button\u0027s fill opacity (#13436)\n\n`CupertinoButton.tinted` fills with 12% of the accent where UIKit uses 18%. On white that is `#e0efff` against UIKit\u0027s `#d1e7ff`. Dark mode already matched at 26%.\r\n\r\nFixes flutter/flutter#195265\r\n\r\n## The constant has a second reader\r\n\r\n`kCupertinoButtonTintedOpacityLight` also paints `CupertinoActionSheetAction`\u0027s focus highlight, so that changes as well.\r\n\r\nThat reuse was deliberate. The focus support PR (flutter/flutter#167119) took the colour from `CupertinoButton` on purpose, and iOS has no fixed number of its own here, because the focus colour is a system setting the user can change. Splitting the constant would pin the highlight to a value, whose only source was the button\u0027s.\r\n\r\n## Tests\r\n\r\n`button_test.dart` already pinned the light fill with a literal, so it just moves to 18%. `action_sheet_test.dart`\u0027s light focus case computed its expected colour from the constant, so it could never fail on a value change and now carries the literal too. The dark cases still read the constant, which is correct, nothing here moves them.\r\n\r\n## Not touched\r\n\r\nThe same line sits in `packages/flutter/lib/src/cupertino/constants.dart` with the same two readers, so `CupertinoButton.tinted` in the SDK keeps the old value.\r\n\r\n## Pre-Review Checklist\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "8041ccab1dd3eaed7a953d28c433e99b6ceea29d",
      "tree": "712c3b4c91daf61a41824780bd39a6b38a99a04d",
      "parents": [
        "653628e8a6460757f663530ed60e8e735029a0ff"
      ],
      "author": {
        "name": "Edwin Hollen",
        "email": "37883572+edwin-hollen@users.noreply.github.com",
        "time": "Wed Nov 11 13:03:32 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 18:03:32 2026 +0000"
      },
      "message": "[various] Support SVG filters (blur, offset, feMerge) (#11909)\n\n[various] Support SVG filters (blur, offset, feMerge)\n\nFixes https://github.com/flutter/flutter/issues/158592\n\nThis PR introduces support for basic SVG filters (`feGaussianBlur`, `feOffset`, and `feMerge`) to the `vector_graphics` ecosystem. (Alpha mask support has been split out into a separate PR per review feedback.)\n\nKey Features:\n* Added parsing, resolution, and encoding of SVG filters including `feGaussianBlur`, `feOffset`, and `feMerge` in `vector_graphics_compiler`.\n* Updated the binary format and `vector_graphics_codec` to support encoding and decoding paint blurs.\n* Updated `vector_graphics` to render paint blurs using Flutter\u0027s `ui.ImageFilter.blur`.\n* Enhanced `SourceAlpha` filters to preserve opacity variations in gradient stops by mapping gradient colors to black while maintaining their alpha values.\n\nImplementation Details:\n* **Filter Chaining**: Filters are parsed into a directed acyclic graph (DAG) of primitives. The resolver traces these primitives from the filter outputs back to `SourceGraphic`/`SourceAlpha` to determine the necessary rendering layers.\n* **Multi-layer Filter Resolution**: Handles multi-layer filters (e.g. from `feMerge`) by duplicating the target rendering nodes for each layer in the AST.\n* **Text Filter Resolution**: Resolves filters at the `TextPositionNode` level (rather than leaf `TextNode`s) to maintain correct text chunk alignment and cursor positioning.\n* **Nested Filter Propagation**: Enhanced nested parent nodes (groups), inner path filters, and text position nodes to correctly inherit and propagate the outer `SourceAlpha` state down the tree.\n* **Blur Scaling**: Scales the blur standard deviations by the accumulated transform\u0027s scale factors at both the group and path/text levels to ensure correct rendering when scaled (since the compiler bakes geometry transforms at compile time, the blur sigmas must also be scaled to match).\n* **Compiler Optimizer \u0026 Tessellator Compatibility**:\n  * Preserves `blurSigmaX`/`blurSigmaY` when `TessellationVisitor` and `PathOps` convert `PathNode`s to `VerticesNode`s.\n  * Prevents `MaskingOptimizer`, `ClippingOptimizer`, and `OverdrawOptimizer` from collapsing or intersecting paths that carry a blur filter (since blurred paint extends beyond geometric path bounds).\n* **Spec Compliance**:\n  * Supports both comma and space-separated `stdDeviation` values.\n  * Defaults omitted `stdDeviation` attributes to `0.0` (as per SVG spec).\n  * Automatically resolves default `in` attributes for `feMergeNode`s (falling back to the previous sibling primitive\u0027s result or `SourceGraphic`).\n  * Preserves original fill/stroke opacity when applying `SourceAlpha` filters.\n  * Handles self-closing `\u003cfeMerge /\u003e` elements.\n* **Robustness, Performance \u0026 Optimizations**:\n  * Added cycle detection during filter tracing to prevent stack overflow on circular filter references.\n  * Skips rendering node recreation for filter layers that do not affect the paint (e.g. plain `SourceGraphic` branches in a merge).\n  * Wrapped current layer state restoration in `try-finally` blocks inside parent node and text position node visitors to guarantee robust recovery in case of exceptions.\n  * Caches blackened gradients in `ResolvingVisitor` to prevent redundant object allocations for shared SVG gradients.\n  * Guarded against setting paint `imageFilter` when blur standard deviations are `0.0` to avoid unnecessary rendering overhead in Flutter.\n  * Defensively clamped blur standard deviations to non-negative values in the rendering listener to prevent crashes when processing malformed SVG files.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.\n\nTAG\u003dagy\nCONV\u003d27cb188a-9ad9-4434-8918-8ef71bdba17c"
    },
    {
      "commit": "653628e8a6460757f663530ed60e8e735029a0ff",
      "tree": "6f1ba9a3fa0af44c3e2546bc3b940fe278af57f2",
      "parents": [
        "b9397f207c07c08a388ddaada9b70a833bb3c7c8"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Wed Nov 11 10:59:40 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:59:40 2026 +0000"
      },
      "message": "Roll Flutter from fffd8c22ae64 to b98afb524077 (31 revisions) (#13623)\n\nhttps://github.com/flutter/flutter/compare/fffd8c22ae64...b98afb524077\n\n2026-11-11 engine-flutter-autoroll@skia.org Roll Dart SDK from 172cf8f121c0 to 8f15c4ca2d41 (1 revision) (flutter/flutter#196367)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from 657283e78115 to cc4c54f752ba (5 revisions) (flutter/flutter#196365)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from 2605c4a9761c to 657283e78115 (1 revision) (flutter/flutter#196358)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Dart SDK from 890c6d15334c to 172cf8f121c0 (1 revision) (flutter/flutter#196352)\n2026-11-11 bkonyi@google.com [flutter_tools] Migrate general.shard project, runner, and web tests off globals (flutter/flutter#196128)\n2026-11-11 bkonyi@google.com [flutter_tools] Migrate test helpers and integration tests off globals (flutter/flutter#196124)\n2026-11-11 kevmoo@users.noreply.github.com [web] Report skwasm WebGL context creation failure instead of hanging (flutter/flutter#193293)\n2026-11-11 bkonyi@google.com [flutter_tools] Migrate commands.shard tests off globals (flutter/flutter#196139)\n2026-11-11 bkonyi@google.com [devicelab] Fix memory benchmark tap synchronization and swipe flakes (flutter/flutter#194457)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from 06062e36d938 to 2605c4a9761c (2 revisions) (flutter/flutter#196350)\n2026-11-11 11473691+YeungKC@users.noreply.github.com Do not wait again for a closed mock event stream in tear down (flutter/flutter#196110)\n2026-11-11 77672371+mitryp@users.noreply.github.com [gen_l10n] Add `use-explicit-plural-values` option (flutter/flutter#194816)\n2026-11-11 engine-flutter-autoroll@skia.org Roll Skia from 7bd33f8a3b70 to 06062e36d938 (2 revisions) (flutter/flutter#196340)\n2026-11-11 magder@google.com Skip redundant work in plugin_test_* (flutter/flutter#196258)\n2026-11-10 magder@google.com Drop test_timeout_secs from shards that no longer need it (flutter/flutter#196277)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Dart SDK from 15c1699d3eeb to 890c6d15334c (1 revision) (flutter/flutter#196321)\n2026-11-10 chris@bracken.jp iOS: Extract FlutterPlatformViewsController platform-thread state to Obj-C (flutter/flutter#196142)\n2026-11-10 magder@google.com Remove `Mac web_tool_tests` and take new subshard builders out of bringup (flutter/flutter#196276)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Skia from 9c3d43d8a04b to 7bd33f8a3b70 (12 revisions) (flutter/flutter#196317)\n2026-11-10 magder@google.com Take customer_testing_devtools out of bringup (flutter/flutter#196239)\n2026-11-10 engine-flutter-autoroll@skia.org Roll ICU from a0ea93436c52 to b09986242cfb (1 revision) (flutter/flutter#196316)\n2026-11-10 bkonyi@google.com [flutter_tools] Avoid unlinking native_assets.json and handle EXDEV (flutter/flutter#196134)\n2026-11-10 magder@google.com Remove old `Windows tool_integration_tests` builders and take the new shards out of bringup (flutter/flutter#196275)\n2026-11-10 737941+loic-sharma@users.noreply.github.com [SwiftPM] Disable tests for when settings fail to compile (flutter/flutter#196310)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from PXc5D7S_q6sIYpfFJ... to oEU515sDqSTvD8Spx... (flutter/flutter#196289)\n2026-11-10 matt.boetger@gmail.com Fix ime insets animation jump (flutter/flutter#191453)\n2026-11-10 mdebbar@google.com Link to original PR in automatic cherry-pick PRs (flutter/flutter#196130)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Packages from 565c65738619 to 08faf6409187 (9 revisions) (flutter/flutter#196296)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Skia from b11315d0a096 to 9c3d43d8a04b (45 revisions) (flutter/flutter#196295)\n2026-11-10 matt.kosarek@canonical.com Replace type-specific window widgets with a single Window widget (flutter/flutter#196002)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Dart SDK from a2baae273bb2 to 15c1699d3eeb (2 revisions) (flutter/flutter#196294)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC quncheng@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "b9397f207c07c08a388ddaada9b70a833bb3c7c8",
      "tree": "f07f45959f3ea7d938bde7c5901d23a2598bc76a",
      "parents": [
        "86509a5afad41766155635a81a0a48823fabb548"
      ],
      "author": {
        "name": "dkbharti-glitch",
        "email": "dkbharti@google.com",
        "time": "Wed Nov 11 16:24:20 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 10:54:20 2026 +0000"
      },
      "message": "[material_ui] Document how to programmatically clear DropdownMenu selection (#13266)\n\n## Description\r\n\r\nClarifies how to programmatically clear or reset the selection in `DropdownMenu`.\r\n\r\nSetting initialSelection to null on a rebuild does not clear the text field, because DropdownMenu only updates the text field when initialSelection changes to a value that matches one of the dropdownMenuEntries. This PR documents that the selection should be cleared by providing a TextEditingController and calling controller.clear() alongside setting the state variable to null, and adds an interactive code sample demonstrating this pattern.\r\n\r\nFixes https://github.com/flutter/flutter/issues/177599\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "86509a5afad41766155635a81a0a48823fabb548",
      "tree": "8237775ed58a1c292ccf6efb91c4f451feaa5343",
      "parents": [
        "054d9d1d7d12137bff72600ecf79b9e70d083f54"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Tue Nov 10 21:07:49 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 05:07:49 2026 +0000"
      },
      "message": "[pigeon] Fix basePath resolution when paths share a string prefix with basePath (#13342)\n\nReplaces string-prefix `!....startsWith(basePath)` checks across `ffigen_config_generator.dart`, `jnigen_config_generator.dart`, `pigeon_lib.dart`, and `pigeon_lib_internal.dart` with a path-aware `isWithinOrEquals(basePath, ...)` helper using `path.posix.equals` and `path.posix.isWithin`.\n\nPreviously, when `basePath` was set (e.g. `basePath: \u0027app\u0027`) and an output or directory path happened to start with the same string prefix without being inside `basePath` (e.g. `dartOut: \u0027app_bindings/lib/src/messages.g.dart\u0027`), `.startsWith(basePath)` evaluated to `true` and skipped prepending `basePath`, while `_getFile` unconditionally joined `basePath` and `output`.\n\nFollow-up from https://github.com/flutter/packages/pull/13283#pullrequestreview-5545768332."
    },
    {
      "commit": "054d9d1d7d12137bff72600ecf79b9e70d083f54",
      "tree": "c637d69d10834b18b3fc9f6663b5fca46f723879",
      "parents": [
        "7729836cbc671a383ea92847b8fc2563c8ca97d4"
      ],
      "author": {
        "name": "Pranta Dutta",
        "email": "44747303+theprantadutta@users.noreply.github.com",
        "time": "Wed Nov 11 10:36:13 2026 +0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 04:36:13 2026 +0000"
      },
      "message": "[cupertino_ui] Fix CupertinoSheetRoute throwing when a drag ends during a pending relayout (#13316)\n\nDragging a `CupertinoSheetRoute` converts drag deltas and the release velocity into fractions of the sheet\u0027s height. Both drag paths read that height from `context.size`: `_CupertinoDragGestureDetectorState.sheetHeight` for regular sheets, and `_dragUpdate` / `_handleDragEnd` in `_CupertinoDraggableScrollableSheetState` for sheets built with `scrollableBuilder`. `Element.size` asserts when the render object is dirty for layout, so a drag that ends while a relayout is pending throws `Cannot get size from a render object that has been marked dirty for layout.` The reporter saw it cascade into `_drag \u003d\u003d null` asserts in `ScrollableState`, after which the sheet stopped responding. In release the assert is stripped and the read returns the last laid out size.\n\nThe fix reads the height from the `RenderBox` directly. That\u0027s the size the sheet was last laid out at, which is the size the drag was made against, and it\u0027s what release builds were already using. The Material `BottomSheet` reads its height for drag updates and fling velocity the same way (`_childHeight`).\n\n## Tests\n\nTwo regression tests, one per drag path. Each starts a partial drag, marks the box the sheet measures as dirty, and releases before the next frame. Both fail on `main` with the assertion above, and both pass with the fix, with the sheet settling back to where it started. The rest of `sheet_test.dart` passes as well (44 tests in total).\n\nOne limitation: the reporter hit this on a device when the keyboard was dismissed mid-drag. Changing the view insets mid-drag in a widget test doesn\u0027t reproduce it, because the relayout that follows lands before the pointer up. So the tests set up the condition from the reporter\u0027s stack trace directly, not the keyboard sequence.\n\nFixes flutter/flutter#194681\n\n## Pre-Review Checklist\n\nI used AI tooling while working on this, and reviewed and tested all of it myself.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "7729836cbc671a383ea92847b8fc2563c8ca97d4",
      "tree": "d1a5546a1f5c556292652eddcfce18efa5d2398f",
      "parents": [
        "5a7871ba39b9898a5b769cb51e7a1338f521e375"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Tue Nov 10 20:08:16 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 04:08:16 2026 +0000"
      },
      "message": "[shared_preferences] Updates Pigeon to 30.0.1 to support multi-engine registration and deregistration. (#13617)\n\nUpdates `shared_preferences_android` and `shared_preferences_foundation` to Pigeon 30.0.1 and `jni` `^1.1.1`.\r\n\r\n- Supports multi-engine registration and deregistration.\r\n- Removes the manual web stub/real FFI export and R8 consumer rules workarounds.\r\n\r\nfixes https://github.com/flutter/flutter/issues/194920"
    },
    {
      "commit": "5a7871ba39b9898a5b769cb51e7a1338f521e375",
      "tree": "d3515af8b8b02f07586a9da077766c77347cb184",
      "parents": [
        "b762b3fdb488cbd23b700cf61cbbecfae76fb470"
      ],
      "author": {
        "name": "Harry Terkelsen",
        "email": "1961493+harryterkelsen@users.noreply.github.com",
        "time": "Tue Nov 10 19:25:08 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 03:25:08 2026 +0000"
      },
      "message": "[vector_graphics] Catch any throwable in useHtmlRenderObject() and cache HTML fallback (#13545)\n\nIn Flutter Web under the CanvasKit and WebAssembly renderers, vector graphics determine whether to use native raster rendering (`_RawVectorGraphicWidget`) or an HTML compatibility renderer (`_RawWebVectorGraphicWidget`) by calling `useHtmlRenderObject()`, which probes runtime support by recording a 1x1 `ui.Picture` and invoking `picture.toImageSync(1, 1)`.\n\nPreviously, `useHtmlRenderObject()` caught only a narrow allow-list of exception types (`UnsupportedError`, `StateError`, and `NoSuchMethodError`). When WebGL surface creation or OffscreenCanvas initialization fails mid-session, CanvasKit and browser environments can throw unhandled throwables such as bare JavaScript strings (`\u0027Canvas with id [object OffscreenCanvas] was not found\u0027`), foreign JS errors, or `null`. Because these were unhandled, `VectorGraphic` widgets crashed, and because `useHtmlRenderObject()` is evaluated in a static field initializer, subsequent widget builds re-evaluated the uninitialized field and re-threw continuously. Furthermore, `_cachedUseHtmlRenderObject` remained `null` on failure, preventing the HTML fallback from ever being recorded.\n\nThis PR updates `useHtmlRenderObject()` to catch any throwable using a bare `catch (_)` block, sets `_cachedUseHtmlRenderObject \u003d true` on any failure, ensures `ui.Picture` and `ui.Image` resources are always disposed in `finally`, and adds unit tests covering five distinct failure modes, success path caching, and reset lifecycle transitions.\n\nFixes https://github.com/flutter/flutter/issues/189451\n\n## Behavioral Changes\n- Before: When `picture.toImageSync(1, 1)` threw non-Dart errors (such as bare JavaScript strings or foreign JS errors during WebGL/canvas failures), the throwable escaped unhandled from `useHtmlRenderObject()`, crashing `VectorGraphic` widget build passes and re-throwing repeatedly without caching a fallback.\n- After: Any throwable thrown during `toImageSync(1, 1)` is caught, causing `useHtmlRenderObject()` to return `true` (selecting the HTML compatibility render object) and permanently cache `_cachedUseHtmlRenderObject \u003d true` so subsequent widget builds reuse the fallback without re-triggering the failing probe.\n\n## Where to focus\n- **Key Architectural Decisions**:\n  - Replaced specific `on` exception clauses with an open `catch (_)` block in `render_object_selection.dart`. On web compilation targets (`dart2js` and `dart2wasm`), host JavaScript runtimes can throw arbitrary values (including bare strings, JS objects, or null); Dart null safety excludes `null` from `Object`, making `catch (_)` the only clause that intercepts every possible thrown entity.\n  - Latching `_cachedUseHtmlRenderObject \u003d true` on any caught throwable prevents repeat probe execution and CPU thrashing during environmental rendering failures.\n- **Non-Obvious Logic**:\n  - Checking `if (_cachedUseHtmlRenderObject !\u003d null)` prior to `if (!kIsWeb \u0026\u0026 debugToImageSyncOverride \u003d\u003d null)` allows non-web test environments (such as the Dart VM) to hermetically simulate both probe success and probe failure via `debugToImageSyncOverride` without allocating native browser surfaces.\n- **Primary Review Files**:\n  - `packages/vector_graphics/lib/src/render_object_selection.dart`: Core fallback catch and caching logic.\n  - `packages/vector_graphics/test/render_object_selection_test.dart`: Hermetic unit test suite covering string, error, exception, null, and foreign object throws, plus caching and reset semantics.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "b762b3fdb488cbd23b700cf61cbbecfae76fb470",
      "tree": "17ae9e33231d4430f5149b8bb646ab453ea57acb",
      "parents": [
        "99943dd16603ac2146f5450c230cc22589e39fcc"
      ],
      "author": {
        "name": "Chandra ObulaReddy",
        "email": "53801679+ChandraChaan@users.noreply.github.com",
        "time": "Wed Nov 11 08:34:46 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 03:04:46 2026 +0000"
      },
      "message": "[cupertino_ui] Include selectionHandleColor in NoDefaultCupertinoThemeData equality (#13450)\n\n`NoDefaultCupertinoThemeData.operator \u003d\u003d` and `hashCode` leave out `selectionHandleColor`, so two themes that differ only in that color compare equal. `CupertinoThemeData`, which extends it, already includes the field. Because `ThemeData \u003d\u003d` compares `cupertinoOverrideTheme`, an app that passes a `NoDefaultCupertinoThemeData` there and changes only its `selectionHandleColor` gets an \"equal\" `ThemeData`, and dependents aren\u0027t rebuilt.\n\nThis adds the field to both methods, matching `CupertinoThemeData`, and adds a unit test.\n\nFixes https://github.com/flutter/flutter/issues/195391\n\n## Pre-Review Checklist"
    },
    {
      "commit": "99943dd16603ac2146f5450c230cc22589e39fcc",
      "tree": "24b7319bf238db14cbc3ba033ef3f3171f05e61e",
      "parents": [
        "e900712bd2e733c0c26d49f9b92ec5ffd3db6fbc"
      ],
      "author": {
        "name": "Andrew Wilson",
        "email": "luthien256@gmail.com",
        "time": "Tue Nov 10 17:23:56 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 01:23:56 2026 +0000"
      },
      "message": "[flutter_svg] Remove failed async loads from Cache._pending (#13604)\n\nIn `Cache.putIfAbsent`, `pendingResult.then((ByteData data) { ... })` did not attach an `onError` handler. When an asynchronous SVG load rejected (for example, `SvgNetworkLoader` failing while offline or throwing `http.ClientException` on non-2xx responses), `_pending.remove(key)` never ran—leaving the rejected `Future` permanently cached in `_pending[key]` across retries—and the unguarded child `Future` from `.then` reported an uncaught error to the active `Zone` even when callers awaited `putIfAbsent` inside `try`/`catch`.\n\nAttaches `onError` to `pendingResult.then` so failed loads evict `_pending[key]` without leaking uncaught `Zone` errors while preserving the caller\u0027s rejected `Future`.\n\nFixes b/583860731\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "e900712bd2e733c0c26d49f9b92ec5ffd3db6fbc",
      "tree": "368e2d46edc06c96c8687de541221bac0163da0b",
      "parents": [
        "a75bde31b96aa7fe85cd7bde55d11ceeaf32fddf"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Tue Nov 10 17:15:46 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 01:15:46 2026 +0000"
      },
      "message": "[pigeon] Adds Native Interop FFI codec serialization for NS types (#13616)\n\nAdds support for serializing Foundation / Objective-C values (`Foundation.Data`, `NSData`, `NSArray`, and `NSDictionary`) as `Any?` in the Swift Native Interop (`useFfi: true`) hybrid codec.\r\n\r\nPreviously, `PigeonInteropWriter.writeValue` only handled Swift `Array`, `Dictionary`, and `[UInt8]` values (via `PigeonInteropList`, `PigeonInteropMap`, and exact `[UInt8].self`), hitting `preconditionFailure` when Apple Foundation APIs (such as `UserDefaults`) returned `NSArray`, `NSDictionary`, or `Data`/`NSData` inside untyped `Any` values or collections. Adding `Foundation.Data`, `NSArray`, and `NSDictionary` fallbacks matches `FlutterStandardWriter` behavior and uses qualified `Foundation.Data` so it does not collide with user-defined Pigeon classes named `Data`.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "a75bde31b96aa7fe85cd7bde55d11ceeaf32fddf",
      "tree": "ff15669dc91169a7931010094514e70c10dad14e",
      "parents": [
        "75094a60a49e7a3fd3444cd00eefe3fba84edae3"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Tue Nov 10 14:24:42 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 22:24:42 2026 +0000"
      },
      "message": "[pigeon] Support multi-engine Native Interop registration and instance-aware unregistration (#13576)\n\nAssociates Native Interop (`useJni` / `useFfi`) `@HostApi` and `@FlutterApi` registrations with the Flutter engine that made them. Lookups route to the calling engine\u0027s registration when the engine is known, and detaching one engine removes only that engine\u0027s registration.\r\n\r\nPreviously, attaching a secondary `FlutterEngine` overwrote any existing registration under the same `name`. Detaching that engine via `register(null)` then cleared the entry for all remaining engines in the process. For example, `shared_preferences_android` failed in the main engine after a background engine detached (https://github.com/flutter/flutter/issues/194920).\r\n\r\n\u003e [!NOTE]\r\n\u003e Per review, the standalone `@FlutterApi` fixes (the `pigeonVar_` prefix for internal `_\u003cApi\u003eRegistrar` members so `register` / `dartApi` no longer collide on JNI, `implement` with an empty `name`, and the `objective_c \u003c9.6.3` test pin) are split out into https://github.com/flutter/packages/pull/13609 so they can land on 29.x first. This PR contains only the unregistration and multi-engine changes, which depend on each other.\r\n\r\n### Engine identity without deprecated APIs or new stable requirements\r\n\r\n`register` / `unregister` now take the engine handle that plugins and apps already have. Pigeon derives an engine key from it, so moving to `engineId` once https://github.com/flutter/flutter/pull/195881 reaches `stable` is an internal change, not another breaking change:\r\n\r\n| Caller | Engine key |\r\n|---|---|\r\n| Kotlin app: `MyApiRegistrar().register(api, flutterEngine)` | `FlutterEngine.engineId` (public on stable; exact) |\r\n| Kotlin plugin: `MyApiRegistrar().register(api, binding)` | `binding.getEngineId()` when the embedding provides a non-zero value (#195881, detected at runtime, survives R8). Otherwise a per-engine key from `binding.binaryMessenger`. |\r\n| Swift: `MyApiSetup.register(api:registrar:)` | `registrar.engineIdentifier` when available and non-zero (detected at runtime). Otherwise a per-engine key from the registrar\u0027s messenger. |\r\n\r\nGenerated code never calls deprecated embedding APIs such as `FlutterPluginBinding.getFlutterEngine()`. An engine ID of `0` is treated as unknown, because real IDs are never `0`. `0` shows up for registrars whose engine is already deallocating, and for unstubbed test doubles, and must not be shared between engines.\r\n\r\nDart lookups (`createWithNativeInteropApi()` / `\u003cHostApi\u003eForNativeInterop.getInstance()`) choose a registration in this order:\r\n1. The one whose key matches `PlatformDispatcher.instance.engineId`.\r\n2. Otherwise, if the isolate has no engine ID, one from the engine this isolate first resolved a handle from. This is tracked per generated Pigeon file.\r\n3. Otherwise, the most recent registration.\r\n\r\nNative `@FlutterApi` lookups use the same keys through `\u003cFlutterApi\u003eRegistrar` `getInstance(binding | flutterEngine)` in Kotlin and `getInstance(registrar:)` in Swift.\r\n\r\n**Exact vs. best-effort routing.** Routing is exact whenever native code knows the engine identifier: Kotlin `register(api, flutterEngine)` always, and plugin bindings / registrars on Flutter versions that expose it. Otherwise it is best-effort. It is correct when each engine\u0027s Dart resolves its first handle from each Pigeon file at startup, but it can pick another engine\u0027s registration when:\r\n- Engines are created back-to-back before their Dart starts.\r\n- A file\u0027s first lookup happens lazily while another engine is attached.\r\n- Lookups come from `Isolate.spawn` / `Isolate.run` isolates.\r\n\r\nmacOS plugins receive no detach callback, so macOS registrations currently outlive their engine. The README and guides document these limits and recommend platform channels / `@ProxyApi` for engine-stateful APIs in those cases. Full engine routing remains tracked in https://github.com/flutter/flutter/issues/195877.\r\n\r\n### Summary of Changes\r\n\r\n* **Engine-keyed registration stacks \u0026 `unregister`**: Each `name` keeps an ordered stack of `(engine key, instance)` entries.\r\n  * Re-registering the same instance for the same engine moves it to the top and keeps its existing wrapper.\r\n  * `unregister(api, engine)` removes only that engine\u0027s entry, even out of order. If the engine key can\u0027t be resolved, it falls back to matching by instance identity, but only when a single engine holds that instance.\r\n* **Detached `@HostApi` safety**: Calls through a handle whose instance was unregistered throw `unregistered-instance` (Kotlin/Swift) instead of crashing. Swift `Setup` wrappers use `resolveApi() throws` instead of `api!`.\r\n* **Engine teardown safety (Swift)**: Engine keys are cached per registrar. `unregister` from `detachFromEngine(for:)` therefore works while the engine is deallocating and its messenger is already gone.\r\n* **Registry thread safety**: Native Interop calls from background isolates run on worker threads. Registration maps, wrapper API references, and engine-key caches are therefore guarded internally:\r\n  * Kotlin uses `synchronized` / `@Synchronized` and `@Volatile`.\r\n  * Swift uses `NSLock` / `NSRecursiveLock`. Removed entries are released after unlocking, so their `deinit` doesn\u0027t run while the lock is held.\r\n  * This doesn\u0027t make registration a thread-safe API contract. Registration is still expected on the main thread.\r\n* **Dart `@FlutterApi`**:\r\n  * `\u003cFlutterApi\u003e.setUp(null)` deregisters only the current isolate\u0027s native callback.\r\n  * Registering via `setUp(a)` or the registrar, then calling `setUp(null)`, now correctly removes `a`.\r\n  * Adds `\u003cFlutterApi\u003eRegistrar.unregister`.\r\n  * Registrations are tagged with the isolate\u0027s engine so native lookups reach the right isolate.\r\n* **Documentation**:\r\n  * Updates the README, Native Interop guide, migration guide, migration skill, and `CHANGELOG.md`, including the routing guarantees and limits above.\r\n  * Notes that `registrar.publish(instance)` is required for iOS to call `detachFromEngine(for:)`.\r\n* **Tests**:\r\n  * Generator unit tests for Dart, Kotlin, and Swift.\r\n  * Kotlin `NativeInteropRegistrarTest`, iOS `RunnerTests`, and macOS `BasicCompileTest`. These cover:\r\n    * the same API on two engines\r\n    * out-of-order unregister\r\n    * the identity fallback\r\n    * resolve order\r\n    * `@FlutterApi` lookup by engine\r\n  * Real secondary-engine and multi-isolate integration tests.\r\n  * An integration test asserting that registrations use the exact `PlatformDispatcher.instance.engineId` when the platform exposes it. It runs in minified Android release builds to cover R8.\r\n\r\n### Breaking Native Interop API Changes (`30.0.0`)\r\n\r\n* **Engine-aware registration**:\r\n  * `@HostApi` `register` / `unregister` take the engine: `MyApiRegistrar().register(api, binding)` / `register(api, flutterEngine)` in Kotlin, and `MyApiSetup.register(api:registrar:)` in Swift. `unregister` follows the same shape.\r\n  * Native `@FlutterApi` lookup takes the engine: `getInstance(binding | flutterEngine)` in Kotlin and `getInstance(registrar:)` in Swift. The name-only native `getInstance` is removed.\r\n* **Explicit deregistration**:\r\n  * Replaces `register(null)` / `register(api: nil)` / `registerInstance(null | nil)` with `unregister` / `unregisterInstance`, which remove only the given instance for the given engine.\r\n  * `register` / `registerInstance` require a non-null API and return `void` / `Unit` / `Void`.\r\n* **Swift `@HostApi` `AnyObject` constraint**: FFI Swift `@HostApi` protocols are constrained to `AnyObject` so instances can be matched by identity.\r\n* **Reserved names**: `pigeonResolveInstance`, `pigeonEngineKey`, and `pigeonEngineKeyOf` are reserved as `@HostApi` method names.\r\n\r\nPart of https://github.com/flutter/flutter/issues/195877\r\nPart of https://github.com/flutter/flutter/issues/194920\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "75094a60a49e7a3fd3444cd00eefe3fba84edae3",
      "tree": "a52045d448deab5f24a9da28c16eff73e44ad5bb",
      "parents": [
        "254a37e5a738edc74f6a0a547fb2e191bf74ee93"
      ],
      "author": {
        "name": "victogomez-cs",
        "email": "victor.orozco@cloudsufi.com",
        "time": "Tue Nov 10 15:56:31 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 21:56:31 2026 +0000"
      },
      "message": "[image_picker_ios] Convert the iOS example app and UI tests to Swift (#13570)\n\nConverts the `image_picker_ios` iOS example app and UI tests from Objective-C to Swift:\n\n* `AppDelegate` is now Swift. `@main` replaces `main.m`, and `AppDelegate.h` becomes `Runner-Bridging-Header.h`.\n* `ImagePickerFromGalleryUITests` and `ImagePickerFromLimitedGalleryUITests` are now Swift.\n* The example still seeds the photo library from `jpgImageTall.jpg`, and logs when that fixture is missing.\n* Drops the `@available(iOS 14, *)` checks in the UI tests. The example already requires iOS 15.\n\nThe plugin implementation is unchanged from https://github.com/flutter/packages/pull/13493.\n\nBumps image_picker_ios to **0.8.13+16**.\n\nFollow-up to the Obj-C → Swift migration, following https://github.com/flutter/packages/pull/13493. Part of https://github.com/flutter/flutter/issues/119107\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "254a37e5a738edc74f6a0a547fb2e191bf74ee93",
      "tree": "4b429eb1a3723a871e7c340aba925901eda9501d",
      "parents": [
        "0f29291f4afbf285568b8a457a51fc3cd8873d09"
      ],
      "author": {
        "name": "Ronit Rameja",
        "email": "120367427+master-wayne7@users.noreply.github.com",
        "time": "Wed Nov 11 01:02:55 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 19:32:55 2026 +0000"
      },
      "message": "[cupertino_ui] Localize CupertinoActionSheet semantics label (#13377)\n\n`CupertinoActionSheet` wraps its content in a `Semantics` node that names and scopes the route, labelled with the hardcoded string `\u0027Alert\u0027`. Because this node names the route, apps can\u0027t override the label, so VoiceOver announces \"Alert\" in English whatever the app\u0027s locale.\n\nThis PR uses `CupertinoLocalizations.of(context).alertDialogLabel` instead. `CupertinoAlertDialog` in the same file already does this, and every `cupertino_*.arb` file already translates the key (e.g. `\"Alerta\"` for `pt`). The English default is still `\u0027Alert\u0027`, so the existing semantics test is unchanged.\n\nNote: `CupertinoActionSheet` now looks up `CupertinoLocalizations`, so it needs a localizations ancestor, which `CupertinoApp` provides. `CupertinoAlertDialog` already has this requirement.\n\nChanges:\n- `lib/src/dialog.dart`: use the localized `alertDialogLabel` for the action sheet\u0027s semantics label.\n- `test/action_sheet_test.dart`: add a regression test that shows an action sheet under the `pt` locale and checks that the dialog semantics node is labelled \"Alerta\". The test fails before this change and passes after it.\n- `pending_changelogs/localize_action_sheet_semantics_label.yaml`: patch-level changelog entry, following the package\u0027s batch release process.\n\nFixes https://github.com/flutter/flutter/issues/195019\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "0f29291f4afbf285568b8a457a51fc3cd8873d09",
      "tree": "2510c386534012881af3aa71bbc22715aad61b96",
      "parents": [
        "5ba81cb1b7e121403eff4945563af2809dd603f6"
      ],
      "author": {
        "name": "Azim Shaikh",
        "email": "112310225+Azim04@users.noreply.github.com",
        "time": "Wed Nov 11 00:16:09 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 18:46:09 2026 +0000"
      },
      "message": "[camera_android] Fix stopVideoRecording returning JPEG when takePicture runs during recording (#13070)\n\n## Description\r\n\r\nWhen `takePicture()` is called during an active video recording, `stopVideoRecording()` could return the JPEG path instead of the MP4 path because a single `captureFile` field was shared.\r\n\r\nThis change introduces a dedicated `videoCaptureFile` for video recording and keeps `captureFile` for still capture.\r\n\r\n## Related Issue\r\n\r\nFixes https://github.com/flutter/flutter/issues/192927\r\n\r\n## Tests\r\n\r\n- Unit tests in `CameraTest.java`\r\n- Integration test: `stopVideoRecording returns mp4 after takePicture during recording`\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "5ba81cb1b7e121403eff4945563af2809dd603f6",
      "tree": "f6f8d01139225541d9e33dcb0144390d123310ce",
      "parents": [
        "2c1c1bdce92d405df8958bfc229954dae2ce59fc"
      ],
      "author": {
        "name": "Matt Boetger",
        "email": "boetger@google.com",
        "time": "Tue Nov 10 10:37:58 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 18:37:58 2026 +0000"
      },
      "message": "[google_sign_in_android] Rename keep.xml to google_sign_in_keep.xml (#13475)\n\nRename keep.xml to google_sign_in_keep.xml\n\nFixes: https://github.com/flutter/flutter/issues/194943\n\n## Pre-Review Checklist"
    },
    {
      "commit": "2c1c1bdce92d405df8958bfc229954dae2ce59fc",
      "tree": "c900d7c00097907afe1648f9bce200d6e2e78d7e",
      "parents": [
        "6fbd01a2e243810d6252549f7e10ca20076b9677"
      ],
      "author": {
        "name": "Matej Knopp",
        "email": "matej.knopp@gmail.com",
        "time": "Tue Nov 10 18:55:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 17:55:24 2026 +0000"
      },
      "message": "[web_benchmarks] Fix benchmark stalling when only repainting views that are dirty (#13089)\n\nThis is required in order to reland https://github.com/flutter/flutter/pull/192128. Fixes https://github.com/flutter/flutter/issues/193295.\r\n\r\nThe code is little bit hairy because current stable does not have `RenderView.markNeedsCompositeFrame`. I will clean it up when that changes.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "6fbd01a2e243810d6252549f7e10ca20076b9677",
      "tree": "172a4c31cedaddb9823f597ca4c05fb570ed72e2",
      "parents": [
        "08faf6409187303c2eef9fd3ff92db26b4588710"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Tue Nov 10 10:55:21 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 15:55:21 2026 +0000"
      },
      "message": "Roll Flutter from d46382112aa6 to fffd8c22ae64 (21 revisions) (#13614)\n\nhttps://github.com/flutter/flutter/compare/d46382112aa6...fffd8c22ae64\n\n2026-11-10 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from 8QcsP_SmbsT09VgUs... to PXc5D7S_q6sIYpfFJ... (flutter/flutter#196273)\n2026-11-10 Rusino@users.noreply.github.com [web] Accept the capped letter spacing line shift in kitchensink (flutter/flutter#196148)\n2026-11-10 zanderso@users.noreply.github.com Fix Vulkan MSAA diagonal seam in FramebufferBlend (flutter/flutter#196197)\n2026-11-10 97480502+b-luk@users.noreply.github.com Read back images on the raster thread on OpenGLES (flutter/flutter#195927)\n2026-11-10 1961493+harryterkelsen@users.noreply.github.com [web] Unify ui.Paint across CanvasKit and Skwasm (flutter/flutter#196071)\n2026-11-10 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from p3N3B-Kchh1bthB6n... to 8QcsP_SmbsT09VgUs... (flutter/flutter#196249)\n2026-11-09 awolff@google.com [Impeller] Reland clipped BackdropFilter square corners fix (flutter/flutter#195716)\n2026-11-09 1961493+harryterkelsen@users.noreply.github.com [web] Recreate canvas and context on CkOffscreenSurface resize to fix WebGL clipping (flutter/flutter#192769)\n2026-11-09 engine-flutter-autoroll@skia.org Roll Dart SDK from ee0f66fa0ad2 to a2baae273bb2 (1 revision) (flutter/flutter#196245)\n2026-11-09 magder@google.com Add Mac web_tool_tests_1_2 and _2_2 in bringup (flutter/flutter#196241)\n2026-11-09 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#196246)\n2026-11-09 magder@google.com Increase number of \u0027Windows tool_integration_tests\u0027 subshards (flutter/flutter#196243)\n2026-11-09 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from Jo-ZgQSNDuPsjlZ4s... to p3N3B-Kchh1bthB6n... (flutter/flutter#196238)\n2026-11-09 15619084+vashworth@users.noreply.github.com Skip UIScene pre-migration test cases on Xcode 27 (flutter/flutter#194755)\n2026-11-09 kevmoo@users.noreply.github.com [flutter_tools] Share Analytics.isBot and make isRunningOnBot sync (flutter/flutter#194744)\n2026-11-09 mdebbar@google.com [flutter_tools] Retry chromedriver startup when its port is taken (flutter/flutter#196150)\n2026-11-09 mbrase@google.com Remove unused vulkan_provider.cc (flutter/flutter#195513)\n2026-11-09 engine-flutter-autoroll@skia.org Roll Dart SDK from 3b174b7217fe to ee0f66fa0ad2 (13 revisions) (flutter/flutter#196217)\n2026-11-09 rmacnak@google.com Goma is dead, long live RBE! (Take 2) (flutter/flutter#196212)\n2026-11-09 magder@google.com Split DevTools customer tests into its own customer_testing_devtools shard (flutter/flutter#195871)\n2026-11-09 magder@google.com Split mac_host_{debug,profile,release}_arm64_tests into one step per type (flutter/flutter#196031)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC quncheng@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "08faf6409187303c2eef9fd3ff92db26b4588710",
      "tree": "7671fbfa75fc86cf14e38e9a6a10f45f18cfae6c",
      "parents": [
        "3b97f5696cbc139d3eec38a7f9b4b42981658cf5"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Mon Nov 09 18:19:36 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 02:19:36 2026 +0000"
      },
      "message": "[pigeon] Pass data classes and collections in a single buffer per native interop call (#13265)\n\nUpdates Kotlin JNI and Swift FFI native interop so that data classes, `List`, `Map`, and `Object` values are passed in a single buffer per call while keeping scalars, strings, enums, and typed data direct.\r\n\r\n### Background \u0026 Motivation\r\nPreviously, native interop converted every data class, `List`, `Map`, and `Object` into a graph of JVM or Objective-C objects, making a separate call across the language boundary for every field and collection element. For calls passing large or deeply nested data classes and collections, this per-element boundary overhead made native interop significantly slower than platform channels.\r\n\r\n### Summary of Changes\r\n- **Single-Buffer Composite Value Transport**:\r\n  - **Direct Types**: Scalars (`bool`, `int`, `double`), `String`, enums, and typed data (`Uint8List`, `Int32List`, `Int64List`, `Float64List`)—both non-nullable and nullable—continue to cross the JNI / FFI boundary directly as their own parameters and return values.\r\n  - **Buffered Composite Types**: Data classes (including `sealed` class hierarchies), `List`, `Map`, and `Object`/`Any` arguments in a method call are encoded together into a single byte buffer using the generated `PigeonInteropCodec` (`StandardMessageCodec` format) and decoded in one pass on the receiving side. Composite return values and Kotlin `FlutterError.details` are similarly passed as a single encoded buffer.\r\n  - **Unchanged User-Facing APIs**: The public Dart, Kotlin, and Swift APIs and registration methods (`HostApiRegistrar` / `HostApiSetup`, `FlutterApiRegistrar` / `FlutterApiProtocol`, data classes, and method signatures) are unchanged.\r\n  - **Reduced Binding Surface**: Because composite types cross as `ByteArray` / `NSData` buffers, `jnigen` and `ffigen` only need to generate bindings for the `*Registrar`, `*Setup`, and `*Bridge` classes—not for every data class, sealed subclass, or enum.\r\n- **Additional Native Interop Optimizations**:\r\n  - **Kotlin**: Replaces `entries.firstOrNull { it.raw \u003d\u003d raw }` with constant-time `entries.getOrNull(raw)` in generated enum `ofRaw` lookups.\r\n  - **Dart (JNI / FFI)**: Caches `JClass` lookups per class in lazy top-level variables (`_jniClass$\u003cName\u003e`), converts JNI typed-data arrays directly via typed helpers, and copies FFI `NSData` to `Uint8List` once when deriving typed list views.\r\n- **Tests \u0026 Documentation**:\r\n  - Updates the native interop integration test suite (`pigeons/native_interop_tests.dart`) and unit tests across the Dart, Kotlin, Swift, `jnigen`, and `ffigen` generators.\r\n  - Updates `README.md` and `native_interop_guide.md`.\r\n\r\n# Pigeon Benchmark Comparison: Platform Channels vs. Native Interop (Objects) vs. Native Interop (Hybrid)\r\n\r\nThis document compares the evolution of Pigeon\u0027s cross-language transport across three versions using measured release-mode benchmarks:\r\n\r\n\u0026nbsp;\r\n\r\n1. **Platform Channel Pigeon** (`BasicMessageChannel` \\+ `StandardMessageCodec`)  \r\n2. **Native Interop — Objects** (`NativeInteropTransport.objects` — JNI/FFI object-graph transport)  \r\n3. **Native Interop — Hybrid** (`NativeInteropTransport.hybrid` — direct interop for scalars/strings/enums/typed-data \\+ single-buffer `StandardMessageCodec` for data classes and collections)\r\n\r\n\u0026nbsp;\r\n\r\n---\r\n\r\n## 1\\. Architectural Evolution Across the Three Versions\r\n\r\n| Dimension | 1\\. Platform Channel Pigeon | 2\\. Native Interop (`objects`) | 3\\. Native Interop (`hybrid`) |\r\n| :---- | :---- | :---- | :---- |\r\n| **Call Dispatch** | Asynchronous (`BinaryMessenger` hop across platform thread) | Direct synchronous JNI (`package:jni`) / FFI (`dart:ffi`) | Direct synchronous JNI (`package:jni`) / FFI (`dart:ffi`) |\r\n| **Scalars, Strings, Enums** | Serialized into `ByteData` \\+ async channel hop | **1 JNI/FFI call** per parameter | **1 JNI/FFI call** per parameter |\r\n| **Top-Level Typed Data (`Uint8List`, etc.)** | Copied through channel `ByteData` | **1 bulk buffer copy** (`getRange` / `memcpy`) | **1 bulk buffer copy** (`getRange` / `memcpy`) |\r\n| **Data Classes \u0026 Collections** | **1 buffer** (`StandardMessageCodec`) | **\\$O(N \\\\cdot F)\\$ JNI/FFI calls** (1 call per field, collection element, and wrapper allocation) | **1 JNI/FFI call** carrying a single `StandardMessageCodec` `Uint8List` buffer |\r\n| **Boundary Crossings for `List\u003cAllNullableTypes\u003e` (\\$N\u003d100\\$)** | 1 async channel message | **\\~7,500+ JNI/FFI calls** | **1 synchronous JNI/FFI call** |\r\n\r\n\u0026nbsp;\r\n\r\n\u003e \\[\\!IMPORTANT\\] **Why `NativeInteropTransport.objects` regressed on complex types:** While `objects` mode eliminated the async platform-channel hop (making `noop` and scalar calls 35×–3,000× faster), it translated every class field and collection element into individual JNI/FFI calls (`JArrayList.add`, `JHashMap.put`, `JLong.valueOf`, and per-field getters/constructors). Under `hybrid` mode, Pigeon keeps the 1-call fast path for primitives, strings, enums, and `Uint8List`, while packing data classes and collections into a single contiguous `Uint8List` payload that crosses JNI/FFI in one bulk transfer.\r\n\r\n\u0026nbsp;\r\n\r\n---\r\n\r\n## 2\\. Release-Mode Per-Call Latency (`tool/benchmark.dart`)\r\n\r\nMeasured via [`tool/benchmark.dart`](file:///Users/tarrinneal/work/packages/packages/pigeon/tool/benchmark.dart) running [`native_interop_benchmarks.dart`](file:///Users/tarrinneal/work/packages/packages/pigeon/platform_tests/shared_test_plugin_code/lib/native_interop_benchmarks.dart) in `--release` mode (up to 500 ms warmup and 201 timed samples per workload; `objects` mode includes the Phase 1 object-graph fixes such as cached `JClass`, bulk `JByteBuffer`, and pre-sized `JArrayList`).\r\n\r\n### macOS Release (Swift FFI, Apple Silicon arm64)\r\n\r\n| Benchmark Workload | 1\\. Platform Channel (p50) | 2\\. Native Interop `objects` (p50 / p90) | 3\\. Native Interop `hybrid` (p50 / p90) | `objects` vs. Channel | `hybrid` vs. `objects` | `hybrid` vs. Channel |\r\n| :---- | ----: | ----: | ----: | ----: | ----: | ----: |\r\n| `noop` | 11.63 µs | 0.20 µs / 0.23 µs | **0.20 µs** / 0.22 µs | 58.15× faster | 1.00× | **58.15× faster** |\r\n| `echoInt` | 14.00 µs | 0.39 µs / 0.44 µs | **0.39 µs** / 0.42 µs | 35.90× faster | 1.00× | **35.90× faster** |\r\n| `echoString` | 14.18 µs | 1.23 µs / 3.73 µs | **1.22 µs** / 3.64 µs | 11.53× faster | 1.01× | **11.62× faster** |\r\n| `echoUint8List 1MB` | 289.00 µs | 263.00 µs / 449.00 µs | **228.00 µs** / 442.00 µs | 1.10× faster | 1.15× faster | **1.27× faster** |\r\n| `echoAllTypes` (1 object) | 198.00 µs | 1.03 ms / 1.60 ms | **136.50 µs** / 142.50 µs | 🔴 5.20× slower | **7.55× faster** | **1.45× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×1) | 254.00 µs | 1.35 ms / 1.93 ms | **162.00 µs** / 171.00 µs | 🔴 5.32× slower | **8.34× faster** | **1.57× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×10) | 2.37 ms | 14.52 ms / 15.70 ms | **1.62 ms** / 1.69 ms | 🔴 6.13× slower | **8.96× faster** | **1.46× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×100) | 23.94 ms | 149.62 ms / 155.24 ms | **16.36 ms** / 17.03 ms | 🔴 6.25× slower | **9.15× faster** | **1.46× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×1000) | 246.17 ms | 1,482.94 ms / 1,554.68 ms | **170.37 ms** / 174.54 ms | 🔴 6.02× slower | **8.70× faster** | **1.44× faster** |\r\n| `echoIntList` (×10) | 21.13 µs | 17.42 µs / 18.33 µs | **2.10 µs** / 2.69 µs | 1.21× faster | **8.30× faster** | **10.06× faster** |\r\n| `echoIntList` (×100) | 62.00 µs | 138.00 µs / 145.00 µs | **9.26 µs** / 9.96 µs | 🔴 2.23× slower | **14.90× faster** | **6.70× faster** |\r\n| `echoIntList` (×1000) | 433.00 µs | 1.31 ms / 1.38 ms | **77.33 µs** / 83.33 µs | 🔴 3.02× slower | **16.91× faster** | **5.60× faster** |\r\n| `echoIntList` (×10000) | 4.10 ms | 18.79 ms / 19.48 ms | **756.00 µs** / 890.00 µs | 🔴 4.58× slower | **24.85× faster** | **5.42× faster** |\r\n| `echoIntMap` (×1000) | 891.00 µs | 8.87 ms / 14.44 ms | **178.00 µs** / 189.00 µs | 🔴 9.96× slower | **49.83× faster** | **5.01× faster** |\r\n| `callFlutterEchoClassList` (×100) | 49.50 ms | 1,620.53 ms / 1,818.44 ms | **33.00 ms** / 34.24 ms | 🔴 32.74× slower | **49.11× faster** | **1.50× faster** |\r\n\r\n### Android Release (Kotlin JNI, `emulator-5554` arm64)\r\n\r\n| Benchmark Workload | 1\\. Platform Channel (p50) | 2\\. Native Interop `objects` (p50 / p90) | 3\\. Native Interop `hybrid` (p50 / p90) | `objects` vs. Channel | `hybrid` vs. `objects` | `hybrid` vs. Channel |\r\n| :---- | ----: | ----: | ----: | ----: | ----: | ----: |\r\n| `noop` | 671.00 µs | 0.23 µs / 1.66 µs | **0.20 µs** / 0.67 µs | 2,917× faster | 1.15× faster | **3,355× faster** |\r\n| `echoInt` | 512.00 µs | 0.53 µs / 2.83 µs | **0.23 µs** / 0.51 µs | 966× faster | 2.30× faster | **2,226× faster** |\r\n| `echoString` | 362.00 µs | 6.33 µs / 33.95 µs | **6.38 µs** / 16.16 µs | 57.19× faster | 0.99× | **56.74× faster** |\r\n| `echoUint8List 1MB` | 8.22 ms | 2.77 ms / 9.23 ms | **3.48 ms** / 10.60 ms | 2.96× faster | 0.80× | **2.37× faster** |\r\n| `echoAllTypes` (1 object) | 1.06 ms | 2.61 ms / 4.75 ms | **370.00 µs** / 1.35 ms | 🔴 2.47× slower | **7.05× faster** | **2.86× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×1) | 1.01 ms | 3.35 ms / 6.05 ms | **414.00 µs** / 3.15 ms | 🔴 3.30× slower | **8.09× faster** | **2.45× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×10) | 5.92 ms | 42.78 ms / 68.42 ms | **3.01 ms** / 6.62 ms | 🔴 7.23× slower | **14.20× faster** | **1.96× faster** |\r\n| `echoClassList` (`AllNullableTypes` ×100) | 24.98 ms | 717.45 ms / 936.56 ms | **35.67 ms** / 58.50 ms | 🔴 28.72× slower | **20.11× faster** | **0.70×** (parity) |\r\n| `echoClassList` (`AllNullableTypes` ×1000) | 431.27 ms | 8,006.16 ms / 9,503.80 ms | **338.73 ms** / 421.96 ms | 🔴 18.56× slower | **23.64× faster** | **1.27× faster** |\r\n| `echoIntList` (×10) | 103.50 µs | 188.40 µs / 390.80 µs | **14.50 µs** / 17.00 µs | 🔴 1.82× slower | **12.99× faster** | **7.14× faster** |\r\n| `echoIntList` (×100) | 311.00 µs | 1.61 ms / 4.48 ms | **72.33 µs** / 129.33 µs | 🔴 5.18× slower | **22.26× faster** | **4.30× faster** |\r\n| `echoIntList` (×1000) | 1.06 ms | 24.75 ms / 41.37 ms | **705.00 µs** / 1.72 ms | 🔴 23.33× slower | **35.11× faster** | **1.50× faster** |\r\n| `echoIntList` (×10000) | 9.77 ms | 258.70 ms / 330.16 ms | **7.37 ms** / 14.15 ms | 🔴 26.48× slower | **35.12× faster** | **1.33× faster** |\r\n| `echoIntMap` (×1000) | 2.53 ms | 41.48 ms / 71.02 ms | **1.56 ms** / 2.88 ms | 🔴 16.40× slower | **26.63× faster** | **1.62× faster** |\r\n| `callFlutterEchoClassList` (×100) | 92.82 ms | 1,577.38 ms / 1,764.70 ms | **69.23 ms** / 106.86 ms | 🔴 16.99× slower | **22.78× faster** | **1.34× faster** |\r\n\r\n\u0026nbsp;\r\n\r\n---\r\n\r\n## 3\\. Pre-Optimization `objects` Baseline (`comparison_benchmarks.dart`)\r\n\r\nBefore the Phase 1 object-graph fixes (when `objects` mode also performed uncached `JClass.forName` lookups on every call and element-by-element byte buffer copies), the original `comparison_benchmarks.dart` workloads measured in [baseline\\_android\\_release.log](file:///Users/tarrinneal/.gemini/jetski/brain/b230b33f-5257-469a-98b7-0ebfb02a2fca/scratch/baseline_android_release.log) and [baseline\\_macos.log](file:///Users/tarrinneal/.gemini/jetski/brain/b230b33f-5257-469a-98b7-0ebfb02a2fca/scratch/baseline_macos.log) showed even larger gaps:\r\n\r\n\u0026nbsp;\r\n\r\n| Legacy Workload (15-object list of `AllNullableTypes`) | 1\\. Platform Channels | 2\\. Original `objects` (Pre-Phase 1\\) | 3\\. Phase 1 `objects` | 4\\. `hybrid` | Total Speedup (`hybrid` vs. Original `objects`) |\r\n| :---- | ----: | ----: | ----: | ----: | ----: |\r\n| **Android Host `echoClassList` (×15)** | 11.0 ms | 593.0 ms | 64.2 ms | **4.5 ms** | **131.8× faster** |\r\n| **Android Flutter `callFlutterEchoClassList` (×15)** | 11.0 ms | 1,485.0 ms | 236.6 ms | **10.4 ms** | **142.8× faster** |\r\n| **macOS Host `echoClassList` (×15)** | 16.0 ms | 176.0 ms | 21.8 ms | **2.4 ms** | **73.3× faster** |\r\n| **macOS Flutter `callFlutterEchoClassList` (×15)** | 53.0 ms | 294.0 ms | 243.1 ms | **4.9 ms** | **60.0× faster** |\r\n\r\n\u0026nbsp;\r\n\r\n---\r\n\r\n## 4\\. Summary of Key Takeaways\r\n\r\n1. **Platform Channels → Native Interop (`objects`):**  \r\n   - Delivered **36×–3,355×** lower latency on `noop` and scalar calls by replacing asynchronous platform channel messages with synchronous JNI/FFI calls.  \r\n   - However, even *with* Phase 1 optimizations (cached `JClass`, bulk `JByteBuffer`, pre-sized `JArrayList`), `objects` mode remained **5×–33× slower** than Platform Channels on complex data classes and collections (`1,482.94 ms` on macOS and `8,006.16 ms` on Android for 1,000 `AllNullableTypes` objects) because every field and collection element still crossed the JNI/FFI boundary individually.  \r\n2. **Native Interop (`objects`) → Native Interop (`hybrid`):**  \r\n   - Preserves **100% of the scalar/primitive/string/typed-data speedups** of `objects` mode (`0.20 µs` `noop` on both macOS and Android).  \r\n   - Speeds up data class and collection workloads by **7.5×–49.8×** over Phase 1 `objects` mode (and **60×–143×** over the original unoptimized `objects` mode) by serializing complex payloads into a single `StandardMessageCodec` byte buffer that crosses JNI/FFI in **1 call**.  \r\n   - Outperforms **Platform Channels** across both simple and complex workloads:  \r\n     - **36×–3,355× faster** on scalars and `noop`  \r\n     - **11.6×–56.7× faster** on strings  \r\n     - **1.33×–10.06× faster** on `List\u003cint\u003e` and `Map\u003cint, int\u003e` collections  \r\n     - **1.27×–2.86× faster** on deeply nested `AllNullableTypes` data classes\r\n\r\n\u0026nbsp;"
    },
    {
      "commit": "3b97f5696cbc139d3eec38a7f9b4b42981658cf5",
      "tree": "ad590c451adabfeb337dd7d0ea7713e542256da1",
      "parents": [
        "13be8f6936af051c4fdb35929f5d255339ef90a5"
      ],
      "author": {
        "name": "Kate Lovett",
        "email": "katelovett@google.com",
        "time": "Mon Nov 09 18:30:07 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 00:30:07 2026 +0000"
      },
      "message": "[ci] Fix release workflows (#13611)\n\n#13581 broke release workflows\n\nBecause labeler.yml runs on workflow_run: [requested, completed], whenever a normal PR triggers the requested event, its job-level if: evaluates to false and posts a triage check-run with conclusion: skipped onto main HEAD. Since the Wait on all tests step in release.yml sets allowed-conclusions: success,neutral, wait-on-check-action fails as soon as a triage: skipped check lands on that commit.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "13be8f6936af051c4fdb35929f5d255339ef90a5",
      "tree": "2bb49dbd86ed339407b8e0321034cc87f047c1f0",
      "parents": [
        "59b7e185598c193e1b86d2f221ff47ac6d7725f5"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Mon Nov 09 15:11:07 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 23:11:07 2026 +0000"
      },
      "message": "[pigeon] Fix standalone Native Interop @FlutterApi issues (#13609)\n\nSplit out from https://github.com/flutter/packages/pull/13576 per review. These are non-breaking fixes that can land on 29.x ahead of the 30.0.0 multi-engine changes.\r\n\r\n- [dart] Prefixes the internal `_\u003cApi\u003eRegistrar` members (`dartApi`, `register`) with `pigeonVar_`. This means `@FlutterApi` methods named `register` or `dartApi` no longer collide with the JNIgen interface when `useJni` is enabled, so those names are no longer reserved.\r\n- [dart] `\u003cFlutterApi\u003e.implement` now defaults `name` to the default instance name and treats an empty `name` as the default. Previously it registered under `\u0027\u0027`, which lookups never matched.\r\n- Pins `objective_c` to `\u003c9.6.3` in the test packages and the native interop example app, to work around a debug-mode object validity check bug on the iOS simulator (https://github.com/dart-lang/native/pull/3788).\r\n\r\nwork towards https://github.com/flutter/flutter/issues/195877\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "59b7e185598c193e1b86d2f221ff47ac6d7725f5",
      "tree": "0f50163b18f0d43c7f37dfa2bc26904e36269750",
      "parents": [
        "c48fa010198122a76f718f8b13b673b3b4b4b3b2"
      ],
      "author": {
        "name": "Maurice Parrish",
        "email": "10687576+bparrishMines@users.noreply.github.com",
        "time": "Mon Nov 09 15:43:06 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 20:43:06 2026 +0000"
      },
      "message": "[cross_file_web] Adds support to instantiate the web PlatformXFile without needing to import web apis (#13395)\n\nAdds a `fromBytes` to `WebScopedStorageXFileCreationParams` so `XFile` can be instantiated without needing to import web APIs like `fromBlob`.\r\n\r\nAdds a `cross_file_web_safe.dart` library that imports `web_scoped_storage_cross_file_safe.dart` when not compiling on web.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "c48fa010198122a76f718f8b13b673b3b4b4b3b2",
      "tree": "55db279889bc319cf06cfd24fb6bc86408cb8cdb",
      "parents": [
        "cd19277c52a4cee81aea53e36ad40750abc633f4"
      ],
      "author": {
        "name": "Flutter GitHub Bot",
        "email": "fluttergithubbot@gmail.com",
        "time": "Mon Nov 09 12:37:09 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 20:37:09 2026 +0000"
      },
      "message": "Sync release-go_router-18.1.4 to main (#13606)\n\nThis automated PR syncs the changes from the release branch release-go_router-18.1.4 back to the main branch."
    },
    {
      "commit": "cd19277c52a4cee81aea53e36ad40750abc633f4",
      "tree": "10ffe3d73926d836d23eea11d9e8b83c6073ef1e",
      "parents": [
        "bf4ce9eea586eeadc13c9fc37bed44392d58a2cc"
      ],
      "author": {
        "name": "Flutter GitHub Bot",
        "email": "fluttergithubbot@gmail.com",
        "time": "Mon Nov 09 12:37:05 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 20:37:05 2026 +0000"
      },
      "message": "Sync release-material_ui-1.11.0 to main (#13605)\n\nThis automated PR syncs the changes from the release branch release-material_ui-1.11.0 back to the main branch."
    },
    {
      "commit": "bf4ce9eea586eeadc13c9fc37bed44392d58a2cc",
      "tree": "9ac3b9f8f1d0609daba0592a9ad4bc58db1b2b64",
      "parents": [
        "9c7676bd6c4c972347136f5831ee2ff294c533cd"
      ],
      "author": {
        "name": "Sigurd Meldgaard",
        "email": "sigurdm@google.com",
        "time": "Mon Nov 09 20:01:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 19:01:38 2026 +0000"
      },
      "message": "[vector_graphics_compiler] Resolve Flutter artifact cache via package:cli_util (#13252)\n\nResolves the Flutter artifact cache directory (`\u003cflutter\u003e/bin/cache`) via `package:cli_util`\u0027s `sdkPath` when `Platform.resolvedExecutable` is not `flutter_tester`.\n\nWhen `vector_graphics_compiler` is compiled to a standalone AOT executable (for example via `dart install vector_graphics_compiler` or `dart run vector_graphics_compiler@`), `Platform.resolvedExecutable` is the `vector_graphics_compiler` binary itself rather than `\u003cflutter\u003e/bin/cache/dart-sdk/bin/dart`, which previously prevented `initializePathOpsFromFlutterCache` and `initializeTessellatorFromFlutterCache` from finding the engine dynamic libraries.\n\nPart of https://github.com/dart-lang/sdk/issues/63210\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "9c7676bd6c4c972347136f5831ee2ff294c533cd",
      "tree": "94019095f778be6b7f94c5d74eaa224f6c76ca71",
      "parents": [
        "3d61a705d15134d65fc3bf2e8ee2ca33c040c741"
      ],
      "author": {
        "name": "Kate Lovett",
        "email": "katelovett@google.com",
        "time": "Mon Nov 09 12:19:34 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 18:19:34 2026 +0000"
      },
      "message": "[ci] Remove `pull_request_target` workflows (#13581)\n\nRemoves the remaining `pull_request_target` triggers in `.github/workflows/`:\n\n- Replaces `pull_request_label.yml` with `labeler-trigger.yml` (`pull_request`) and `labeler.yml` (`workflow_run`), matching https://github.com/flutter/flutter/pull/195536.\n- Removes `remove_cicd.yml`, since `CICD` label management is now handled in Cocoon (matching https://github.com/flutter/flutter/pull/189087).\n\nPart of https://github.com/flutter/flutter/issues/193185\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "3d61a705d15134d65fc3bf2e8ee2ca33c040c741",
      "tree": "d31ff189f8d852d45d35f21ab856fc16277961b2",
      "parents": [
        "565c6573861992fbd225ca138bbc2d3b8aeb5d00"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Mon Nov 09 13:01:33 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 18:01:33 2026 +0000"
      },
      "message": "Roll Flutter from acade0f6b532 to d46382112aa6 (1 revision) (#13601)\n\nhttps://github.com/flutter/flutter/compare/acade0f6b532...d46382112aa6\n\n2026-11-09 engine-flutter-autoroll@skia.org Roll Packages from 63881f9b118b to 565c65738619 (10 revisions) (flutter/flutter#196210)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC quncheng@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "565c6573861992fbd225ca138bbc2d3b8aeb5d00",
      "tree": "e99b0443fdc08f7d75f06517cad37e5f9d6f1391",
      "parents": [
        "fb8fad441c233f6f01f5af9495a669587c95730a"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Sun Nov 08 10:51:29 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 08 15:51:29 2026 +0000"
      },
      "message": "Roll Flutter from e36b37012875 to acade0f6b532 (1 revision) (#13590)\n\nhttps://github.com/flutter/flutter/compare/e36b37012875...acade0f6b532\n\n2026-11-08 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from Sf2yvdTiFXAKkfLkD... to BOgXtIYxLYcCkRou2... (flutter/flutter#196181)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC elliottbrooks@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "fb8fad441c233f6f01f5af9495a669587c95730a",
      "tree": "1ef4476aa8b00098fefed0a6d8ec418af2c14cb9",
      "parents": [
        "131c9b04655105c8202d54d2044edb6585c2b1ee"
      ],
      "author": {
        "name": "Mairramer",
        "email": "50643541+Mairramer@users.noreply.github.com",
        "time": "Sat Nov 07 14:52:38 2026 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 07 17:52:38 2026 +0000"
      },
      "message": "[material_ui] Fix DropdownMenu losing text cursor when re-enabled (#13179)\n\nFixes https://github.com/flutter/flutter/issues/152478\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "131c9b04655105c8202d54d2044edb6585c2b1ee",
      "tree": "6899a00962bbed888d63ad441b43f1f703b8915e",
      "parents": [
        "cd99c3d58b41cbab4c8520d8f518a7a4e41e8634"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Sat Nov 07 10:52:33 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 07 15:52:33 2026 +0000"
      },
      "message": "Roll Flutter from 09175cdeac89 to e36b37012875 (22 revisions) (#13586)\n\nhttps://github.com/flutter/flutter/compare/09175cdeac89...e36b37012875\n\n2026-11-07 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from KIc0XZbhLmvDpTluZ... to Sf2yvdTiFXAKkfLkD... (flutter/flutter#196160)\n2026-11-07 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#196155)\n2026-11-07 31859944+LongCatIsLooong@users.noreply.github.com [iOS a11y] Use a real `UIScrollView` as a11y scrollable container (flutter/flutter#195731)\n2026-11-07 dbebawy@users.noreply.github.com Add ParagraphStyle.hyphenCharacter to dart:ui (flutter/flutter#195345)\n2026-11-07 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#196143)\n2026-11-06 robert.ancell@canonical.com [Linux] Fix layer position when compositing without glBlitFramebuffer (flutter/flutter#196083)\n2026-11-06 valentin.haudiquet@canonical.com Add support for riscv64 desktop linux engine (flutter/flutter#178712)\n2026-11-06 11473691+YeungKC@users.noreply.github.com Add ResizeImagePolicy.cover (flutter/flutter#194665)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from f533d4034900 to b11315d0a096 (6 revisions) (flutter/flutter#196138)\n2026-11-06 chris@bracken.jp iOS: Remove dead code/unused imports from FlutterPlatformViewsController (flutter/flutter#196084)\n2026-11-06 jacksongardner@google.com Replace pull_request_target workflows with pull_request + workflow_run (flutter/flutter#195536)\n2026-11-06 154381524+flutteractionsbot@users.noreply.github.com [master] Update Flutter DEPS to Dart 3b174b7217fe09b21da836ea623932b5f041b091 (flutter/flutter#196004)\n2026-11-06 awolff@google.com Fix android_hardware_smoke_test retry mechanisms (flutter/flutter#195708)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from 452b9c1e5db6 to f533d4034900 (1 revision) (flutter/flutter#196129)\n2026-11-06 bkonyi@google.com [flutter_tools] Use `ErrorHandlingFileSystem.deleteIfExists` for `IOSCoreDeviceControl` temp directory cleanup (flutter/flutter#195913)\n2026-11-06 47866232+chunhtai@users.noreply.github.com Adds guideline tests to flutter create samples (flutter/flutter#195827)\n2026-11-06 kevmoo@users.noreply.github.com refactor(flutter_tools): unify OptionDescriptor identity and addTo (flutter/flutter#196076)\n2026-11-06 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#196114)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from 5ce64e63a0e7 to 452b9c1e5db6 (5 revisions) (flutter/flutter#196111)\n2026-11-06 matoshri1420@gmail.com Add PlatformDispatcher.onAlwaysUse24HourFormatChanged callback (flutter/flutter#194670)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Packages from 04781623f406 to 63881f9b118b (10 revisions) (flutter/flutter#196108)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from 793b8ac73d4b to 5ce64e63a0e7 (4 revisions) (flutter/flutter#196107)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC elliottbrooks@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "cd99c3d58b41cbab4c8520d8f518a7a4e41e8634",
      "tree": "f0085dea7a83df9357be46599fa674682f2a7a4f",
      "parents": [
        "249f37d9db291cf41c579c6093b1a296e401be21"
      ],
      "author": {
        "name": "Qun Cheng",
        "email": "36861262+QuncCccccc@users.noreply.github.com",
        "time": "Fri Nov 06 16:25:38 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 07 00:25:38 2026 +0000"
      },
      "message": "[material_ui] Add Material motion springs (#13338)\n\nAdds `Springs`, a set of `SpringDescription` constants created from the Material 3 Expressive motion tokens (`md.sys.motion.spring.*`).\r\n\r\nMaterial spring tokens define a stiffness and a damping ratio, but no mass. Each constant uses a mass of 1.0, so it\u0027s the same as `SpringDescription.withDampingRatio` with the token\u0027s values. They\u0027re generated by a new `MotionTemplateM3E` in `gen_defaults`.\r\n\r\nThis PR doesn\u0027t change any component.\r\nFixes https://github.com/flutter/flutter/issues/184932\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "249f37d9db291cf41c579c6093b1a296e401be21",
      "tree": "619d2a1747cf6e2a33c01232b73308b4d0bade84",
      "parents": [
        "fc8b0696b38567a8e54a36b95129ce086c63ba04"
      ],
      "author": {
        "name": "Alex Talebi",
        "email": "31685655+SalehTZ@users.noreply.github.com",
        "time": "Sat Nov 07 02:38:10 2026 +0330"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 23:08:10 2026 +0000"
      },
      "message": "[material_ui] Paint the active RoundedRectSliderTrackShape segment on top in RTL (#13225)\n\n`RoundedRectSliderTrackShape` paints its two segments in a fixed order: the right-hand segment first, then the left-hand one. Both segments extend past the thumb center by half of the track height, so the segment painted last has its rounded end drawn over the other one.\r\n\r\nIn LTR the left-hand segment is the active one, so the active segment\u0027s rounded end is on top. In RTL the left-hand segment is the inactive one, so the inactive segment\u0027s rounded end was painted over the active segment, which left a pale sliver beside the thumb. This is only visible when the track is thicker than the thumb.\r\n\r\nThis PR paints the inactive segment first in both text directions. The LTR paint order is unchanged. The rounded `RangeSlider` track already paints its active segment last in both directions.\r\n\r\nBefore and after, LTR on top and RTL below, with `trackHeight: 24`:\r\n\r\n\u003cdetails open\u003e\r\n\u003csummary\u003eScreenshots demonstration\u003c/summary\u003e\r\n\r\n| State | Direction | Screenshot |\r\n| :---: | :---: | :---: |\r\n| **Before** | \u003ckbd\u003eLTR ➔\u003c/kbd\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003ckbd\u003e⬅ RTL\u003c/kbd\u003e | \u003cimg width\u003d\"1200\" height\u003d\"320\" alt\u003d\"1_rounded_BEFORE\" src\u003d\"https://github.com/user-attachments/assets/8a4f0460-657c-4d53-8e1f-1534a850bcb1\" /\u003e |\r\n| **After** | \u003ckbd\u003eLTR ➔\u003c/kbd\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003ckbd\u003e⬅ RTL\u003c/kbd\u003e | \u003cimg width\u003d\"1200\" height\u003d\"320\" alt\u003d\"1_rounded_AFTER\" src\u003d\"https://github.com/user-attachments/assets/25ec473c-a9f9-4c27-9380-7a2c728183c4\" /\u003e |\r\n\r\n\u003c/details\u003e\r\n\r\nI added an RTL case to the existing `RoundedRectSliderTrackShape` test group. It checks the exact track rects and their paint order, and it fails without the fix.\r\n\r\nFixes https://github.com/flutter/flutter/issues/194278\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "fc8b0696b38567a8e54a36b95129ce086c63ba04",
      "tree": "25425b0e9ecdc4f0a72189f0ad2ca115d17f4d85",
      "parents": [
        "2a9ec69175d1fe02fdb70b5c56d1f4101f6196e1"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Fri Nov 06 13:37:59 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 21:37:59 2026 +0000"
      },
      "message": "[pigeon] Replace Experimental with Preview (#13579)\n\nIt\u0027s a preview."
    },
    {
      "commit": "2a9ec69175d1fe02fdb70b5c56d1f4101f6196e1",
      "tree": "a5fdb51bb0738e07a8d9b3f4dcc70b7418a44428",
      "parents": [
        "62099ac8842878f4ec7d065b1bec845a75e0ebb8"
      ],
      "author": {
        "name": "Hamza Shahid",
        "email": "hamzabutthb553.hb@gmail.com",
        "time": "Sat Nov 07 02:27:17 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 21:27:17 2026 +0000"
      },
      "message": "[material_ui] Fix minimum width for Material 3 primary tab indicator (#13322)\n\nThis change gives the default Material 3 primary `TabBar` indicator a minimum width of 24dp, centered on the selected label, as specified by the [Material 3 tabs spec](https://m3.material.io/components/tabs/specs). It adds a regression test for a short tab label. Custom indicators and secondary tabs retain their existing sizing behavior.\r\n\r\npart of flutter/flutter#194716\r\n\r\n## Testing\r\n\r\n- `dart run script/tool/bin/flutter_plugin_tools.dart test --packages\u003dmaterial_ui` — passed for all four targets: `material_ui`, its example, the accessibility assessments app, and `gen_defaults`.\r\n- `flutter test test/tabs_test.dart` — passed (204 tests), including the 24dp regression test.\r\n- `flutter analyze lib/src/tabs.dart test/tabs_test.dart` — no issues found.\r\n- `dart format lib/src/tabs.dart test/tabs_test.dart` — completed; no formatting changes were needed.\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "62099ac8842878f4ec7d065b1bec845a75e0ebb8",
      "tree": "3c76555f238947aa6316a68a31f9ff9c1d953850",
      "parents": [
        "3254d60d6c10dd901cf45dfda001f142b5db7d10"
      ],
      "author": {
        "name": "Nikhil Kukreja",
        "email": "45616602+NikhilKukreja26@users.noreply.github.com",
        "time": "Sat Nov 07 02:13:22 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 20:43:22 2026 +0000"
      },
      "message": "[material_ui] Dispose drag-end CurvedAnimation in modal bottom sheet (#13167)\n\nFixes https://github.com/flutter/flutter/issues/193944\r\n\r\n`_ModalBottomSheetState.handleDragEnd` rebinds the sheet animation to a new\r\n`CurvedAnimation` on every drag end but never disposed the previous one, so its\r\nlisteners accumulated on the route animation. This tracks the drag-end\r\n`CurvedAnimation` and disposes it in `handleDragStart`, when it is replaced, and\r\nin `dispose`. Adds a regression test that fails before the fix.\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "3254d60d6c10dd901cf45dfda001f142b5db7d10",
      "tree": "bd974fb1598cc6f2c3c1d51f88695a571b98eb07",
      "parents": [
        "2f2f11786009386662b4bd47bfa96390e9f713fc"
      ],
      "author": {
        "name": "Khushal Singh Rao",
        "email": "mr.khushalrao@gmail.com",
        "time": "Fri Nov 06 23:25:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 17:55:58 2026 +0000"
      },
      "message": "[camera_web] Re: Support for camera stream on web (#7950)\n\n## Description\r\n\r\nAdds image streaming to `camera_web`, so `CameraController.startImageStream` works on web. `CameraPlugin.supportsImageStreaming()` now returns `true`, and `onStreamedFrameAvailable` returns a stream of RGBA `CameraImageData` frames.\r\n\r\n### How frames are captured\r\n\r\nThere are two capture paths, chosen per camera when it is created:\r\n\r\n| Browser support | Path | Frame source |\r\n|---|---|---|\r\n| `MediaStreamTrackProcessor` available (Chromium-based browsers) | `MediaStreamTrackProcessor` → `ReadableStream\u003cVideoFrame\u003e` → `VideoFrame.copyTo(format: \u0027RGBA\u0027)` | Every frame the camera track produces (`maxBufferSize: 1`, so the processor keeps only the newest frame when the consumer falls behind) |\r\n| Otherwise (e.g. Firefox, Safari) | `requestAnimationFrame` loop → draw the `\u003cvideo\u003e` element to an `OffscreenCanvas` (or a regular canvas if `OffscreenCanvas` is unavailable) → `getImageData` | Sampled at a 60 fps target |\r\n\r\nBoth paths emit a single-plane RGBA image (`bytesPerPixel: 4`, `bytesPerRow` set to the stride the browser reports). `format` is `ImageFormatGroup.unknown` with `raw: \u0027rgba8888\u0027`, because the platform interface has no RGBA group yet (see TODO, flutter/flutter#151193).\r\n\r\n### Frame ownership\r\n\r\nEvery emitted frame has its own buffer. The `copyTo` destination is allocated per frame, and `JSUint8Array.toDart` returns a view of it, not a second copy. This matches the native implementations: a consumer can keep a `CameraImage` past the callback, for example across an `await` or when sending it to an isolate, and later frames won\u0027t change its bytes.\r\n\r\nAn earlier revision reused one buffer across frames. I benchmarked both approaches before switching (Chrome 155 with the fake camera; 640×480 to 1080p at 30, 60 and 90 fps; 3 runs per case):\r\n\r\n- **Throughput:** identical up to 60 fps. At 1080p90, buffer reuse was +1.3%, but the fake source itself tops out at about 85 fps there.\r\n- **CPU and GC:** buffer reuse used about 45–50% less renderer CPU and avoided the GC caused by per-frame allocation. GC pauses with per-frame buffers were at most 4.7 ms, there were no long tasks, and memory did not grow over time.\r\n- **Correctness:** with buffer reuse, 100% of frames held for 50 ms or longer had been overwritten by later frames (70/70). With per-frame buffers, 0/70 were.\r\n\r\nA buffer pool would need an explicit release API on the platform interface, so I\u0027ve left it as a possible follow-up.\r\n\r\n### Lifecycle and errors\r\n\r\n- The frame stream is a broadcast stream. Capture starts when the first listener subscribes and stops when the last one cancels. `Camera.dispose()` now closes the stream.\r\n- A `VideoFrame` is always closed after it is copied, including on errors. The reader lock is released when the loop ends.\r\n- Frames that can\u0027t be copied are skipped, and the stream keeps going (`unableToCloneFrame`, `missingPlaneLayout`). The stream closes without an error if the track reader closes (`videoTrackReaderClosed`).\r\n- Any other error is emitted on the stream before it closes. In `onStreamedFrameAvailable`, a `CameraWebException` is reported as a camera error event and rethrown as a `PlatformException`.\r\n- New `CameraErrorCode`s: `noVideoTrack`, `videoTrackReaderClosed`, `videoTrackReaderNotInitialized`, `cameraFrameDimensionsZero`, `unableToCloneFrame`, `missingPlaneLayout`.\r\n\r\n### Refactors in `CameraService`\r\n\r\n- The `DOMException` → `CameraWebException` mapping now lives in `_domExceptionToCameraWebException`, shared by `getMediaStreamForOptions` and the new frame-stream methods. `DOMException`s are now detected with `isA\u003cDOMException\u003e()` instead of `on DOMException`, so the check behaves the same under dart2wasm.\r\n- New methods so the stream loop can be mocked in tests: `hasMediaStreamTrackProcessor`, `hasPropertyOffScreenCanvas`, `takeFrame`, `getMediaStreamVideoTrack`, `getMediaStreamTrackReader`, `readVideoTrack`, `copyVideoFrameToBufferAndGetStride`, `getCameraImageData`.\r\n\r\n### Known limitations / follow-ups\r\n\r\n- **No frame-rate option yet.** The fallback path targets 60 fps, and the `MediaStreamTrackProcessor` path delivers whatever the track produces. `CameraImageStreamOptions` has no fps field (TODO, flutter/flutter#176148).\r\n- **No RGBA format group** in `ImageFormatGroup` (flutter/flutter#151193).\r\n- **Crop-and-scale resolutions aren\u0027t scaled on the `MediaStreamTrackProcessor` path.** When Chrome crops and scales the track to fit the requested resolution (e.g. `ResolutionPreset.low` \u003d 320×240 on a 1080p camera), the `VideoFrame`\u0027s `visibleRect` is the crop (1440×1080), and only `displayWidth/displayHeight` are 320×240. Frames are copied at `visibleRect` size, so they can be larger than `previewSize`. Scaling to the display size could be a follow-up.\r\n\r\nFixes https://github.com/flutter/flutter/issues/92460\r\n\r\n### Testing\r\n\r\n- New integration tests, all passing in Chrome (`flutter drive -d chrome` for each file in `example/integration_test/`):\r\n  - `camera_web_stream_test.dart`: `supportsImageStreaming`, `onStreamedFrameAvailable`, and the `PlatformException` mapping.\r\n  - `camera_test.dart`, in the `cameraFrameStream` group:\r\n    - emitting frames;\r\n    - closing with an error when reading a frame or building `CameraImageData` fails;\r\n    - closing quietly when the reader closes;\r\n    - closing on dispose;\r\n    - continuing after `unableToCloneFrame`;\r\n    - the fallback path\u0027s frame-rate target and RGBA byte length;\r\n    - fallback errors.\r\n  - `camera_service_test.dart`: each new `CameraService` method, including its error cases.\r\n  - `camera_error_code_test.dart`: the new error codes.\r\n- Manually tested with `startImageStream` in Chrome using a fake camera (`--use-file-for-fake-video-capture`) at 640×480 to 1080p and 30–90 fps. That covered frame dimensions, stride and byte length, stopping and restarting the stream, background tabs, and dispose.\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "2f2f11786009386662b4bd47bfa96390e9f713fc",
      "tree": "6a8e9fca45930ef55a2e0492354153b1e1a47a93",
      "parents": [
        "63881f9b118bc33792b338e7908f263ab936a6c4"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Fri Nov 06 10:46:07 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 15:46:07 2026 +0000"
      },
      "message": "Roll Flutter from 3623d2d34543 to 09175cdeac89 (61 revisions) (#13578)\n\nRoll Flutter from 3623d2d34543 to 09175cdeac89 (61 revisions)\n\nhttps://github.com/flutter/flutter/compare/3623d2d34543...09175cdeac89\n\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from ae35b7b2221f to 793b8ac73d4b (3 revisions) (flutter/flutter#196091)\n2026-11-06 mdebbar@google.com [web] Rasterize scenes at the size passed to `FlutterView.render` (flutter/flutter#196052)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from 4aa043a81e0c to ae35b7b2221f (1 revision) (flutter/flutter#196086)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from Fqe3UlLwAohsPbsCS... to KIc0XZbhLmvDpTluZ... (flutter/flutter#196085)\n2026-11-06 11473691+YeungKC@users.noreply.github.com Allow a zero scale change in InteractiveViewer (flutter/flutter#194949)\n2026-11-06 engine-flutter-autoroll@skia.org Roll Skia from dd5c2553a856 to 4aa043a81e0c (2 revisions) (flutter/flutter#196079)\n2026-11-06 1961493+harryterkelsen@users.noreply.github.com [web] Keep ImageFilter.blur bounds in equality and description (flutter/flutter#196013)\n2026-11-06 chris@bracken.jp iOS: Remove unused PlatformViewIOS setup from FlutterPlatformViewsTest (flutter/flutter#196033)\n2026-11-06 magder@google.com Serialize LoggerTests that mutate the shared Logger (flutter/flutter#196028)\n2026-11-06 11473691+YeungKC@users.noreply.github.com Use reverseDuration for the AnimatedCrossFade size animation (flutter/flutter#194860)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Skia from a5aacd103e68 to dd5c2553a856 (8 revisions) (flutter/flutter#196073)\n2026-11-05 11473691+YeungKC@users.noreply.github.com Fix ListWheelScrollView null check error when it reads itemIndex before content dimensions are set (flutter/flutter#194859)\n2026-11-05 11473691+YeungKC@users.noreply.github.com Allow zero cross axis extent in SliverGridDelegateWithMaxCrossAxisExtent (flutter/flutter#194858)\n2026-11-05 154381524+flutteractionsbot@users.noreply.github.com Revert: Allow color delta tolerance in in-memory fuzzy image comparator (flutter/flutter#196067)\n2026-11-05 154381524+flutteractionsbot@users.noreply.github.com Revert: Mitigate snapshot race in 3D transform test by reducing loop density (flutter/flutter#196066)\n2026-11-05 11473691+YeungKC@users.noreply.github.com Delegate createStream in ResizeImage and ScrollAwareImageProvider (flutter/flutter#194756)\n2026-11-05 louisehsu@google.com [iOS] Introduce FlutterShell and move thread host and profiler (flutter/flutter#195388)\n2026-11-05 1961493+harryterkelsen@users.noreply.github.com [web] Support FragmentShader.getImageSampler on CanvasKit and Skwasm (flutter/flutter#195854)\n2026-11-05 30870216+gaaclarke@users.noreply.github.com Deprecates setFloat API (flutter/flutter#195505)\n2026-11-05 bkonyi@google.com [flutter_tools] Remove public GlobalToolContext and globals from runner (flutter/flutter#195561)\n2026-11-05 34871572+gmackall@users.noreply.github.com Defer TLHC PlatformViewWrapper frame post and avoid initial 1x1 buffer resize (flutter/flutter#195861)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Skia from b5abed66da86 to a5aacd103e68 (17 revisions) (flutter/flutter#196054)\n2026-11-05 30870216+gaaclarke@users.noreply.github.com Made `FlutterWindowControllerSizeTest.SizedToContentNotResizable` more robust (flutter/flutter#195845)\n2026-11-05 katelovett@google.com Update docs for contributor ladder (flutter/flutter#196011)\n2026-11-05 65884233+jpohhhh@users.noreply.github.com [Impeller] Use the transfer stage for the Vulkan readback barrier (flutter/flutter#194991)\n2026-11-05 magder@google.com Remove Mac mac_unopt builder (flutter/flutter#196027)\n2026-11-05 jesswon@google.com Updated Instructions for Determining Gradle Version for `gradle_dists` in CIPD (flutter/flutter#193310)\n2026-11-05 magder@google.com Move ios_app_with_extensions_test into the tool integration shard (flutter/flutter#195609)\n2026-11-05 1961493+harryterkelsen@users.noreply.github.com [web] Respect Uint8List view bounds when detecting animated WebP/GIF (flutter/flutter#196010)\n2026-11-05 okorohelijah@google.com Add platform_views_layout to build_tests so iOS/Android build breaks are caught in presubmit (flutter/flutter#192985)\n2026-11-05 bkonyi@google.com [flutter_tools] Detect macOS TCC permission crashes and provide diagnostic guidance (flutter/flutter#192432)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Packages from 670b30ed698a to 04781623f406 (15 revisions) (flutter/flutter#196047)\n2026-11-05 burak.karahan@mail.ru [web] Support Skwasm rendering without bitmap capture (flutter/flutter#195103)\n2026-11-05 me@molchanovia.dev [flutter_tools] Reland fix for local CanvasKit asset paths on Windows (flutter/flutter#195770)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Skia from f96be51af95d to b5abed66da86 (14 revisions) (flutter/flutter#196017)\n2026-11-05 magder@google.com Split chrome web engine test drone (flutter/flutter#195873)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Dart SDK from c9153304136a to 6623b84628f3 (1 revision) (flutter/flutter#196026)\n2026-11-05 engine-flutter-autoroll@skia.org Roll ICU from 4fe960221710 to a0ea93436c52 (6 revisions) (flutter/flutter#196025)\n2026-11-05 magder@google.com Add more guidance in README and AGENTS for contributing to flutter_tools (flutter/flutter#195998)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from p0HDXLISPIElJfSz7... to Fqe3UlLwAohsPbsCS... (flutter/flutter#196019)\n2026-11-05 engine-flutter-autoroll@skia.org Roll Dart SDK from e362a23e9738 to c9153304136a (18 revisions) (flutter/flutter#196014)\n2026-11-05 coldpalelight@gmail.com [Impeller] Fix dilation input bounds when clipping saveLayers (flutter/flutter#195652)\n2026-11-05 36861262+QuncCccccc@users.noreply.github.com Add `variantOf` to the M3E migration checklist (flutter/flutter#195099)\n2026-11-05 bkonyi@google.com [flutter_tools] Eliminate globals from remaining subsystem files (flutter/flutter#195555)\n2026-11-05 suryak2662@gmail.com Fix gap flipping when dragging variable height reorderable items (flutter/flutter#194478)\n2026-11-05 jhy03261997@gmail.com [A11y] Send un-merged SemanticsNodes in the same update that first references them (flutter/flutter#195829)\n..."
    },
    {
      "commit": "63881f9b118bc33792b338e7908f263ab936a6c4",
      "tree": "1eec143dc0d6cb173f30e7385423e3a924d0d6d2",
      "parents": [
        "afe281a91ff21f3c3b1b5f65cfdf2f7cec6d178b"
      ],
      "author": {
        "name": "Victor Sanni",
        "email": "victorsanniay@gmail.com",
        "time": "Thu Nov 05 16:54:15 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 06 00:54:15 2026 +0000"
      },
      "message": "[material_ui] Paint Dialog.fullscreen background color behind the keyboard (#13244)\n\nFound while investigating flutter/flutter#179482 (design: https://flutter.dev/go/ios-26-keyboard-bleed). Companion to #13242, which does the same for `Scaffold` persistent bottom sheets.\n\n`Dialog` builds `AnimatedPadding(viewInsets)` → `Material`, so when a text field inside a `Dialog.fullscreen` is focused, the \"fullscreen\" surface shrinks to the area above the keyboard and the `DialogRoute` barrier is what sits behind the keyboard. On iOS 26 the keyboard is translucent, so the dimmed route underneath shows through under the dialog instead of the dialog\u0027s color. Since `Dialog.fullscreen` also removes `viewInsets` from `child`, apps can\u0027t work around it from inside the dialog.\n\nFor `Dialog.fullscreen`, the `AnimatedPadding` and `MediaQuery.removeViewInsets` now sit inside the `Material`, so the surface keeps covering the whole screen while `child` is laid out above the keyboard exactly as before. Regular `Dialog`s are unchanged.\n\nPart of flutter/flutter#179482.\n\n## Before\n\n\u003cimg width\u003d\"402\" alt\u003d\"before: the dimmed route behind the dialog shows through the keyboard\" src\u003d\"https://raw.githubusercontent.com/victorsanni/packages/assets-fullscreen-dialog-keyboard/fullscreen_dialog_before.png\" /\u003e\n\n## After\n\n\u003cimg width\u003d\"402\" alt\u003d\"after: the dialog\u0027s surface continues behind the keyboard\" src\u003d\"https://raw.githubusercontent.com/victorsanni/packages/assets-fullscreen-dialog-keyboard/fullscreen_dialog_after.png\" /\u003e\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "afe281a91ff21f3c3b1b5f65cfdf2f7cec6d178b",
      "tree": "73985ea79642fd0e06549bcfba5f3ff52c689a97",
      "parents": [
        "aa134bb7f1332bb9cbecfb26ae2bf107ce7ab88d"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Thu Nov 05 15:58:09 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 23:58:09 2026 +0000"
      },
      "message": "[material_ui] Add tabBar/tab roles and expanded state semantics (#13176)\n\nExposes `SemanticsRole.tabBar` and `SemanticsRole.tab` on `NavigationRail` destinations (omitting the redundant `\"Tab i of n\"` `indexLabel` on web where `role\u003d\"tablist\"` natively computes set size, matching `TabBar` and `Tab`) and sets `Semantics(expanded: ...)` on `DrawerButtonIcon`, `EndDrawerButtonIcon`, and `CalendarDatePicker`\u0027s year/day mode toggle button so assistive technologies announce tab selection and expand/collapse states (WCAG 4.1.2).\n\nFixes https://github.com/flutter/flutter/issues/173052\nFixes https://github.com/flutter/flutter/issues/194904\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "aa134bb7f1332bb9cbecfb26ae2bf107ce7ab88d",
      "tree": "6944eb20a0c3cb4cefb864c7d32faa6593e60edb",
      "parents": [
        "22027c5601c3a7aa28586f8566c879475804cac5"
      ],
      "author": {
        "name": "Pranta Dutta",
        "email": "44747303+theprantadutta@users.noreply.github.com",
        "time": "Fri Nov 06 05:56:30 2026 +0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 23:56:30 2026 +0000"
      },
      "message": "[material_ui] Disable the DropdownButtonFormField decoration when the field is disabled (#13473)\n\n`DropdownButtonFormField` passes its `decoration` to `InputDecorator` through `DropdownButton`, but nothing set the decoration\u0027s `enabled`. `InputDecorator` only uses its disabled colors and borders, and only ignores hovering (`isHovering` checks `decoration.enabled`), when the decoration is disabled. So a field disabled with `enabled: false`, or with a null `onChanged`, kept its enabled border and fill and still changed color on hover. The selected item and the icon already turned grey, because `DropdownButton` styles those from its own enabled state.\n\nThe fix sets `enabled` on the decoration in `_DropdownButtonState.build` from the dropdown\u0027s own enabled state. `TextField` does the same before it builds its `InputDecorator`, so a disabled dropdown and a disabled text field in the same form now look alike. A decoration passed in with `enabled: false` stays disabled, as before.\n\n## Tests\n\nOne regression test in `dropdown_form_field_test.dart` checks the decoration that `InputDecorator` gets: enabled with an `onChanged`, disabled with `enabled: false`, and disabled with no `enabled` and a null `onChanged`. It fails on `main` and passes with the fix. `dropdown_form_field_test.dart`, `dropdown_test.dart` and `input_decorator_test.dart` all pass (724 tests), as does the `show_date_picker.2` example test, which is the example that uses `DropdownButtonFormField`.\n\nFixes flutter/flutter#195192\n\n## Pre-Review Checklist\n\nI used AI tooling while working on this, and reviewed and tested all of it myself.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "22027c5601c3a7aa28586f8566c879475804cac5",
      "tree": "940adb6c65445d366adfb6ea1e0ff466a95cb6f8",
      "parents": [
        "674067d350efeddc2ceeeb97c860c4cbb3d22292"
      ],
      "author": {
        "name": "muralikrishmt",
        "email": "mkmt@google.com",
        "time": "Fri Nov 06 04:24:52 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 22:54:52 2026 +0000"
      },
      "message": "[material_ui] Fix Switch throwing when first painted mid-animation (#13496)\n\n`_SwitchPainter` only initializes its pressed-state fields inside `paint()`. If the painter\u0027s first paint happens in an unusual animation state, those fields are read before they are ever written:\n\n| First paint happens… | `Switch` / `Switch.adaptive` on Android, Fuchsia, Linux, Windows | `Switch.adaptive` on iOS, macOS |\n|---|---|---|\n| while the press reaction is reversing | `LateInitializationError` (`_pressedThumbExtension`) | `Null check operator used on a null value` (`_pressedInactiveThumbRadius!`) |\n| during the toggle animation | OK | `Null check operator used on a null value` (`_pressedInactiveThumbRadius!`) |\n\nThis can happen, for example, when a `Switch.adaptive` in a `ListView`\u0027s cache extent (laid out but not painted) changes value and is scrolled into view during its toggle animation, or when a switch under `Opacity(0)` is long-pressed and becomes visible in `onChanged`.\n\nThis PR defaults `_pressedThumbExtension` to `0` and falls back to the unpressed thumb radii in the Cupertino branch, as the Material branch already does. Initializing `_pressedThumbExtension` alone (as suggested in the issue) is not enough, because the iOS/macOS null check error comes from `_pressedInactiveThumbRadius!`.\n\nTwo regression tests cover both triggers on all platforms (`TargetPlatformVariant.all()`). Without the fix, 8 of the 12 variants fail.\n\nFixes https://github.com/flutter/flutter/issues/179532\n\n%23%23 Pre-Review Checklist\n\nIf you need help, consider asking for advice on the %23hackers-new channel on [Discord].\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "674067d350efeddc2ceeeb97c860c4cbb3d22292",
      "tree": "406c388cb7e6931efb6894b1d6d9a68de85d577c",
      "parents": [
        "920c2eec29aab89b40e176b1a019fa29e933b4df"
      ],
      "author": {
        "name": "Elliott Brooks",
        "email": "21270878+elliette@users.noreply.github.com",
        "time": "Thu Nov 05 14:24:47 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 22:24:47 2026 +0000"
      },
      "message": "[various] Add engineIdentifier to fake plugin registrars  (#13574)\n\nflutter/flutter#195881 added a required engineIdentifier property to FlutterBaseRegistrar (iOS) and FlutterPluginRegistrar (macOS), which breaks compilation of the test-only registrar fakes and blocks the Flutter roll (#13569).\n\nImplement the property in each fake in a way that also compiles against stable, where the property does not exist yet.\n\nFixes https://github.com/flutter/flutter/issues/196065\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "920c2eec29aab89b40e176b1a019fa29e933b4df",
      "tree": "e57144e25f40a762156aaaf912a2050510c8db46",
      "parents": [
        "5b5c3b91026eef615bdc0949c6ed6e838a18f92b"
      ],
      "author": {
        "name": "Arif Özgün",
        "email": "60074989+arifozgun@users.noreply.github.com",
        "time": "Thu Nov 05 23:50:18 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 20:50:18 2026 +0000"
      },
      "message": "[google_sign_in] Allow GoogleSignIn-iOS 10 (#13306)\n\nWidens the `GoogleSignIn-iOS` requirement from `9.0.0..\u003c10.0.0` to `9.0.0..\u003c11.0.0` in both the Swift package and the podspec (`~\u003e 9.0` to `\u003e\u003d 9.0, \u003c 11.0`), so apps can resolve GoogleSignIn 10, which allows `gtm-session-fetcher` 4.x and 5.x.\n\nGoogleSignIn 10 requires iOS 15 and macOS 12, and SwiftPM rejects a package whose dependency needs a higher platform than the package declares. This raises the plugin minimums to iOS 15 / macOS 12 (matching Flutter 3.47), updates the macOS example deployment targets, and updates the `google_sign_in` README support table, following #13292.\n\nApps that also use firebase-ios-sdk 13 (no longer published to CocoaPods) need GoogleSignIn-iOS 10.1.0 or later, which includes google/GoogleSignIn-iOS#626 and widens App Check from 11.x to `11.0.0..\u003c13.0.0`. The range here admits 10.1.0.\n\nFixes https://github.com/flutter/flutter/issues/194435\n\n## Pre-Review Checklist\n\nVersioning: `google_sign_in` only changes its README (support table) and macOS example, so it\u0027s listed under NEXT without a version bump, as in #13292.\n\nTest exemption: manual dependency update with no plugin code changes. The existing native and integration tests run against GoogleSignIn 10 once SwiftPM or CocoaPods resolves it.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "5b5c3b91026eef615bdc0949c6ed6e838a18f92b",
      "tree": "a9bd96c08bf561cda3be61be73a137cfa6fc78de",
      "parents": [
        "f631bb8a6af8ad1a0fc959fd766ec78b7bd7f54a"
      ],
      "author": {
        "name": "YeungKC",
        "email": "11473691+YeungKC@users.noreply.github.com",
        "time": "Fri Nov 06 05:23:28 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 20:23:28 2026 +0000"
      },
      "message": "[material_ui] Hit test the floating label of InputDecorator at its painted position (#13326)\n\nWhen the label of an `InputDecorator` floats, `_RenderDecoration.paint` draws the label with `_labelTransform` (a translation and a scale of 0.75). `applyPaintTransform` reports the same transform. But `hitTestChildren` hit tests the label with only its layout offset. A comment there says \"The label must be handled specially since we\u0027ve transformed it\", but the code does not do this. Thus the label is painted in one location and hit tested in a different location:\n\n- A tap on the visible floating label does not hit the label.\n- A tap below the visible label, inside its unscaled layout box, hits the label.\n\nThis is a problem when the label contains an interactive widget, for example a `PopupMenuButton`, as in the issue. A maintainer said in the issue: \"we shouldn\u0027t have weird issues with the hit testing here. Flutter should be able to do this\" ([comment](https://github.com/flutter/flutter/issues/145324#issuecomment-2038418928)).\n\nThis change hit tests the label with the transform from `applyPaintTransform` when `_labelTransform` is set. The hit test order of the children does not change. Other children keep the offset-based hit test. There is no API change.\n\nThe code in `packages/flutter/lib/src/material` of flutter/flutter is frozen (see https://github.com/flutter/flutter/issues/188444), so this change is only for `material_ui`.\n\nFixes https://github.com/flutter/flutter/issues/145324\n\n## Test plan\n\n- Added `Floating label hit test matches its painted position` to `test/input_decorator_test.dart`, for `TextDirection.ltr` and `TextDirection.rtl`. The test taps the painted label two times (2 taps expected), then taps 10 px below the painted label, inside its layout box (no new tap expected).\n  - Without the fix: both cases fail with `Expected: \u003c2\u003e Actual: \u003c0\u003e`.\n  - With the fix: both cases pass.\n\n## Pre-Review Checklist\n\nThe change uses the repository\u0027s pending changelog workflow (`packages/material_ui/pending_changelogs/change_2026_10_20_floating_label_hit_test.yaml`, `version: patch`). No public API documentation change is necessary.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "f631bb8a6af8ad1a0fc959fd766ec78b7bd7f54a",
      "tree": "321ec7b30e62785d76ac9e4175a8bdf2027364ed",
      "parents": [
        "a355d5d20140bbe31f1f88a3a965efe6a5966a62"
      ],
      "author": {
        "name": "Mekala Mohankrishna",
        "email": "mmohankrishna@google.com",
        "time": "Thu Nov 05 20:16:30 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 20:16:30 2026 +0000"
      },
      "message": "[material_ui] Fix InputDecorator intrinsic height when isDense or isC… (#13522)\n\n`_RenderDecoration.computeMinIntrinsicHeight` computed the minimum container height differently from `_layout`:\n\n| | Condition | Floor |\n|---|---|---|\n| `_layout` | `isDense \\|\\| isCollapsed \\|\\| expands` | `inputHeight` |\n| `computeMinIntrinsicHeight` (before) | `isDense \\|\\| expands` | `0.0` |\n\nThis caused two mismatches between the intrinsic height and the laid out height:\n\n1. **`isDense: true` with compact visual density (the default on desktop and web):** the density offset (-8) shrinks the content height below the input height. Layout clamps it back up to `inputHeight`, but the intrinsic path clamped to `0.0`, so the intrinsic height was 8px too short. Inside `IntrinsicHeight`, this produced the `A RenderFlex overflowed by 8.0 pixels` error reported in the issue.\n2. **`isCollapsed: true` without `isDense` (including `InputDecoration.collapsed`):** the intrinsic path still applied the `kMinInteractiveDimension` (48px) floor, while layout used `inputHeight`, so the intrinsic height was too tall.\n\nThis PR aligns `computeMinIntrinsicHeight` with `_layout`.\n\n| Density | Decoration | Laid out height | Intrinsic before | Intrinsic after |\n|---|---|---|---|---|\n| compact | `isDense` + `isCollapsed`, zero padding | 24 | 16 | 24 |\n| compact | `isDense`, zero padding | 24 | 16 | 24 |\n| standard / compact | `isCollapsed` | 24 | 48 | 24 |\n| standard / compact | `InputDecoration.collapsed` | 24 | 48 | 24 |\n\nFixes https://github.com/flutter/flutter/issues/190536\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "a355d5d20140bbe31f1f88a3a965efe6a5966a62",
      "tree": "6556e801b58f9febcc16e72b88397d18884684d0",
      "parents": [
        "46c69b325a22ea66768c5c6638f163dde024a59c"
      ],
      "author": {
        "name": "Victor Sanni",
        "email": "victorsanniay@gmail.com",
        "time": "Thu Nov 05 10:43:54 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 18:43:54 2026 +0000"
      },
      "message": "[material_ui] Paint Scaffold persistent bottom sheet background color behind the keyboard (#13242)\n\nPorts flutter/flutter#186365 to `material_ui` (design: https://flutter.dev/go/ios-26-keyboard-bleed).\n\nWith a persistent bottom sheet (`Scaffold.bottomSheet` or `ScaffoldState.showBottomSheet`) and `resizeToAvoidBottomInset: true`, the sheet is lifted above the keyboard and the `Scaffold`\u0027s own `Material` is what sits behind the keyboard. On iOS 26 the keyboard is translucent, so the scaffold color shows through under the sheet instead of the sheet\u0027s color.\n\n`_ScaffoldLayout` now extends the persistent sheet\u0027s slot by the part of the keyboard inset not already covered by the bottom bars, while still reporting the content-only height so FAB and `SnackBar` geometry are unchanged. `_StandardBottomSheet` pads its content inside the `BottomSheet`\u0027s `Material` by that amount (growing the sheet\u0027s constraints to match), so the sheet\u0027s surface continues behind the keyboard. `resizeToAvoidBottomInset: false`, `showModalBottomSheet`, and `BottomSheet`\u0027s public API are unchanged.\n\nFixes the framework-owned part of flutter/flutter#179482.\n\n## Before\n\n\u003cimg width\u003d\"368\" height\u003d\"405\" alt\u003d\"before\" src\u003d\"https://github.com/user-attachments/assets/d60ec5b8-60e7-4ea5-881e-d1fe80fa2e4f\" /\u003e\n\n## After\n\n\u003cimg width\u003d\"368\" height\u003d\"405\" alt\u003d\"after\" src\u003d\"https://github.com/user-attachments/assets/0f8ae510-40bc-497f-b9a8-9545b5a42e43\" /\u003e\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "46c69b325a22ea66768c5c6638f163dde024a59c",
      "tree": "77aa9e9521a69d81ad1ae49768be5440bd6fa242",
      "parents": [
        "04781623f406d4446dfc9d52686ccc02c22936db"
      ],
      "author": {
        "name": "victogomez-cs",
        "email": "victor.orozco@cloudsufi.com",
        "time": "Thu Nov 05 10:40:57 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 16:40:57 2026 +0000"
      },
      "message": "[image_picker_ios] PR 5/5 Switch Pigeon to Swift and finish the Objective-C to Swift migration. (#13493)\n\nSwitches `image_picker_ios` Pigeon output from Objective-C to Swift and removes the remaining Objective-C packaging:\n\n* `pigeons/messages.dart` now generates `messages.g.swift` instead of `messages.g.h` and `messages.g.m`.\n* `ImagePickerPlugin` and the PHPicker save operation use the generated Swift API, including `PigeonError` instead of `FlutterError`.\n* Deletes the `image_picker_ios_objc` Swift Package Manager target, the `image_picker_ios.h` umbrella header, and the custom module map.\n* The CocoaPods pod is Swift-only and no longer sets `s.module_map`.\n\nThe iOS example app and UI tests stay Objective-C until the next PR.\n\nBumps image_picker_ios to **0.8.13+15**.\n\nPR 5/5 of the Obj-C → Swift migration, following https://github.com/flutter/packages/pull/13394. Part of https://github.com/flutter/flutter/issues/119107\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "04781623f406d4446dfc9d52686ccc02c22936db",
      "tree": "4d9cade9b1f4bb6ddbb37453a12b9aca60dba863",
      "parents": [
        "3dbab32bcd757c7a921c97e59de6e412544051fa"
      ],
      "author": {
        "name": "muralikrishmt",
        "email": "mkmt@google.com",
        "time": "Thu Nov 05 09:46:38 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 09:46:38 2026 +0530"
      },
      "message": "[material_ui] Document RefreshIndicator mouse behavior on desktop and web (#13286)\n\nAdds a \"Refresh indicator does not respond to a mouse\" section to the\n`RefreshIndicator` troubleshooting docs. It explains that:\n\n- Clicking and dragging with a mouse doesn\u0027t trigger the refresh\nindicator by default, because `ScrollBehavior.dragDevices` doesn\u0027t\ninclude `PointerDeviceKind.mouse`.\n- Mouse wheel scrolling never triggers it, because it isn\u0027t a drag\ngesture.\n- Touch screens trigger it on all platforms, and trackpads do in desktop\napps. On the web, trackpad scrolling is handled like mouse wheel\nscrolling, so it doesn\u0027t.\n- To support mouse users, apps can add a refresh button or shortcut that\ncalls `RefreshIndicatorState.show`, or add `PointerDeviceKind.mouse` to\n`ScrollBehavior.dragDevices` (with a code example and a note about the\ntext-selection trade-off).\n\nThis is a documentation-only change (test-exempt) with no behavior\nchanges. It adds a pending changelog entry (`version: patch`).\n\nFixes https://github.com/flutter/flutter/issues/135510\n\n%23%23 Pre-Review Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [AI contribution guidelines] and understand my\nresponsibilities, or I am not using AI tools.\n- [x] I read the [Tree Hygiene] page, which explains my\nresponsibilities.\n- [x] I read and followed the [relevant style guides] and ran [the\nauto-formatter].\n- [x] I signed the [CLA].\n- [x] The title of the PR starts with the name of the package surrounded\nby square brackets, e.g. `[shared_preferences]`\n- [x] I [linked to at least one issue that this PR fixes] in the\ndescription above.\n- [x] I followed [the version and CHANGELOG instructions], using\n[semantic versioning] and the [repository CHANGELOG style], or I have\ncommented below to indicate which documented exception this PR falls\nunder[^1].\n- [x] I updated/added any relevant documentation (doc comments with\n`///`).\n- [x] I added new tests to check the change I am making, or I have\ncommented below to indicate which [test exemption] this PR falls\nunder[^1].\n- [x] All existing and new tests are passing.\n\nIf you need help, consider asking for advice on the %23hackers-new\nchannel on [Discord].\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code\nAssist for\nGitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).\nComments from the `gemini-code-assist` bot should not be taken as\nauthoritative feedback from the Flutter team. If you find its comments\nuseful you can update your code accordingly, but if you are unsure or\ndisagree with the feedback, please feel free to wait for a Flutter team\nmember\u0027s review for guidance on which automated comments should be\naddressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the\nrepository guidelines only need to comment if the PR is not\nauto-exempted by repo tooling.\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/packages/blob/main/CONTRIBUTING.md\n[AI contribution guidelines]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md%23ai-contribution-guidelines\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md\n[relevant style guides]:\nhttps://github.com/flutter/packages/blob/main/CONTRIBUTING.md%23style\n[the auto-formatter]:\nhttps://github.com/flutter/packages/blob/main/script/tool/README.md%23format-code\n[CLA]: https://cla.developers.google.com/\n[Discord]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md\n[linked to at least one issue that this PR fixes]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md%23overview\n[the version and CHANGELOG instructions]:\nhttps://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md%23version-and-changelog-updates\n[semantic versioning]:\nhttps://dart.dev/tools/pub/versioning%23semantic-versions\n[repository CHANGELOG style]:\nhttps://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md%23changelog-style\n[test exemption]:\nhttps://github.com/flutter/flutter/blob/master/docs/contributing/Tree-hygiene.md%23tests"
    },
    {
      "commit": "3dbab32bcd757c7a921c97e59de6e412544051fa",
      "tree": "fcfbcbd64f9736e114d5717905213ad8a7e20d3e",
      "parents": [
        "530976377a0937d968809013af56f9c63fad0715"
      ],
      "author": {
        "name": "Samarpreet Singh",
        "email": "45147003+samar70@users.noreply.github.com",
        "time": "Thu Nov 05 06:46:06 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 01:16:06 2026 +0000"
      },
      "message": "[material_ui] Make SearchAnchor.bar respect SearchBarThemeData padding (#13360)\n\nFixes flutter/flutter#185889\nPorts flutter/flutter#186037. Part of flutter/flutter#188444.\n\nMakes `SearchAnchor.bar` use `SearchBarThemeData.padding` when `barPadding` is null.\n\ncc @CoderBoxer\n\nI used AI assistance to port the approved fix.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "530976377a0937d968809013af56f9c63fad0715",
      "tree": "2692c6b3a4e16f8e37779689ec2d56ca3aa12f2a",
      "parents": [
        "d2b9d2075d9ec88a4ccb2c4145b8ba124ed87df6"
      ],
      "author": {
        "name": "Kevin Moore",
        "email": "kevmoo@users.noreply.github.com",
        "time": "Wed Nov 04 14:45:23 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 22:45:23 2026 +0000"
      },
      "message": "[pointer_interceptor] Use dart.library.js_interop in example export (#13558)\n\nReplace `if (dart.library.html)` with `if (dart.library.js_interop)` in `packages/pointer_interceptor/pointer_interceptor/example/lib/native_widget.dart` (`native_widget_web.dart` already uses `package:web/web.dart`).\n\nThis resolves the last legacy `dart.library.html` conditional directive in `flutter/packages` so the upcoming `deprecated_web_configuration` analyzer warning (https://github.com/dart-lang/sdk/issues/61875) passes `flutter-analyze`.\n\nRelated issue:\n- https://github.com/dart-lang/sdk/issues/61875\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "d2b9d2075d9ec88a4ccb2c4145b8ba124ed87df6",
      "tree": "df57e4c97c35c6664dfb42e67226c4f1616bdf7e",
      "parents": [
        "2c2b1e7148aa0e5f6c4a3cd10c9e64a90df86034"
      ],
      "author": {
        "name": "LouiseHsu",
        "email": "louisehsu@google.com",
        "time": "Wed Nov 04 21:05:21 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 21:05:21 2026 +0000"
      },
      "message": "[in_app_purchase_storekit] Use purchase(confirmIn:) for StoreKit 2 purchases (#13410)\n\nFixes https://github.com/flutter/flutter/issues/194373 Fixes https://github.com/flutter/flutter/issues/195494\r\n\r\nThis PR switches StoreKit 2 purchases from the scene-less Product.purchase(options:) to Product.purchase(confirmIn:options:) whenever the plugin has a view controller attached to a window scene (iOS 17+) or an NSWindow (macOS 15.2+).\r\n\r\n`purchase(confirmIn:)` is Apple\u0027s recommended purchase API for UIKit/AppKit apps. The\r\nscene-less variant relies on StoreKit locating a UI anchor itself; on iOS 27 / iPadOS 27\r\nthat lookup fails (`Could not find a UI anchor for … purchase`) and the `await` never\r\nreturns. In the field this surfaced as App Review rejecting iPad subscription purchases\r\n(#194373); on the iOS 27 simulator it surfaced as every StoreKit 2 purchase test timing\r\nout (#195494). The scene-less call remains the fallback for iOS \u003c 17 / macOS \u003c 15.2 and\r\nfor headless engines whose registrar has no view in a window.\r\n\r\n**Test changes**\r\n\r\nThe test `setUp` now hands the plugin a registrar stub backed by the test host\u0027s root\r\nview controller, mirroring how the plugin runs inside a real Flutter app, so the\r\nexisting purchase tests exercise the `confirmIn:` path.\r\n\r\nTwo further adjustments were needed for the iOS 27 ipad simulator:\r\n\r\n- `testGetTransactionJsonRepresentation` makes a purchase and then asks the plugin to look\r\n  that transaction up by its ID. It took the ID from the test framework\u0027s\r\n  `SKTestTransaction.originalTransactionIdentifier`, which only worked because, on earlier\r\n  OS versions, that value happened to equal the StoreKit 2 `Transaction.id` the plugin\r\n  matches on (both are 0 for the first purchase). On iOS 27 StoreKitTest numbers\r\n  transactions differently (`identifier` is a non-zero counter, `originalTransactionIdentifier`\r\n  is reported as 0), so the lookup found nothing. The test now uses `identifier`, which is the\r\n  field that corresponds to `Transaction.id` on every OS version. \r\n- `testFailedProductUnavilablePurchase` and `testPurchaseWithIntroductoryOfferEligibilityJWS`\r\n  are skipped on iOS 27+. Both make a purchase that fails by design, and on iOS 27\r\n  StoreKitTest shows an error dialog for failed purchases even with `disableDialogs`\r\n  ([iOS 27 release notes, known issue 184255116](https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-27-release-notes)), so the purchase never completes. Since StoreKit serializes purchases per process, each of those also blocked every later purchase test, which is the cascade you see in the CI log.\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "2c2b1e7148aa0e5f6c4a3cd10c9e64a90df86034",
      "tree": "f95dee9e6847a3231fb48d30c58d3c3451998ec2",
      "parents": [
        "41990f96252e154fc4e9a4d2dc9f8b32005b061d"
      ],
      "author": {
        "name": "Aparin Kirill",
        "email": "41366638+kirya355@users.noreply.github.com",
        "time": "Wed Nov 04 23:47:26 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 20:47:26 2026 +0000"
      },
      "message": "[material_ui] Fix dismissal near minimum extent when shouldCloseOnMinExtent (#12545)\n\nThis PR ports https://github.com/flutter/flutter/pull/190810 by @kirya355 from flutter/flutter to flutter/packages.\r\n\r\nFixes bottom sheet dismissal when a `DraggableScrollableNotification` extent\r\nis within floating-point precision of `minExtent`, instead of requiring exact\r\nequality.\r\n\r\nUpdates both the modal `BottomSheet` and standard `Scaffold` bottom sheet\r\nhandlers. Adds regression tests for both paths using `extent: 0.20000000001`\r\nand `minExtent: 0.2`.\r\n\r\nThis PR fix [flutter/flutter#116982](https://github.com/flutter/flutter/issues/116982)\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "41990f96252e154fc4e9a4d2dc9f8b32005b061d",
      "tree": "07ad634a546fd1339648846651e223302dd18e19",
      "parents": [
        "3c7764b43a21aca32ed55027f3d8a7e5148fd856"
      ],
      "author": {
        "name": "Qun Cheng",
        "email": "36861262+QuncCccccc@users.noreply.github.com",
        "time": "Wed Nov 04 11:46:18 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 19:46:18 2026 +0000"
      },
      "message": "[material_ui] Add Material 3 Expressive `ElevatedButton` (#13084)\n\nAdds Material 3 Expressive support to `ElevatedButton`. As with `IconButton` (#12832), apps opt in with `ElevatedButtonThemeData(variant: StyleVariant.material3Expressive)`. Without it, `ElevatedButton` keeps the Material 3 style.\r\n\r\nWith Material 3 Expressive, `ElevatedButton` supports:\r\n\r\n* Sizes (`ButtonStyle.sizeVariant`): extra small through extra large. Each size has its own height, padding, icon size, label text style, and gap between the icon and the label.\r\n* Shapes (`ButtonStyle.shapeVariant`): round and square, including the pressed shape and the shape change when a toggle button is selected.\r\n* Toggle buttons: a button with a non-null `isSelected` is selectable, and uses the selected colors and selected semantics when `isSelected` is true.\r\n\r\nThe defaults are generated from the Material Design tokens by a new `ButtonTemplateM3E` in `gen_defaults`.\r\n\r\nNew APIs:\r\n\r\n* `ElevatedButtonThemeData.variant` and `ElevatedButtonTheme.variantOf`. A theme that doesn\u0027t specify `variant` inherits it from the enclosing themes, the same way as `IconButtonThemeData.variant` (#13263).\r\n* `ButtonStyleButton.isSelected` and `ElevatedButton.isSelected`.\r\n* `sizeVariant` and `shapeVariant` parameters for `ElevatedButton.styleFrom`.\r\n\r\n\u003cimg src\u003d\"https://gist.githubusercontent.com/QuncCccccc/aba2243afce554b515eec724e62e5650/raw/44b10f43dfb6f42d2c0800928d993cec53df15c2/elevated_button_m3e.png\" width\u003d\"320\" alt\u003d\"Material 3 Expressive ElevatedButton sizes, shapes, toggle buttons, and disabled buttons\"\u003e\r\n\r\nFixes https://github.com/flutter/flutter/issues/194202\r\nPart of https://github.com/flutter/flutter/issues/184937\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "3c7764b43a21aca32ed55027f3d8a7e5148fd856",
      "tree": "34d6cbc5bb498224e2f4bd1fdd765ad435632235",
      "parents": [
        "10edd9ce4f28db57675d076ee63b470bf415f019"
      ],
      "author": {
        "name": "Ibrar Ahmad",
        "email": "108947675+IbrarIlyas@users.noreply.github.com",
        "time": "Thu Nov 05 00:12:22 2026 +0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 19:12:22 2026 +0000"
      },
      "message": "[go_router] Stop inactive StatefulShellRoute branches from vetoing pops (#12972)\n\nThe Navigator of every StatefulShellRoute branch is wrapped in a PopScope that  \r\n  keeps the shell itself from being popped, for example by an iOS back gesture,   \r\n  while the branch has an active sub-route.\r\n\r\n  Inactive branches stay mounted, so their PopScope stays registered as a pop     \r\n  entry of the same enclosing route as the active one, and ModalRoute only allows \r\n  a pop if every registered entry allows it. Switching away from a branch that    \r\n  still had a sub-route therefore suppressed the system back button for the whole \r\n  app: popRoute() reported the pop as handled without popping anything, so Android\r\n  never closed the activity.\r\n\r\n  The guard now only applies to the active branch. StatefulNavigationShell        \r\n  publishes which of its branches is active through an ActiveBranchScope inherited\r\n  widget, and the PopScope depends on it, so canPop is also kept up to date when  \r\n  the user switches branches without the route matches of a branch changing.      \r\n  Behavior is unchanged for a plain ShellRoute, which has no enclosing\r\n  ActiveBranchScope.\r\n\r\n  Tests added to `test/stateful_shell_route_system_back_test.dart`, next to the   \r\n  existing issue 120353 gesture tests: the issue\u0027s repro, back still popping the  \r\n  sub-route once the branch is active again, and a per-branch `canPop` check      \r\n  confirming the active branch still guards the shell. Also verified manually on  \r\n  an Android 15 device.\r\n\r\n  Fixes flutter/flutter#193098\r\n\r\n*Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.*\r\n\r\n*List which issues are fixed by this PR. You must list at least one issue.*\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "10edd9ce4f28db57675d076ee63b470bf415f019",
      "tree": "30148de53a72d5bfb207a04a9117aeb7b830797f",
      "parents": [
        "f7c47a26c767dbaf2d277106c700f1a152cfcdd1"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Wed Nov 04 14:08:23 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 19:08:23 2026 +0000"
      },
      "message": "Manual roll Flutter (stable) from abaf9c523780 to c197ca5199e9 (14 revisions) (#13542)\n\nManual roll requested by elliottbrooks@google.com\n\nhttps://github.com/flutter/flutter/compare/abaf9c523780...c197ca5199e9\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-stable-packages\nPlease CC elliottbrooks@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Flutter (stable): https://github.com/flutter/flutter/issues/new/choose\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "f7c47a26c767dbaf2d277106c700f1a152cfcdd1",
      "tree": "7f97977f66420eeb6ab8e5a002b873e3c8d326ec",
      "parents": [
        "75ce71235cd2b816909820f7fa28ae70e0c01e80"
      ],
      "author": {
        "name": "stuartmorgan",
        "email": "stuart.morgan@gmail.com",
        "time": "Wed Nov 04 13:26:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 18:26:08 2026 +0000"
      },
      "message": "[in_app_purchase] Convert example app to Swift (#13556)\n\nReplaces the Obj-C boilerplate example app\u0027s app delegate and main.m with a Swift app delegate using the `@main` annotation, following the standard Swift Flutter example app format, and migrates the test-specific handling into the new file.\n\nPart of https://github.com/flutter/flutter/issues/119106\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "75ce71235cd2b816909820f7fa28ae70e0c01e80",
      "tree": "07b728ef5d35c9be1d1220ce68254c932d086863",
      "parents": [
        "1864e5bb87ef9b077b6be469d8cebbc48c88625a"
      ],
      "author": {
        "name": "Flutter GitHub Bot",
        "email": "fluttergithubbot@gmail.com",
        "time": "Wed Nov 04 10:12:23 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 18:12:23 2026 +0000"
      },
      "message": "Sync release-go_router-18.1.3 to main (#13559)\n\nThis automated PR syncs the changes from the release branch release-go_router-18.1.3 back to the main branch."
    },
    {
      "commit": "1864e5bb87ef9b077b6be469d8cebbc48c88625a",
      "tree": "cf542be73ab3d21599d3831443f24ae0e9db536d",
      "parents": [
        "8590bda7fd4d30cc348b24dde846d026d9b9576f"
      ],
      "author": {
        "name": "Flutter GitHub Bot",
        "email": "fluttergithubbot@gmail.com",
        "time": "Wed Nov 04 09:32:00 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 17:32:00 2026 +0000"
      },
      "message": "Sync release-material_ui-1.10.0 to main (#13546)\n\nThis automated PR syncs the changes from the release branch release-material_ui-1.10.0 back to the main branch."
    },
    {
      "commit": "8590bda7fd4d30cc348b24dde846d026d9b9576f",
      "tree": "bf4b153d8f5dbdf4c229ad55d5f51449afdd17b9",
      "parents": [
        "e3af8f9cef5f2692a9a5fd0c7a46e3ff100b9314"
      ],
      "author": {
        "name": "Camille Simon",
        "email": "43054281+camsim99@users.noreply.github.com",
        "time": "Wed Nov 04 09:31:57 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 17:31:57 2026 +0000"
      },
      "message": "[camera_android_camerax] Add magic number guideline to `TESTING.md` (#13081)\n\nTo improve agent-author test clarity, adds testing guidance for agents regarding asserting against number literal without explanation or instead of a variable unnecessarily.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "e3af8f9cef5f2692a9a5fd0c7a46e3ff100b9314",
      "tree": "a9a713da0b7fca5bb7a75838dec2bfbd025ea5f6",
      "parents": [
        "cec8ebf66081e53a8f64eb18fce42b216571be3d"
      ],
      "author": {
        "name": "Flutter GitHub Bot",
        "email": "fluttergithubbot@gmail.com",
        "time": "Wed Nov 04 09:21:14 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 17:21:14 2026 +0000"
      },
      "message": "Sync release-cupertino_ui-1.1.6 to main (#13547)\n\nThis automated PR syncs the changes from the release branch release-cupertino_ui-1.1.6 back to the main branch."
    },
    {
      "commit": "cec8ebf66081e53a8f64eb18fce42b216571be3d",
      "tree": "c0a6b369dadb1fabcaf6c0490edeb4bf34edcda8",
      "parents": [
        "718b7cfd6c32f2edf08f4527c3559c43276cff69"
      ],
      "author": {
        "name": "stuartmorgan-g",
        "email": "stuartmorgan@google.com",
        "time": "Wed Nov 04 11:25:09 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 16:25:09 2026 +0000"
      },
      "message": "[file_selector] Convert unit tests to Kotlin (#13102)\n\nConverts `file_selector_android` native unit tests from Java to Kotlin.\r\n\r\nSimilar to my other conversions, the process was:\r\n- Use the Android Studio deterministic auto-conversion.\r\n- Do manual cleanup and improvement as several separate commits.\r\n  - This included adopting `mockito-kotlin` to make the mocking less verbose and complex\r\n- Do a local Gemini review for where the code could be improved as Kotlin code, and address most of that feedback.\r\n\r\nDoes not include any changes to production code.\r\n\r\nPart of https://github.com/flutter/flutter/issues/188630\r\n\r\n## Pre-Review Checklist\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "718b7cfd6c32f2edf08f4527c3559c43276cff69",
      "tree": "745deabc79f67962fb8c2d548eef1e07be11d80b",
      "parents": [
        "670b30ed698a4cbfa3061b9fc76b698658b843b8"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Wed Nov 04 10:53:12 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 15:53:12 2026 +0000"
      },
      "message": "Roll Flutter from 934720261be0 to 3623d2d34543 (25 revisions) (#13555)\n\nhttps://github.com/flutter/flutter/compare/934720261be0...3623d2d34543\n\n2026-11-04 engine-flutter-autoroll@skia.org Roll Skia from 49ec2655bf51 to aaa39bfcd393 (5 revisions) (flutter/flutter#195956)\n2026-11-04 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#195950)\n2026-11-04 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#195948)\n2026-11-04 magder@google.com local_engine_builds_common out of bringup (flutter/flutter#195862)\n2026-11-04 abdelrhmanmahrous386@gmail.com [web][a11y] Initialize slider semantics values when enabling (flutter/flutter#195564)\n2026-11-04 magder@google.com Drop Android SDK, JDK, and Gradle dependencies from framework_tests_misc (flutter/flutter#195869)\n2026-11-04 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from B6zarykZp6PKWRueg... to Jo-ZgQSNDuPsjlZ4s... (flutter/flutter#195937)\n2026-11-04 magder@google.com Balance tool_tests_commands and web_tool_tests subshards by duration (flutter/flutter#195863)\n2026-11-04 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from T_-6-6X1lDMghhAvX... to p0HDXLISPIElJfSz7... (flutter/flutter#195939)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from 3eeafac94f07 to 49ec2655bf51 (8 revisions) (flutter/flutter#195933)\n2026-11-03 137456488+flutter-pub-roller-bot@users.noreply.github.com Roll pub packages (flutter/flutter#195932)\n2026-11-03 bkonyi@google.com [flutter_tools] Lazily initialize AppleContext dependencies via builder closures (flutter/flutter#191992)\n2026-11-03 34871572+gmackall@users.noreply.github.com [Android] Upgrade linux_android_emu_vulkan_stable avd_cipd_version to 36.1.9 (build_id:8670032186093418337) (flutter/flutter#195856)\n2026-11-03 30870216+gaaclarke@users.noreply.github.com [vulkan]: adds \"color attachment read\" dst dependency to subpass (flutter/flutter#195714)\n2026-11-03 ishaquehassan@gmail.com [flutter_tools] Stream web dev server proxy responses instead of buffering them (flutter/flutter#194934)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from d80db8f8f856 to 3eeafac94f07 (6 revisions) (flutter/flutter#195926)\n2026-11-03 bkonyi@google.com [flutter_tools] Add flutter assemble support for tool extension assemble targets (flutter/flutter#194563)\n2026-11-03 engine-flutter-autoroll@skia.org Manual roll Dart SDK from fe609902984b to e362a23e9738 (2 revisions) (flutter/flutter#195914)\n2026-11-03 mattmvc56@gmail.com feat(flutter_test): add startHover and startHoverAt helper to WidgetTester (flutter/flutter#190630)\n2026-11-03 lozhkovoi@gmail.com [flutter_tools] Remove trailing dots from bug report URLs (flutter/flutter#194132)\n2026-11-03 269567208+reidbaker-agent@users.noreply.github.com Update skills_lint to 0.5.3 (flutter/flutter#195796)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from 58295d932350 to d80db8f8f856 (5 revisions) (flutter/flutter#195900)\n2026-11-03 bkonyi@google.com [flutter_tools] Make DeviceLogReader.dispose asynchronous (flutter/flutter#195389)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Packages from 3f34a6f7a79b to 1df844794f6f (10 revisions) (flutter/flutter#195895)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from c733ad3e37cb to 58295d932350 (1 revision) (flutter/flutter#195894)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC elliottbrooks@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "670b30ed698a4cbfa3061b9fc76b698658b843b8",
      "tree": "d3d3cd6789afc3923879c494e91871dd4fae8124",
      "parents": [
        "b7e0312250866278e87803737bb98f440f6f3f13"
      ],
      "author": {
        "name": "Qun Cheng",
        "email": "36861262+QuncCccccc@users.noreply.github.com",
        "time": "Tue Nov 03 16:57:06 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 00:57:06 2026 +0000"
      },
      "message": "[material_ui] Inherit `IconButtonThemeData.variant` from enclosing themes (#13263)\n\n`IconButton` resolves its Material style variant from the closest `IconButtonTheme` only. An `IconButtonTheme` that doesn\u0027t set `variant` therefore resets its subtree to Material 3, even when an ancestor opted into Material 3 Expressive. `ListTile`, `InputDecorator`, and `AppBar` hit this too, because they wrap their children in an internal `IconButtonTheme` without a variant.\r\n\r\nThis PR makes a null `IconButtonThemeData.variant` inherit the variant of the enclosing icon button themes:\r\n\r\n* Adds `IconButtonTheme.variantOf`, which returns the **first non-null `variant`** of the enclosing `IconButtonTheme`s, and then falls back to `ThemeData.iconButtonTheme.variant`, and then to `StyleVariant.material3`. `IconButton` now uses it instead of `IconButtonTheme.of(context).variant`.\r\n* Keeps the current behavior of `style`: the closest theme replaces its ancestors. An explicit `variant: StyleVariant.material3` still opts a subtree out.\r\n* Documents that an enclosing `IconButtonTheme` takes precedence over `ThemeData.iconButtonTheme`, and that `IconButtonTheme.of` only returns the variant specified by the closest theme.\r\n\r\nFixes https://github.com/flutter/flutter/issues/194414\r\n\r\nTODO: \r\n* Follow-up PR:\r\n   - `AppBar`, `ListTile`, and `InputDecorator` set `variant: IconButtonTheme.variantOf(context)` on the themes they create. This fixes the common cases above.\r\n   - I\u0027ll also add some notes to the `variant` docs: dialogs, bottom sheets, and menus only get the closest theme, so set the variant in `ThemeData` or on that theme.\r\n* Update the M3E migration checklist (the migration skill): a theme that a widget creates internally should always set `variant`, either to `variantOf(context)` or to `StyleVariant.material3`.\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "b7e0312250866278e87803737bb98f440f6f3f13",
      "tree": "9203654d34c376186ca5ce483e06905486784a2c",
      "parents": [
        "e244038cb4a8083edff4aa7a932c722d352a17ec"
      ],
      "author": {
        "name": "Kate Lovett",
        "email": "katelovett@google.com",
        "time": "Tue Nov 03 18:13:23 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 00:13:23 2026 +0000"
      },
      "message": "[tool] Regenerate `MockGitDir` for `package:git` 2.5.0 (#13544)\n\n`package:git` `2.4.0` and `2.5.0` were recently published to pub.dev and added an optional named parameter (`{bool includeUntracked \u003d true}`) to `GitDir.isWorkingTreeClean`, along with several new methods on `GitDir`.\r\n\r\nBecause `script/tool` does not check in a `pubspec.lock`, `dart pub get` in CI (`Linux repo_checks` -\u003e `tool unit tests`) now resolves `git 2.5.0`, causing `package_command_test.dart` to fail compilation against the checked-in `MockGitDir`:\r\n\r\n```\r\ntest/common/package_command_test.mocks.dart:204:20: Error: The method \u0027MockGitDir.isWorkingTreeClean\u0027 has fewer named arguments than those of overridden method \u0027GitDir.isWorkingTreeClean\u0027.\r\n  _i6.Future\u003cbool\u003e isWorkingTreeClean() \u003d\u003e\r\n                   ^\r\n```\r\n\r\nThis PR:\r\n- Regenerates `script/tool/test/common/package_command_test.mocks.dart` with `build_runner` against `package:git` `2.5.0`.\r\n- Leaves `git: ^2.0.0` in `script/tool/pubspec.yaml` so that `Linux analyze_legacy N-2` (which runs on Flutter `3.41.9` / Dart `3.11.5`, whereas `git \u003e\u003d2.4.0` requires Dart `\u003e\u003d3.12.0`) can still resolve `git 2.3.2` when bootstrapping `script/tool` in `prepare_tool.sh`.\r\n\r\nPart of https://github.com/flutter/flutter/issues/195938\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "e244038cb4a8083edff4aa7a932c722d352a17ec",
      "tree": "dc1b9fa8d60d03f9f5a502c126da4f377b7fd047",
      "parents": [
        "140b51f715fb8d91d259abe5cbc62fc594760657"
      ],
      "author": {
        "name": "Hasan Armoush",
        "email": "hkarmoush@gmail.com",
        "time": "Wed Nov 04 01:37:49 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 22:37:49 2026 +0000"
      },
      "message": "[material_ui] Fix discrete Slider selecting the neighboring tick near the track ends (#12927)\n\nPorts flutter/flutter#188012 to `material_ui` now that the Material/Cupertino code freeze has lifted, per the instructions in flutter/flutter#188444.\n\nOriginal PR description:\n\n---\n\nFixes https://github.com/flutter/flutter/issues/194855\n\nTick marks and the thumb on discrete rounded tracks are *painted* in a padded coordinate space:\n```\ndx \u003d trackLeft + i/d * (trackWidth − padding) + padding/2\n```\nwhere `padding \u003d trackHeight` (4 px on M2\u0027s `RoundedRectSliderTrackShape`, up to 16 px on M3\u0027s `GappedSliderTrackShape`). But tap detection inverted a different, unpadded formula, so the snap midpoints in tap space diverged from the visual midpoints between tick marks. Lower-half ticks consistently landed in the wrong snap bucket.\n\nFix: `_getValueFromGlobalPosition` now uses the padded inverse formula when `isDiscrete \u0026\u0026 trackShape.isRounded`. The drag-delta normalizer in `_handleDragUpdate` is updated to match so a tap followed immediately by a drag is consistent.\n\nApplied to both `Slider` and `RangeSlider`.\n\n## Tests\n\nAdded regression tests to `slider_test.dart` and `range_slider_test.dart`. They fail without the fix and pass with it:\n\n- `Slider` snaps at the visual midpoint between every pair of ticks, tapping 0.05px either side of the midpoint, for the default Material 3 track (LTR and RTL) and the gapped track from `Slider.year2023: false` (LTR and RTL), which has the largest padding. Tapping exactly on a tick center can\u0027t expose the bug, because the old and new mappings differ by only a couple of pixels there.\n- A full-track drag after a tap on a 100-division gapped slider, which covers the drag delta normalizer.\n- `RangeSlider` snaps at the visual midpoint between ticks for both thumbs.\n- A tick-center sanity check for `Slider`.\n\nAll of `slider_test.dart` and `range_slider_test.dart` pass locally.\n\n---\n\nFixes flutter/flutter#194855\n\nCloses flutter/flutter#188012 (superseded by this PR)\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "140b51f715fb8d91d259abe5cbc62fc594760657",
      "tree": "25950d521b779efcf8f053f8269b4bccaaa4028a",
      "parents": [
        "dae45252928b232756cbcf9f9d2335310c09d97f"
      ],
      "author": {
        "name": "Valentin Vignal",
        "email": "32538273+ValentinVignal@users.noreply.github.com",
        "time": "Wed Nov 04 02:27:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 18:27:10 2026 +0000"
      },
      "message": "[material_ui] Migrate M3 Time Picker template to use new gen_defaults (#13164)\n\nWork toward https://github.com/flutter/flutter/issues/187899.\r\nFixes https://github.com/flutter/flutter/issues/188439\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "dae45252928b232756cbcf9f9d2335310c09d97f",
      "tree": "0844014a44db1c0cccfbb356a6321e716415638c",
      "parents": [
        "9da3462352523f70333256823a9aabe79c6ff2d0"
      ],
      "author": {
        "name": "Reid-Agent",
        "email": "269567208+reidbaker-agent@users.noreply.github.com",
        "time": "Tue Nov 03 12:11:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 17:11:08 2026 +0000"
      },
      "message": "[camera_android_camerax] Update skills_lint to 0.5.3 (#13530)\n\nUpdate to skills_lint 0.5.3 and enable new configs for published skills. \r\nAlong the way we found that a skill was not being limited. \r\n\r\n@reidbaker \r\n\u003cdetails\u003e\r\nUpdates the `skills_lint` dev dependency from `^0.5.1` to `^0.5.3` and turns on more checks in `skills_lint.yaml`:\r\n\r\n* New in 0.5.3, for the published `skills/` directory: `pub-archive-includes-skill` (reports a skill or linked file that `dart pub publish` would leave out) and `check-relative-paths` with `within-skill: true` (reports relative links that leave the skill directory). `skills/` has only a README today, so these guard future skills.\r\n* Also for `skills/`: `published-skill-name`, which checks the `package:skills` naming convention (added in 0.5.2).\r\n* For all skills: `check-absolute-paths` and `disallowed-field`. Both rules already existed before 0.5.3. `disallowed-field` checks the `SKILL.md` frontmatter keys.\r\n* Marks `.agents/skills/pre-push-skill` as internal (`metadata: internal: true`) and lists it under `individual_skills` with `prevent-skills-sh-publishing`, the same way as `check-readiness`.\r\n* `test/validate_skills_test.dart` now checks `expect(config.parsingErrors, isEmpty)`. The 0.5.3 CHANGELOG notes that `validateSkills` returns `true` even when `config.parsingErrors` is not empty, so a typo in `skills_lint.yaml` (for example, an unknown rule name) would otherwise pass the test.\r\n\r\nThis is a dev-only change: it touches a dev dependency, the lint config, a dev skill and a test, with no change to the published plugin. It needs the `override: no versioning needed` and `override: no changelog needed` labels, as #12684 (the previous skills_lint bump) used, because the `version-check` tool does not treat `pubspec.yaml` and `skills_lint.yaml` as dev-only paths.\r\n\r\nNo issue tracks this routine dependency update, so this PR does not link one.\r\n\r\nI prepared this change with help from an AI agent and reviewed it.\r\n\r\nLocal checks, against skills_lint 0.5.3 from pub.dev: `flutter test` passes (including `test/validate_skills_test.dart`), `dart run skills_lint` exits 0, and the repo tool\u0027s `format`, `analyze`, `license-check` and `publish-check` report no issues. `validate --check-for-missing-changes` passes when given the two override labels above.\r\n\u003c/details\u003e \r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "9da3462352523f70333256823a9aabe79c6ff2d0",
      "tree": "d863250c5bf2b49b85bcf8bb4e67adb7025bdbee",
      "parents": [
        "1df844794f6ff5582da3d180c3fddc52751e8c44"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Tue Nov 03 10:55:27 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 15:55:27 2026 +0000"
      },
      "message": "Roll Flutter from fcfb4f203eae to 934720261be0 (38 revisions) (#13540)\n\nRoll Flutter from fcfb4f203eae to 934720261be0 (38 revisions)\n\nhttps://github.com/flutter/flutter/compare/fcfb4f203eae...934720261be0\n\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from 5bceaa033999 to c733ad3e37cb (5 revisions) (flutter/flutter#195872)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from 34d2bf479385 to 5bceaa033999 (9 revisions) (flutter/flutter#195864)\n2026-11-03 34465683+rkishan516@users.noreply.github.com fix: prefer pointer events over semantics tap for mouse clicks on web (flutter/flutter#191529)\n2026-11-03 zhongliu88889@gmail.com [VPAT] Expose a semantics text field value while it is not being edited (flutter/flutter#195445)\n2026-11-03 97480502+b-luk@users.noreply.github.com [Impeller] Make a GL context current before constructing an AiksContext without a surface (flutter/flutter#195629)\n2026-11-03 bkonyi@google.com [flutter_tools] Eliminate globals.dart from project.dart (flutter/flutter#194066)\n2026-11-03 bkonyi@google.com [tool] Complete context runner elimination and migrate AppContext usages to ToolContext (flutter/flutter#190797)\n2026-11-03 mdebbar@google.com [web] Unify font collections between CanvasKit and Skwasm (flutter/flutter#195539)\n2026-11-03 mark-xian@foxmail.com [Android] Replay predictive back state for retained engines (flutter/flutter#192286)\n2026-11-03 30870216+gaaclarke@users.noreply.github.com [vulkan]: Adds depth/stencil synchronization for subpasses (flutter/flutter#195689)\n2026-11-03 1961493+harryterkelsen@users.noreply.github.com [web] Honor requested upscaling in instantiateImageCodecWithSize and ImageDescriptor.instantiateCodec (flutter/flutter#195836)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Skia from 866b61ca92c9 to 34d2bf479385 (9 revisions) (flutter/flutter#195848)\n2026-11-03 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from xl1LWBuppzu-BnOzV... to B6zarykZp6PKWRueg... (flutter/flutter#195847)\n2026-11-03 47866232+chunhtai@users.noreply.github.com Remove unused ffi (flutter/flutter#195710)\n2026-11-02 154381524+flutteractionsbot@users.noreply.github.com Revert: [Android] Let the raster thread use every core of a chip without little cores (flutter/flutter#195838)\n2026-11-02 magder@google.com Run 10 impeller iOS benchmarks as one devicelab task (flutter/flutter#195661)\n2026-11-02 mohammed@al-samarrai.com Use named uniforms instead of setFloat in StretchEffect (flutter/flutter#195372)\n2026-11-02 46920873+gabrimatic@users.noreply.github.com [flutter_tools] Report when the browser disconnects during a web test run (flutter/flutter#192198)\n2026-11-02 okikday@gmail.com fix: Resolve memory leak in image_list example (flutter/flutter#189526)\n2026-11-02 magder@google.com Only run the common local engine configurations in presubmit (flutter/flutter#195688)\n2026-11-02 zanderso@users.noreply.github.com Update gcloud_version to version 3@591.0.0.chromium.4 (flutter/flutter#195769)\n2026-11-02 30870216+gaaclarke@users.noreply.github.com [Impeller] Order the Vulkan copy-texture-to-texture layout transition after the copy (flutter/flutter#195814)\n2026-11-02 30870216+gaaclarke@users.noreply.github.com [Impeller] Order the Vulkan ResizeTexture layout transition after its blit (flutter/flutter#195721)\n2026-11-02 1961493+harryterkelsen@users.noreply.github.com [web] Fix CanvasKit fragment shader uniforms being freed or mutated after recording (flutter/flutter#195718)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from MqypI6RNyVZ_FLUE-... to T_-6-6X1lDMghhAvX... (flutter/flutter#195809)\n2026-11-02 17201053+M0n7y5@users.noreply.github.com [Android] Log why Impeller falls back to OpenGLES (flutter/flutter#194764)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Skia from 3f35fb6e591b to 866b61ca92c9 (11 revisions) (flutter/flutter#195802)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Skia from 3f35fb6e591b to 866b61ca92c9 (11 revisions) (flutter/flutter#195802)\n2026-11-02 magder@google.com Only run the common local engine configurations in presubmit (flutter/flutter#195688)\n2026-11-02 magder@google.com Balance tool_integration_tests subshards by expected duration (flutter/flutter#195628)\n2026-11-02 dbebawy@users.noreply.github.com [web_paragraph] Map code units without a cluster to a cluster (flutter/flutter#195384)\n2026-11-02 zhongliu88889@gmail.com [web] Hide synthetic autofill inputs from assistive technology (flutter/flutter#195618)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Packages from 3742a4eecd6b to 3f34a6f7a79b (8 revisions) (flutter/flutter#195795)\n2026-11-02 1961493+harryterkelsen@users.noreply.github.com [web] Unskip web tests that pass on CanvasKit and Skwasm: platform_view_test, route_notification_messages_test (flutter/flutter#195605)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Skia from e5ad3868b8db to 3f35fb6e591b (1 revision) (flutter/flutter#195789)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Skia from f5215e74aa16 to e5ad3868b8db (3 revisions) (flutter/flutter#195779)\n2026-11-02 engine-flutter-autoroll@skia.org Roll Skia from e43478a2f9f8 to f5215e74aa16 (1 revision) (flutter/flutter#195776)\n2026-11-01 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from kW0A0xxNkqf38ljm4... to MqypI6RNyVZ_FLUE-... (flutter/flutter#195768)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC elliottbrooks@google.com,stuartmorgan@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n..."
    },
    {
      "commit": "1df844794f6ff5582da3d180c3fddc52751e8c44",
      "tree": "c63fbb056bda862da8843385ee6d0ada038aec57",
      "parents": [
        "51c71be0b69a05946b1441b09efe88eebe89bea5"
      ],
      "author": {
        "name": "stuartmorgan",
        "email": "stuart.morgan@gmail.com",
        "time": "Tue Nov 03 09:51:26 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 14:51:26 2026 +0000"
      },
      "message": "[webview_flutter] Convert iOS impl example app to Swift (#13538)\n\nConverts the remaining Obj-C code in `webview_flutter_ios/example/ios` to Swift:\n- Converts the AppDelegate to Swift, using the repo\u0027s standard boilerplate file\n- Removes `main.m` in favor of the annotation on the app delegate\n- Adds a bridging header to access the generated registrant\n- Converts the XCUITest to Swift\n\nThe XCUITest remains disabled for flakiness, but I tested locally that I could see it pass locally with the skip removed.\n\nMissed piece of https://github.com/flutter/flutter/issues/119110\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "51c71be0b69a05946b1441b09efe88eebe89bea5",
      "tree": "a700ca502b865c0441307494da8cd2d07e029a31",
      "parents": [
        "1cdc73e258ebe7aeb36dc9a336b78b26dc78ffbd"
      ],
      "author": {
        "name": "Elliott Brooks",
        "email": "21270878+elliette@users.noreply.github.com",
        "time": "Mon Nov 02 16:10:06 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 00:10:06 2026 +0000"
      },
      "message": "[material_ui] Temporarily exclude material_ui from non-Wasm web unit tests (#13537)\n\nTemporarily disable `material_ui` web tests due to https://github.com/flutter/flutter/issues/195700\n\nhttps://github.com/flutter/flutter/pull/193485 made each web test suite noticeably slower to load. That has pushed the master-channel `Linux_web web_dart_unit_test_shard_2 master` shard, which runs `material_ui`, over its 90-minute timeout. The timeouts are blocking the flutter/flutter → flutter/packages roller.\n\nThis PR temporarily turns off the non-Wasm web unit tests for `material_ui` while we work on a long-term fix.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "1cdc73e258ebe7aeb36dc9a336b78b26dc78ffbd",
      "tree": "f8fe22d2c168f900f82453f77c4474b6f46349a9",
      "parents": [
        "30d67e636e627e8cf4b0e8898d0cd8b77b5541e7"
      ],
      "author": {
        "name": "chunhtai",
        "email": "47866232+chunhtai@users.noreply.github.com",
        "time": "Mon Nov 02 15:04:03 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 23:04:03 2026 +0000"
      },
      "message": "[material_ui] Removes list semantics in some a11y_assessment samples (#13257)\n\nfixes https://github.com/flutter/flutter/issues/194237\nfixes https://github.com/flutter/flutter/issues/194248\n\nAndroid creates collection info based on semantics child count and index, which causes talkback to announce the 1 of n when item is focused.\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "30d67e636e627e8cf4b0e8898d0cd8b77b5541e7",
      "tree": "addefbb49a8ca0d28a647825982af87afbe7f2d0",
      "parents": [
        "cc93a31be9ccf75060a333080237dd4c6cf1f451"
      ],
      "author": {
        "name": "Mohammed Al-Samarraie",
        "email": "mohammed@al-samarrai.com",
        "time": "Tue Nov 03 00:14:07 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 21:14:07 2026 +0000"
      },
      "message": "[material_ui] Use named uniforms instead of setFloat in InkSparkle (#13445)\n\nMoves `InkSparkle` from the index-based `FragmentShader.setFloat` to the named uniform API (`getUniformFloat`, `getUniformVec2`, `getUniformVec4`), as part of deprecating `setFloat` (flutter/flutter#195357).\n\n`InkSparkle` looks up its 13 uniforms once, when it creates its shader, and sets them through those slots on each paint. Every uniform gets the same value as before, so there is no visual change. The named API is available in Flutter 3.47.0, the package\u0027s minimum, so the SDK constraint doesn\u0027t change.\n\nflutter/flutter#195358 covers both `InkSparkle` and `StretchEffect`. Since Material is frozen in flutter/flutter (flutter/flutter#188444), the work is split: `StretchEffect` is in flutter/flutter#195372, and `InkSparkle` is here.\n\nPart of flutter/flutter#195358\n\nVersion and CHANGELOG: adds a `pending_changelogs` entry with `version: patch`.\n\nTests: this is a refactor with no semantic change, so I think it qualifies for a test exemption. It\u0027s covered by the existing golden tests in `test/ink_sparkle_test.dart`, and a misspelled uniform name would throw when those tests paint.\n\n## Pre-Review Checklist"
    },
    {
      "commit": "cc93a31be9ccf75060a333080237dd4c6cf1f451",
      "tree": "9f185e3b1bfb09fe0db306cc49b1541d3a393020",
      "parents": [
        "f895ad58a1fd8527e08b7b536b984e49ea8ddb20"
      ],
      "author": {
        "name": "zhongliugo",
        "email": "zhongliu88889@gmail.com",
        "time": "Mon Nov 02 12:02:07 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 20:02:07 2026 +0000"
      },
      "message": "[VPAT] Fix contrast and reflow in three a11y_assessments demos (#13409)\n\n## Problem\nThree a11y_assessments demos fail basic accessibility checks. The badge label is white on `Colors.green`, a 2.8:1 contrast ratio, and the drawer header is white on `Colors.blue`, 3.1:1, where small text needs 4.5:1. The expansion tile page lays its tiles out in a `Column`, so at a 320x256 viewport the second and third tiles overflow and cannot be reached.\n\n## Fix\nThe badge drops its hardcoded colors for the theme defaults, `error` on `onError`, and the drawer header uses the theme\u0027s `primary` and `onPrimary` pair. Both pairs meet 4.5:1 in all four of the app\u0027s themes. The expansion tile body becomes a `ListView`, so the page scrolls instead of overflowing. Each change has a regression test that failed before it. Only the test app changes, so no package version or CHANGELOG update is needed.\n\n## Demo\nRun the test app on web. Check the badge and drawer header colors with the DevTools color picker, and the expansion tile page in device mode at 320x256."
    },
    {
      "commit": "f895ad58a1fd8527e08b7b536b984e49ea8ddb20",
      "tree": "5adee0459e3e16850cd79473cb37892d20e74073",
      "parents": [
        "176df8336af04aa9075ff1ed7c6cbbc96d534099"
      ],
      "author": {
        "name": "Nurullah Türkoğlu",
        "email": "73299153+nurullahturkoglu@users.noreply.github.com",
        "time": "Mon Nov 02 21:24:49 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 18:24:49 2026 +0000"
      },
      "message": "[two_dimensional_scrollables] Fix pinned cells hit test (#13376)\n\nThis picks up #11777 by @beroso, which was closed while review comments were still open. It keeps the original commits and adds one on top.\n\n`TableView` hit-tested each cell against its full rect, so a regular cell scrolled under a trailing pinned row or column could take taps meant for the pinned cell, like a menu button in a pinned last column. The change from #11777 limits each cell\u0027s hit test to the viewport band of its own section (leading pinned, regular or trailing pinned) and accounts for the alignment offsets.\n\nMy commit adds the tests asked for in review: reversed vertical axis, both axes reversed, a vertically reversed table with alignment, and RTL with directional alignment. It also disposes the scroll controllers in the hit test tests, which failed leak tracking once it was enabled for this package in #11653. The CHANGELOG entry uses the suggested wording.\n\nWithout the change in `table.dart`, six of the twelve hit test tests fail, including the two new reversed-axis ones. The alignment and RTL tests pass either way, since they cover the alignment offset case raised in review.\n\nOn Flutter 3.47.6 stable, `flutter test` passes for the package (182 tests) and the hit test group also passes with `--platform chrome`. `flutter analyze` and the repo tool\u0027s `validate` report no issues.\n\nFixes https://github.com/flutter/flutter/issues/186876\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "176df8336af04aa9075ff1ed7c6cbbc96d534099",
      "tree": "bbfb89134314966c8b307b48f5309a2002a63689",
      "parents": [
        "35a1e60a576c00482a5bc253c1d3275cc3d47b5b"
      ],
      "author": {
        "name": "Mouad Debbar",
        "email": "mdebbar@google.com",
        "time": "Mon Nov 02 13:22:56 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 18:22:56 2026 +0000"
      },
      "message": "[tool] Let the OS pick a port for chromedriver and wait for exit (#13355)\n\nPart of https://github.com/flutter/flutter/issues/194313\n\n`DriveExamplesCommand` starts `chromedriver --port\u003d4444` inside the per-example loop without waiting for it to bind, and stops it with `chromedriver.kill()` without awaiting `chromedriver.exitCode`. When a package has multiple web examples (e.g. `google_maps_flutter_web`\u0027s `example/latest` and `example/3-64`), the dying `chromedriver` from the first example still holds port `4444` when the next example spawns a new `chromedriver --port\u003d4444`, so the second `chromedriver` fails to bind and exits immediately:\n\n```\nUnable to start a WebDriver session for web testing.\nMake sure you have the correct WebDriver server (e.g. chromedriver) running at 4444.\n```\n\nExample CI failures:\n- https://ci.chromium.org/b/8667405073082275745\n- https://ci.chromium.org/b/8667406160854692097\n- https://ci.chromium.org/b/8667756860257169345\n\nThis PR:\n- Launches `chromedriver --port\u003d0` and waits for `started successfully on port (\\d+)` on stdout before running `flutter drive --driver-port\u003d\u003cport\u003e`.\n- Waits for `chromedriver.exitCode` after `chromedriver.kill()` in a `finally` block."
    },
    {
      "commit": "35a1e60a576c00482a5bc253c1d3275cc3d47b5b",
      "tree": "6779830c80ac5988f3560c19425bc939f954f252",
      "parents": [
        "be64cacba82549ba864d565fa0dcddf327a21970"
      ],
      "author": {
        "name": "Francis Rath",
        "email": "fr@ncis.no",
        "time": "Mon Nov 02 19:03:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 18:03:08 2026 +0000"
      },
      "message": "[vector_graphics] Draw \u003ctext\u003e under an RTL ambient direction (#13408)\n\n`FlutterVectorGraphicsListener.onDrawText` lays out every paragraph at infinite width, using the ambient text direction. Under RTL the default `TextAlign.start` resolves to right, which puts each line at x \u003d +∞, so no `\u003ctext\u003e` is drawn at all. Shapes are unaffected. The listener already positions text itself (`x`, `dx`, and `text-anchor` through `maxIntrinsicWidth`), so this change sets `textAlign: TextAlign.left` on the paragraph. The text direction is still passed through, so bidi handling is unchanged.\n\nThe new test renders `\u003ctext x\u003d\"10\"\u003e` under both directions and checks that ink is painted and starts at x ≈ 10. Without the fix, `rtl` paints no pixels.\n\nFixes https://github.com/flutter/flutter/issues/195182\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)"
    },
    {
      "commit": "be64cacba82549ba864d565fa0dcddf327a21970",
      "tree": "6d2b8f77a53bce1843361a7c711d61c9ad76196c",
      "parents": [
        "a378299f32f249ec2ad578f369dffbbbf12a2039"
      ],
      "author": {
        "name": "zhongliugo",
        "email": "zhongliu88889@gmail.com",
        "time": "Mon Nov 02 09:59:19 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 17:59:19 2026 +0000"
      },
      "message": "[VPAT] Keep a11y_assessments snackbars open until closed (#13451)\n\n## Problem\nSix a11y_assessments demos show a `SnackBar` without an action. Those snack bars auto-dismiss after four seconds and offer no way to keep or reopen them, so users who need more time to read lose the message.\n\n## Fix\nThe snack bars set `persist: true` and `showCloseIcon: true`, so they stay until the user closes them. A snack bar with an action already persists by default. New tests on the snack bar, text button and app bar pages check that the snack bar outlasts its timeout and closes from the close icon.\n\n## Demo\nRun the test app on web, open #/snack-bar, #/text-button or #/app-bar, show a snack bar, and wait more than four seconds."
    },
    {
      "commit": "a378299f32f249ec2ad578f369dffbbbf12a2039",
      "tree": "43f62b520280d5cd773b42f9280854e12bf47f6d",
      "parents": [
        "3f34a6f7a79b841714ee0038b70330dd6b9745cc"
      ],
      "author": {
        "name": "Mekala Mohankrishna",
        "email": "mmohankrishna@google.com",
        "time": "Mon Nov 02 17:33:16 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 17:33:16 2026 +0000"
      },
      "message": "[pigeon] Fix race in event channel handler removal integration test (#13528)\n\n**This PR fixes the tree.** `Linux_android custom_package_tests master` is failing on `main` (all 3 attempts of [#4084](https://ci.chromium.org/p/flutter/builders/prod/Linux_android%20custom_package_tests%20master/4084)) in the Pigeon integration test `event channels handle multiple instances`:\n\n```\nThe following MissingPluginException was thrown while de-activating platform stream on channel\ndev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamConsistentNumbers.1:\nMissingPluginException(No implementation found for method cancel on channel\ndev.flutter.pigeon.pigeon_integration_tests.EventChannelMethods.streamConsistentNumbers.1)\n```\n\n### Cause\n\nThe test plugin unregisters the stream handler for instance `\"1\"` (to exercise event channel unregistration, added in #13438) immediately after calling `endOfStream()`. On the Dart side, the end of the stream closes the `EventChannel`\u0027s broadcast stream, which then sends a `cancel` method call back on the same channel. If the handler has already been removed by the time that `cancel` call arrives, it fails with a `MissingPluginException`, which fails the test. Whether it fails depends on timing, so it shows up as a flake.\n\n### Fix\n\nUnregister the handler from the stream handler\u0027s `onCancel` instead, i.e. only after the `cancel` call has been received, in both the Kotlin (Android) and Swift (iOS/macOS) test plugins. The generated Pigeon stream handler wrappers already forward the platform `onCancel` to the user handler, so no generator or generated-code changes are needed. The test still exercises unregistration; it just no longer races with the channel teardown.\n\nThis only changes test plugin code under `platform_tests/`, so there is no change to the published package.\n\n### Testing\n\nOn an Android emulator (Pixel 9a), running only `event channels handle multiple instances`:\n\n| | Runs | Failures (`MissingPluginException` on `cancel`) |\n|---|---|---|\n| Without this fix (`main`) | 5 | 2 |\n| With this fix | 10 | 0 |\n\nThe full `android_kotlin_integration_tests` suite (680 tests) also passes with this fix, as do `dart_unittests` and `flutter_unittests`. The Swift change mirrors the Kotlin one and is covered by the iOS/macOS integration tests in CI.\n\n### Related\n\nhttps://github.com/flutter/flutter/issues/179154 tracks a different flake in the same test on macOS Swift (`Bad state: Cannot add new events after calling close`, i.e. an event sent after `endOfStream`). This PR does not address that one, and the macOS Swift skip is left in place.\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "3f34a6f7a79b841714ee0038b70330dd6b9745cc",
      "tree": "6ffd0fd95b05726f83bb5e096dd4f714be888842",
      "parents": [
        "4cb0506dddae4f9861145c48f4b27b17907fe251"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Sun Nov 01 11:10:18 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 16:10:18 2026 +0000"
      },
      "message": "Roll Flutter from ee8b48245d7a to fcfb4f203eae (3 revisions) (#13520)\n\nhttps://github.com/flutter/flutter/compare/ee8b48245d7a...fcfb4f203eae\n\n2026-11-01 engine-flutter-autoroll@skia.org Roll Skia from 3df52f9ec546 to e43478a2f9f8 (1 revision) (flutter/flutter#195761)\n2026-10-31 engine-flutter-autoroll@skia.org Roll Skia from 607de4b035dc to 3df52f9ec546 (1 revision) (flutter/flutter#195748)\n2026-10-31 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from x2SqGbVUkOm4d6vk_... to kW0A0xxNkqf38ljm4... (flutter/flutter#195740)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC stuartmorgan@google.com,tarrinneal@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "4cb0506dddae4f9861145c48f4b27b17907fe251",
      "tree": "fa2c06af2f789cf1cd25e9f45c702ad585535f2c",
      "parents": [
        "88bd37412a1ffd21452e3f2a994a0ee1046efc4d"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Sat Oct 31 12:26:25 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 31 16:26:25 2026 +0000"
      },
      "message": "Roll Flutter from 5e805bfd5816 to ee8b48245d7a (17 revisions) (#13512)\n\nhttps://github.com/flutter/flutter/compare/5e805bfd5816...ee8b48245d7a\n\n2026-10-31 engine-flutter-autoroll@skia.org Roll Skia from 9bab765df357 to 607de4b035dc (1 revision) (flutter/flutter#195728)\n2026-10-31 engine-flutter-autoroll@skia.org Roll Skia from 284054bec98a to 9bab765df357 (2 revisions) (flutter/flutter#195726)\n2026-10-31 engine-flutter-autoroll@skia.org Roll Skia from 3a3f56f7ddd4 to 284054bec98a (1 revision) (flutter/flutter#195724)\n2026-10-31 engine-flutter-autoroll@skia.org Roll Skia from 466994d27b1e to 3a3f56f7ddd4 (1 revision) (flutter/flutter#195719)\n2026-10-30 kevmoo@users.noreply.github.com Fix XcodeProjectInterpreter dependency cycle in flutter_tools (flutter/flutter#195694)\n2026-10-30 49402500+fahaddoc@users.noreply.github.com Document that Positioned also works inside an Overlay (flutter/flutter#190607)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from ce0b85b46db6 to 466994d27b1e (3 revisions) (flutter/flutter#195711)\n2026-10-30 30870216+gaaclarke@users.noreply.github.com Adds Vulkan sync validation test run (flutter/flutter#195596)\n2026-10-30 1048052188@qq.com [Android] Let the raster thread use every core of a chip without little cores (flutter/flutter#195071)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from 121d04c01e2d to ce0b85b46db6 (6 revisions) (flutter/flutter#195699)\n2026-10-30 bardiakzm@gmail.com [web] Anchor platform view slots to top-left to fix RTL document layout (flutter/flutter#194601)\n2026-10-30 katelovett@google.com Update golden file testing docs (flutter/flutter#195449)\n2026-10-30 bkonyi@google.com [tool] Migrate Cache.flutterRoot static state to instance configuration (flutter/flutter#190795)\n2026-10-30 victorsanniay@gmail.com Apply view metrics overrides below the framework (flutter/flutter#194311)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from c0c46ee9f938 to 121d04c01e2d (9 revisions) (flutter/flutter#195687)\n2026-10-30 evanwall@buffalo.edu Use uniforms in the Porter Duff blend shader instead of specialization constants (flutter/flutter#195458)\n2026-10-30 bkonyi@google.com [flutter_tools] Inject dependencies into iOS, macOS, and Windows application packages (flutter/flutter#194047)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC stuartmorgan@google.com,tarrinneal@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "88bd37412a1ffd21452e3f2a994a0ee1046efc4d",
      "tree": "2b8c3ef218f9bdbf0c5284ef397abffca2d2fabd",
      "parents": [
        "39533dabfd5d0a7b3e74eea028b005949a229f65"
      ],
      "author": {
        "name": "zhongliugo",
        "email": "zhongliu88889@gmail.com",
        "time": "Fri Oct 30 14:54:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 14:54:20 2026 -0700"
      },
      "message": "[VPAT] Describe the a11y_assessments dialog for screen readers (#13462)\n\n## Problem\nOn the a11y_assessments dialog demo, screen readers do not read the\ndialog text. When the dialog opens, focus moves to the autofocused OK\nbutton and VoiceOver only says \"OK, button\". The text merges into the\ndialog\u0027s semantics node as its label, and on web a dialog\u0027s label is not\nexposed unless it names the route, so the text never reaches the DOM.\n\n## Fix\nThe text gets its own semantics node with `namesRoute: true`. On web the\ndialog\u0027s `aria-describedby` then points at it, so screen readers read it\nas the dialog\u0027s description when it opens. OK keeps its autofocus. A new\ntest checks that the text names the dialog.\n\n## Demo\nRun the test app on web, open #/dialog, turn on VoiceOver, and activate\nShow Dialog. Before, only \"OK, button\" is read. After, VoiceOver also\nreads \"This is a typical dialog.\""
    },
    {
      "commit": "39533dabfd5d0a7b3e74eea028b005949a229f65",
      "tree": "3088c1b4fdf81053a55d4b84cdb1a5b26424394c",
      "parents": [
        "c81561ecec8e142fbb7c97626e519e3828ee1dd2"
      ],
      "author": {
        "name": "Νικόλας Πατέρας",
        "email": "npateras@protonmail.com",
        "time": "Fri Oct 30 23:34:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:34:08 2026 +0000"
      },
      "message": "[go_router_builder] Allow `build` 5 (#13455)\n\nWidens the `build` constraint to `\"\u003e\u003d3.0.0 \u003c6.0.0\"` so apps can use `build_runner` 2.17.1, which requires `build` 5.\n\n`build` 5.0.0 republishes the retracted 4.1.0 as a major version. Its only breaking change is the new `BuildStep.librarySourceSink` member, which breaks packages that implement `BuildStep`. `go_router_builder` only receives a `BuildStep` in `GoRouterGenerator.generate` and does not implement it, so no code changes are needed.\n\nThis also removes the `TODO(piinks): Pin version once new stable rolls.` above the constraint. It was added in #10078 because the Flutter stable of the time pinned a `test` version that could not resolve `build` 4, so the range had to include `build` 3; the plan was to switch to `^4.0.0` once a newer stable shipped. The range is now meant to span `build` 4 and 5, and pinning to `^5.0.0` would force `build_runner` 2.17.1 and `analyzer` 14.3 on every user, so the TODO no longer applies. Happy to restore it if you\u0027d rather keep it.\n\nTested locally on Flutter 3.47.8 (Dart 3.13.7), which resolves `build` 5.0.0, `build_test` 3.5.23, `build_runner` 2.17.1, `source_gen` 4.3.1 and `analyzer` 14.6.0:\n- `custom-test --packages\u003dgo_router_builder` (the `tool/run_tests.dart` builder golden tests): all 56 pass.\n- `dart-test --packages\u003dgo_router_builder --platform\u003dvm`: all pass (10 in the package, 19 in the example). On stable the example still resolves `build` 4.0.11 and `build_runner` 2.16.1, because the `test_api` pinned by `flutter_test` caps `analyzer` below 14.\n- `analyze --packages\u003dgo_router_builder`: no issues. `analyze --downgrade` resolves `build` 4.0.4 and also reports no issues.\n\nTest exemption: this is a manual dependency roll that only widens a constraint. The existing builder tests cover generation with `build` 5 resolved.\n\nFixes flutter/flutter#194542\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "c81561ecec8e142fbb7c97626e519e3828ee1dd2",
      "tree": "fb10372594e1ca472d077f4521f955557a5d5124",
      "parents": [
        "07cf58c304f87e50a49d794bc9daf7cb0f79bcbe"
      ],
      "author": {
        "name": "Maxime Rougieux",
        "email": "73878075+MaximeRougieux@users.noreply.github.com",
        "time": "Fri Oct 30 22:00:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:00:52 2026 +0000"
      },
      "message": "[go_router] Support nested parentheses, groups, and lookaround assertions in path parameters (#12571)\n\n* Fixes https://github.com/flutter/flutter/issues/117307\r\n* Fixes an issue that prevented developers to use all kinds of groups in regexp patterns\r\n\r\nExample:\r\n`/tags/:slug((?!politics|economy)[^/]+)` should match `/tags/culture` and not match `/tags/politics`, but the current behavior is that the internal parenthesis are unhandled and the pattern is then used _literally_ :\r\n\r\n* `/tags/flutter` -\u003e No match\r\n* `/tags/politics` -\u003e No match\r\n* `/tags/flutter((?!politics|economy))[^/]+)` -\u003e Match, slug\u003d\"flutter\"\r\n\r\nDisclosure: I did the investigation and fix using AI, which i carefully reviewed and tried to improve as much as I could according to the AI contribution guidelines. I think it\u0027s still better to mention it\r\n\r\nA few things to note:\r\n* Not a big fan of the \"string-scanner\" to find the closing parenthesis, but this is unachievable with a regex and needed for the fix to work as expected, and it\u0027s tested\r\n* You might be wondering why the `_escapeGroup` function is completely gone (and why it was there in the first place if we can just remove it like that). The AI retraces this to when the repository transitioned from using the `path_to_regexp` package to having the functions in the codebase. This package seems to be using positional group matching, whereas go_router relies on named group matching, so escaping characters like :,- or ! is unnecessary as they can\u0027t disrupt the matching from working as expected.\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "07cf58c304f87e50a49d794bc9daf7cb0f79bcbe",
      "tree": "30c65c9744e1fc907c38515c8403293073fae6ec",
      "parents": [
        "22fa2fc5fbc4d5238dea2178d026a978c3fb2455"
      ],
      "author": {
        "name": "LouiseHsu",
        "email": "louisehsu@google.com",
        "time": "Fri Oct 30 20:27:07 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 20:27:07 2026 +0000"
      },
      "message": "[in_app_purchase_storekit] Add SK2Transaction.currentEntitlements() (#13373)\n\nExposes StoreKit 2\u0027s [`Transaction.currentEntitlements`](https://developer.apple.com/documentation/storekit/transaction/3851204-currententitlements) via `SK2Transaction.currentEntitlements()`.\r\nPreviously, `SK2Transaction.transactions()` only wrapped `Transaction.all`, which returns the user\u0027s full transaction history rather than only their currently active entitlements (non-consumable purchases and active auto-renewable/non-renewing subscriptions). Adding `SK2Transaction.currentEntitlements()` allows callers to query active subscriptions and entitlements directly without invoking `restorePurchases()` or manually filtering historical transactions.\r\n\r\nFixes https://github.com/flutter/flutter/issues/61339 and https://github.com/flutter/flutter/issues/118960\r\n\r\n## Pre-Review Checklist"
    },
    {
      "commit": "22fa2fc5fbc4d5238dea2178d026a978c3fb2455",
      "tree": "a5e118bfa92b714ec04fba41ac665f43ad6af434",
      "parents": [
        "f3f97373ccad87e201671bdc1bc4457840b21177"
      ],
      "author": {
        "name": "Reid-Agent",
        "email": "269567208+reidbaker-agent@users.noreply.github.com",
        "time": "Fri Oct 30 16:15:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 20:15:23 2026 +0000"
      },
      "message": "[all] Remove broken .claude/skills symlink (#13492)\n\nRemoves the `.claude/skills` symlink at the repo root. It has never worked.\n\nThe link is `.claude/skills -\u003e .agents/skills`. Symlink targets resolve relative to the link\u0027s own folder, so it points at `.claude/.agents/skills`, which does not exist. The working version in flutter/flutter is `.claude/skills -\u003e ../.agents/skills`.\n\nSince the link points at nothing, Claude Code gets no skills from it today. Removing it changes no behavior. A working link can come back later if the repo decides it wants Claude Code support.\n\nNo linked issue. This is a one-line repo cleanup with no package changes.\n\n## Pre-Review Checklist\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "f3f97373ccad87e201671bdc1bc4457840b21177",
      "tree": "bcb920e2700a06dcccd38cef0c81ef28c0f4ee40",
      "parents": [
        "3742a4eecd6b2603755bb44287889c340d98abaf"
      ],
      "author": {
        "name": "engine-flutter-autoroll",
        "email": "engine-flutter-autoroll@skia.org",
        "time": "Fri Oct 30 14:20:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 18:20:12 2026 +0000"
      },
      "message": "Roll Flutter from c09109874faa to 5e805bfd5816 (15 revisions) (#13504)\n\nhttps://github.com/flutter/flutter/compare/c09109874faa...5e805bfd5816\n\n2026-10-30 bpleekm@gmail.com Fix/shared thread merger expired lease (flutter/flutter#194200)\n2026-10-30 269567208+reidbaker-agent@users.noreply.github.com [FGP] Report the real error when applying kotlin-android fails (flutter/flutter#195080)\n2026-10-30 zanderso@users.noreply.github.com [Impeller] Minify GLSL shaders (flutter/flutter#195240)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Packages from 0b72e92bf5dd to 3742a4eecd6b (12 revisions) (flutter/flutter#195686)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Dart SDK from 52c908c00267 to fe609902984b (2 revisions) (flutter/flutter#195679)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from 0789f2ab93b8 to c0c46ee9f938 (1 revision) (flutter/flutter#195671)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from SORPfa9tgFn83M1CR... to x2SqGbVUkOm4d6vk_... (flutter/flutter#195670)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from 4470b8abaad6 to 0789f2ab93b8 (2 revisions) (flutter/flutter#195665)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Dart SDK from 89f7a35480d6 to 52c908c00267 (1 revision) (flutter/flutter#195659)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from 9f4e3117465e to 4470b8abaad6 (4 revisions) (flutter/flutter#195658)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from ec13cd547e98 to 9f4e3117465e (1 revision) (flutter/flutter#195650)\n2026-10-30 zhongliu88889@gmail.com [web] Keep semantics editing state while the text input connection is open (flutter/flutter#195141)\n2026-10-30 Rusino@users.noreply.github.com [web_paragraph] Fix multi-span BiDi span order and region direction (flutter/flutter#194980)\n2026-10-30 1961493+harryterkelsen@users.noreply.github.com [web] Unskip web tests that pass on CanvasKit and Skwasm: accessibility_inspector_test, color_filter_test (flutter/flutter#195541)\n2026-10-30 engine-flutter-autoroll@skia.org Roll Skia from 4ecd22a4a1d0 to ec13cd547e98 (10 revisions) (flutter/flutter#195647)\n\nIf this roll has caused a breakage, revert this CL and set the roller\nto dry run mode using the controls here:\nhttps://autoroll.skia.org/r/flutter-packages\nPlease CC stuartmorgan@google.com,tarrinneal@google.com on the revert to ensure that a human\nis aware of the problem.\n\nTo file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose\n\nTo report a problem with the AutoRoller itself, please file a bug:\nhttps://issues.skia.org/issues/new?component\u003d1389291\u0026template\u003d1850622\n\nDocumentation for the AutoRoller is here:\nhttps://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md"
    },
    {
      "commit": "3742a4eecd6b2603755bb44287889c340d98abaf",
      "tree": "7234f59ad2b9df3d66bd945c1286bfba78080eac",
      "parents": [
        "e830a53712a7344872c827360c0e9ae87c9f243d"
      ],
      "author": {
        "name": "stuartmorgan",
        "email": "stuart.morgan@gmail.com",
        "time": "Fri Oct 30 10:38:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 14:38:49 2026 +0000"
      },
      "message": "[pigeon] Allow event channel unregistration (#13438)\n\nAdds a new class for each event channel API that wraps the underlying EventChannel and allows setting the stream handler, matching the underlying Flutter API. This allows clients that need to set a new handler later (notably, removing a handler to avoid an engine-lifetime reference to a handler for a transient channel) to do so, using the same API that non-Pigeon event channel code would use.\r\n\r\nThe existing static `register` method is kept to avoid unnecessary breaking changes, but clients no longer need to use it if they want to create the channel directly.\r\n\r\nFixes https://github.com/flutter/flutter/issues/195049\r\n\r\n## Pre-Review Checklist\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "e830a53712a7344872c827360c0e9ae87c9f243d",
      "tree": "85c61d0fd9149aacd15fcf05a001fec57b7e1224",
      "parents": [
        "b9975c9d1cd7acebad60ae6c53309d5eae13b13c"
      ],
      "author": {
        "name": "Mekala Mohankrishna",
        "email": "mmohankrishna@google.com",
        "time": "Fri Oct 30 09:59:27 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 09:59:27 2026 +0000"
      },
      "message": "[material_ui] Fix Escape key not closing MenuAnchor opened by tap or click (#13430)\n\nFixes an issue where pressing the `Escape` key does not close a `MenuAnchor` menu that was opened by a tap or click when `childFocusNode` is not provided.\n\n### Root Cause\n1. When a `MenuAnchor` is opened via a tap or click (e.g. from a `TextButton` or `IconButton`) without a `childFocusNode`, the button does not request focus on tap and `RawMenuAnchorState.open` only requests focus on `widget.childFocusNode`. As a result, `FocusManager.instance.primaryFocus` remains outside both `RawMenuAnchor` and `_Submenu`, so key events never route through their `Shortcuts` or `Actions` widgets.\n2. In `_Submenu.build`, `FocusScope(node: anchor._menuScopeNode)` was placed above `Actions` and `Shortcuts`, so even when `_menuScopeNode` itself had primary focus, key events walked up past `FocusScope` without passing through `_Submenu`\u0027s `Shortcuts` and `Actions`.\n\n### Fix\n1. Wrap `FocusScope(node: anchor._menuScopeNode)` inside `Actions` and `Shortcuts` in `_Submenu.build` so key events dispatched to `_menuScopeNode` walk up through `_kMenuTraversalShortcuts` and `DismissMenuAction`.\n2. In `_MenuAnchorState._handleMenuOpenRequest`, when a root menu opens without a `childFocusNode` and focus is not already inside the `MenuAnchor` subtree, move focus to `_menuScopeNode` via `FocusScope.of(context).setFirstFocus(_menuScopeNode)` (and detach `_menuScopeNode` cleanly if closed/disposed before `FocusScope` mounts).\n\nFixes https://github.com/flutter/flutter/issues/195059\n\n## Pre-Review Checklist\n\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\n\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "b9975c9d1cd7acebad60ae6c53309d5eae13b13c",
      "tree": "d58cc7c1270a0c9f6fcc8d72f7a4f3b30a45517f",
      "parents": [
        "3258d45ac0f73c86fbe53a2e2c7b0ea4946d793c"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Fri Oct 30 00:27:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 07:27:57 2026 +0000"
      },
      "message": "manual roll and manual build and copy (#13495)\n\nremoves deprecated method and bumps ci flutter master version.\r\n\r\nUnblocks roller"
    },
    {
      "commit": "3258d45ac0f73c86fbe53a2e2c7b0ea4946d793c",
      "tree": "2baedeb8164acfe84474abaac7d8774b42c60c3e",
      "parents": [
        "09e67ffed232196104dee63c6611efc4a6717adc"
      ],
      "author": {
        "name": "Tarrin Neal",
        "email": "tarrinneal@gmail.com",
        "time": "Thu Oct 29 15:17:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 22:17:48 2026 +0000"
      },
      "message": "[pigeon] Separate native interop Dart bindings into a conditionally imported companion file (#13393)\n\nSeparates generated Dart native interop code (`dart:ffi`, `dart:io`, `package:jni`, `package:ffi`, `package:objective_c`, and `.ffi.dart`/`.jni.dart` bindings) into a companion `*.native_interop.g.dart` file that is conditionally imported (`if (dart.library.ffi)`) by the main `*.g.dart` file.\r\n\r\nThis allows the main generated `*.g.dart` file (data classes, enums, codecs, and method-channel APIs) to be imported on Web without failing `dart2js` / `dart2wasm` compilation due to transitive `dart:ffi` / `dart:io` imports (preventing the issue worked around in https://github.com/flutter/packages/pull/13380).\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    },
    {
      "commit": "09e67ffed232196104dee63c6611efc4a6717adc",
      "tree": "ede1f0f214e5545515d4c43f5c1ad64c1c705543",
      "parents": [
        "fb19211dbd8400778ba887e261c6cc0bb90fc534"
      ],
      "author": {
        "name": "victogomez-cs",
        "email": "victor.orozco@cloudsufi.com",
        "time": "Thu Oct 29 15:45:07 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 21:45:07 2026 +0000"
      },
      "message": "[image_picker_ios] PR 4/5 Migrate the view provider, PHPicker save operation, and image utilities to Swift (#13394)\n\nMigrates the Objective-C helpers that `ImagePickerPlugin` calls into the Swift target:\r\n\r\n* `FIPViewProvider` becomes `ViewProvider` / `DefaultViewProvider`.\r\n* `FLTPHPickerSaveImageToPathOperation` becomes `PHPickerSaveImageToPathOperation`.\r\n* `FLTImagePickerImageUtil`, `FLTImagePickerMetaDataUtil`, and `FLTImagePickerPhotoAssetUtil` become `ImagePickerImageUtil`, `ImagePickerMetaDataUtil`, and `ImagePickerPhotoAssetUtil`.\r\n* The `PHImageManager` seam becomes `ImageDataRequesting`.\r\n* `PHPickerResult` conforms to `PickerItem`, replacing the `BridgedPickerItem` wrapper.\r\n\r\nDeletes the custom module map and `image_picker_ios.h` umbrella header. The `image_picker_ios_objc` target remains for the Pigeon messages until the next PR. CocoaPods no longer sets `s.module_map`.\r\n\r\nBumps image_picker_ios to **0.8.13+14**.\r\n\r\nPR 4/5 of the Obj-C → Swift migration, stacked on https://github.com/flutter/packages/pull/13235. Part of https://github.com/flutter/flutter/issues/119107\r\n\r\n## Pre-Review Checklist\r\n\r\n**Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member\u0027s review for guidance on which automated comments should be addressed.\r\n\r\n[^1]: Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling."
    }
  ],
  "next": "fb19211dbd8400778ba887e261c6cc0bb90fc534"
}
