[iOS, Mac, Windows] Fix PlatformTicker does not respect animation accessibility setting - #35846
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35846Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35846" |
AI code review refresh for net11.0 targetHead reviewed: Verdict: Needs changes (code is solid; blocked from LGTM by WIP status, missing tests, and a red CI leg) MethodIndependent-first: read Scope / blast radiusTouches FindingsLooks correct
Should address
Prior review reconciliationNo prior reviews, inline comments, or earlier fleet-round markers exist on this PR — nothing to reconcile. CI status
ConfidenceMedium-high on the code correctness (clear parallel to the shipped Android implementation; Core compiled). Medium on CI (one red leg judged infra-related; others undetermined/pending).
|
AI code review refresh for net11.0 targetHead reviewed: Verdict: Needs changes (code is largely correct; blocked from LGTM by WIP status, missing tests, and a minor design inconsistency on the new Windows override) MethodIndependent-first: re-read Scope / blast radiusNow spans three platforms: What changed since round 15
Findings on the new Windows commitLooks correct
Should address
Prior round-15 findings — reconciliation
CI status (build
|
PR #35846 — Multi-model review synthesisVerdict: NEEDS_DISCUSSION (draft) · confidence=high · inline=0 Reconciliation (why the models split)Validated against the actual code, no confirmed code error exists, so the verdict is not NEEDS_CHANGES. The split is explained almost entirely by how each model treated the red CI: gpt-5.5 (LGTM) correctly judged the failing legs as unrelated; opus-4.6 (ND) and opus-4.8 (NC) both found the code functionally correct and differ only on weighting draft/WIP + no-tests + red-CI as a process blocker (opus-4.8 itself states "No blocking code defect found"); gemini (NC, high) is the true outlier — it invented a causal mechanism ("the PR causes CI failures because of thread-affinity"), which the evidence refutes. Finding validation
Key points
CI
Multi-model review (gpt-5.5 · opus-4.8 · opus-4.6 · gemini-3.1-pro). Comments only — not a formal approval. |
This comment has been minimized.
This comment has been minimized.
5aeef4d to
662ffb5
Compare
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
src/Core/src/Animations/PlatformTicker.Windows.cs:22
- The PR description mentions that Windows
PlatformTicker"overridesSystemEnabled" and that the Windows PublicAPI file was updated to reflect that override. In the current implementation,SystemEnabledis only set in the constructor / change event handler, and there is nooverrideof the property (and the PublicAPI diff only addsDispose). Please update the PR description to match the implementation, or add the override if that was the intent.
/// <summary>
/// Creates a new Windows <see cref="PlatformTicker"/> that respects the "Show animations in Windows" accessibility setting.
/// </summary>
public PlatformTicker()
{
_dispatcherQueue = DispatcherQueue.GetForCurrentThread();
SystemEnabled = _uiSettings.AnimationsEnabled;
_uiSettings.AnimationsEnabledChanged += OnAnimationsEnabledChanged;
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
/azp run |
|
/azp run |
|
Azure Pipelines will not run the associated pipelines, because the pull request was updated after the run command was issued. Review the pull request again and issue a new run command. |
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). There may be pipelines that require an authorized user to comment /azp run to run. |
|
Azure Pipelines: Successfully started running 3 pipeline(s). |
kubaflo
left a comment
There was a problem hiding this comment.
Could you please check the ai's suggestions and review if test failures are related?
This comment has been minimized.
This comment has been minimized.
Tests Failure Analysis
Test Failure Review: Not ready - click to expandOverall verdict: Not ready. 16 leg/failures are red on this PR but green across all 5 recent
Coverage: 151 checks · 138 passing · 13 failing · 0 pending · 0 inaccessible · 1 unmapped · 12 unexplained build legs · 0 unaccounted failing checks · 0 aborted failing checks · 0 canceled-build checks · 7 device-test unverified · 27 unattributed · 16 regressed-vs-base. Deterministic ceiling: Not ready — 16 legs are a deterministic regression vs base and 1 check (Build Analysis) had no inspectable AzDO evidence. Builds (this PR): maui-pr 1533908, maui-pr-devicetests 1533910, maui-pr-uitests 1533909. Base sampling (net11.0, 5 recent builds per definition): maui-pr 1535343/1534911, devicetests 1535345, uitests 1535443. Recommended actionFix the Visual failure comparisonsFull-resolution CI baseline, actual, and diff images are embedded below. They supplement the failure classification and do not change the deterministic verdict ceiling.
|
| CI baseline | Fresh PR actual | CI diff |
|---|---|---|
![]() |
![]() |
![]() |
CollectionViewSelectedItemBackgroundLost - windows - Needs human investigation - visual comparison
CI reported 4.44% difference in build 1533909.
Relationship to PR: Needs human investigation - No decisive exact test-and-platform baseline attribution was available.
| CI baseline | Fresh PR actual | CI diff |
|---|---|---|
![]() |
![]() |
![]() |
TopTabUnselectedTextVisibleWhenSwitchingTabs - android - Needs human investigation - visual comparison
CI reported 3.07% difference in build 1533909.
Relationship to PR: Needs human investigation - No decisive exact test-and-platform baseline attribution was available.
| CI baseline | Fresh PR actual | CI diff |
|---|---|---|
| Baseline unavailable: ambiguous across multiple snapshot environments | ![]() |
![]() |
kubaflo
left a comment
There was a problem hiding this comment.
Could you check the ai's suggestions and if test failures are related?
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.
Suppressed comments (4)
src/Core/src/Animations/PlatformTicker.Windows.cs:33
AnimationManager.Add()callsTicker.Start()wheneverTicker.IsRunningis false. On Windows,PlatformTickerinheritsTicker.IsRunning(timer-based), soIsRunningstays false andStart()may be invoked repeatedly, causing multipleCompositionTarget.Renderingsubscriptions and multipleFireinvocations per frame. MakeStart()idempotent (or overrideIsRunning).
CompositionTarget.Rendering += RenderingFrameEventHandler;
src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt:56
PublicAPI.Unshipped.txtnow contains a duplicated block of existing API entries (e.g.,Microsoft.Maui.ITab,TabBarPlacement,ValidateCommand, etc.). This duplication should be removed so the file only contains one entry per API member, plus the newly addedPlatformTicker.Dispose*entries.
Microsoft.Maui.ITab
Microsoft.Maui.ITab.Icon.get -> Microsoft.Maui.IImageSource?
Microsoft.Maui.ITab.IsEnabled.get -> bool
Microsoft.Maui.ITab.Title.get -> string!
Microsoft.Maui.TabBarPlacement
Microsoft.Maui.TabBarPlacement.Bottom = 1 -> Microsoft.Maui.TabBarPlacement
Microsoft.Maui.TabBarPlacement.Top = 0 -> Microsoft.Maui.TabBarPlacement
override Microsoft.Maui.MauiUIApplicationDelegate.ValidateCommand(UIKit.UICommand! command) -> void
override Microsoft.Maui.Platform.MauiTextField.LayoutSubviews() -> void
override Microsoft.Maui.Platform.NoCaretField.LayoutSubviews() -> void
override Microsoft.Maui.Platform.MauiView.AccessibilityActivate() -> bool
override Microsoft.Maui.Platform.MauiView.AccessibilityLabel.get -> string?
override Microsoft.Maui.Platform.MauiView.AccessibilityLabel.set -> void
override Microsoft.Maui.Handlers.EditorHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect rect) -> void
src/Core/src/Animations/PlatformTicker.Windows.cs:83
- If
PlatformTickeris constructed on a thread without aDispatcherQueue,_dispatcherQueuewill be null and theAnimationsEnabledChangedcallback will silently do nothing, so Windows would not respect the accessibility setting change at runtime. Add a best-effort fallback to updateSystemEnabledeven when_dispatcherQueueis null.
if (_dispatcherQueue is not null)
{
_dispatcherQueue.TryEnqueue(() =>
src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt:57
PublicAPI.Unshipped.txtnow contains duplicate entries (e.g.,Microsoft.Maui.ITab,TabBarPlacement,ValidateCommand, etc.) a second time. Duplicated PublicAPI lines are error-prone and can break the PublicAPI analyzer expectations; only the newPlatformTicker.Dispose*additions should be added here.
Microsoft.Maui.ITab
Microsoft.Maui.ITab.Icon.get -> Microsoft.Maui.IImageSource?
Microsoft.Maui.ITab.IsEnabled.get -> bool
Microsoft.Maui.ITab.Title.get -> string!
Microsoft.Maui.TabBarPlacement
Microsoft.Maui.TabBarPlacement.Bottom = 1 -> Microsoft.Maui.TabBarPlacement
Microsoft.Maui.TabBarPlacement.Top = 0 -> Microsoft.Maui.TabBarPlacement
override Microsoft.Maui.MauiUIApplicationDelegate.ValidateCommand(UIKit.UICommand! command) -> void
override Microsoft.Maui.Platform.MauiTextField.LayoutSubviews() -> void
override Microsoft.Maui.Platform.NoCaretField.LayoutSubviews() -> void
override Microsoft.Maui.Platform.MauiView.AccessibilityActivate() -> bool
override Microsoft.Maui.Platform.MauiView.AccessibilityLabel.get -> string?
override Microsoft.Maui.Platform.MauiView.AccessibilityLabel.set -> void
override Microsoft.Maui.Handlers.EditorHandler.PlatformArrange(Microsoft.Maui.Graphics.Rect rect) -> void
AI Review Summary
🗂️ Review Sessions — click to expand🚦 Gate — Test Before & After FixGate Result:
|
| Category | Tests | Snapshot diffs |
|---|---|---|
Animation |
5/5 ✓ | — |
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs) |
📋 Pre-Flight — Context & Validation
Issue: #35845 - [iOS, Mac] PlatformTicker.iOS.cs does not respect Reduce Motion accessibility setting
PR: #35846 - [iOS, Mac, Windows] Fix PlatformTicker does not respect animation accessibility setting
Platforms Affected: iOS, MacCatalyst, Windows
Files Changed: 5 implementation/API, 0 test
Key Findings
- The PR wires iOS/MacCatalyst
PlatformTickertoUIAccessibility.IsReduceMotionEnabledandUIApplication.ReduceMotionStatusDidChangeNotification, then addsIDisposable/Dispose(bool)public API entries to clean up the observer. - The PR wires Windows
PlatformTickertoUISettings.AnimationsEnabledandAnimationsEnabledChanged, with dispatcher marshalling for the event callback. - Gate was already skipped because no tests were detected; no regression tests were added for the accessibility behavior.
- Prior reviews and independent code review found unresolved Windows lifecycle issues and duplicate iOS/MacCatalyst PublicAPI entries.
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: low
Errors: 3 | Warnings: 1 | Suggestions: 0
Key code review findings:
- ✗
src/Core/src/Animations/PlatformTicker.Windows.cs:26-34still inherits timer-backedTicker.IsRunning, so repeated animations can add duplicateCompositionTarget.Renderingsubscriptions. - ✗
src/Core/src/Animations/PlatformTicker.Windows.cs:73-82silently ignores setting changes if constructed without aDispatcherQueue. - ✗
src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt:44-57andsrc/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt:43-56duplicate existing PublicAPI entries. - ⚠ No regression coverage for initial accessibility-state sync, notification/event changes, or disposal behavior.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #35846 | Cache initial iOS Reduce Motion state, subscribe to ReduceMotion notification, implement public Dispose API; cache Windows animation setting and listen for changes. | PlatformTicker.iOS.cs, PlatformTicker.Windows.cs, PublicAPI baselines |
Original PR. Code review found Windows lifecycle issues and duplicate PublicAPI entries. |
🔬 Code Review — Deep Analysis
Code Review — PR #35846
Independent Assessment
What this changes: iOS/MacCatalyst and Windows PlatformTicker now observe OS animation accessibility settings and become disposable to unregister platform observers/events. PublicAPI baselines are updated for the new dispose surface.
Inferred motivation: Make MAUI animations honor Reduce Motion / Windows Animation Effects and clean up new listeners.
Reconciliation with PR Narrative
Author claims: Fixes #35845 by wiring platform accessibility settings into Ticker.SystemEnabled, with disposal for observer cleanup.
Agreement/disagreement: The iOS/MacCatalyst direction matches the claim. Windows still has lifecycle/state issues that can break the claimed behavior.
Prior Review Reconciliation
| Prior ❌ Error Finding | Source | Status | Evidence |
|---|---|---|---|
Windows ticker inherits false IsRunning, causing repeated render subscriptions |
MauiBot inline/review comments | ❌ Unresolved | PlatformTicker.Windows.cs still does not override IsRunning; Start() only checks _disposed before subscribing at line 33. |
| Windows setting callback can run animation pipeline off UI thread | MauiBot | ✅ Partially fixed | Current code captures DispatcherQueue and enqueues the update when non-null. |
| Windows setting changes can be lost if ticker is constructed without a dispatcher | MauiBot issue/review comments | ❌ Unresolved | OnAnimationsEnabledChanged does nothing when _dispatcherQueue is null (lines 73-82). |
| Missing regression tests | MauiBot | ❌ Unresolved | PR changes no test files. |
External Output Contract
| Consumer token/pattern | Producer location | Producer emission condition | Consumer assumption | Ordinary negative case | Downstream effect |
|---|---|---|---|---|---|
| N/A | N/A | No changed code classifies external tool output | N/A | N/A | N/A |
Blast Radius Assessment
- Runs for all instances: Yes —
ITicker/IAnimationManagerare registered for normal MAUI animation use. - Startup impact: Possible window-scope/lazy service construction impact.
- Static/shared state: No new static state, but platform event subscriptions affect window-scoped ticker lifecycle.
CI Status
- Required-check result:
gh pr checks --requiredunavailable (gh auth loginrequired). GitHub REST shows current head has failed macOS build checks and several in-progress checks. - Classification: undetermined / red-pending.
- Action taken: Invoked
azdo-build-investigator;ci-analysisskill unavailable locally. Confidence capped low.
Findings
❌ Error — Windows ticker never reports running
src/Core/src/Animations/PlatformTicker.Windows.cs:26-34 subscribes to CompositionTarget.Rendering, but the class does not override IsRunning. It therefore inherits Ticker.IsRunning, which is backed by the base _timer that Windows never starts. AnimationManager.Add() (AnimationManager.cs:45) and Tweener.Start() (Tweener.cs:172) will see false and call Start() for additional concurrent animations, adding duplicate render handlers. Stop() removes only one subscription at a time. Track running state and override IsRunning.
❌ Error — Windows setting changes can be silently ignored
PlatformTicker.Windows.cs:73-82 only updates SystemEnabled when _dispatcherQueue is non-null. The ticker can be constructed before the animation action is dispatched to UI: AnimationExtensions.Animate() resolves animationManager at line 182 before DoAction() dispatches at line 184. In that case DispatcherQueue.GetForCurrentThread() can return null, and later AnimationsEnabledChanged callbacks are ignored permanently.
❌ Error — iOS/MacCatalyst PublicAPI baselines duplicate existing entries
src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt:44-57 and src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt:43-56 duplicate entries already present earlier in each file (ITab, TabBarPlacement, platform overrides). PublicAPI baselines should contain only exact, non-duplicative API entries; leave only the new PlatformTicker.Dispose entries.
⚠️ Warning — No regression coverage for platform accessibility behavior
The PR changes initial accessibility-state reads, live setting-change notifications, and disposal/unsubscription, but adds no tests or test seam. Existing ticker tests use test tickers and would not catch regressions in these platform observers.
Failure-Mode Probing
- Multiple animations on Windows: second animation sees
IsRunning == false, re-subscribesRenderingFrameEventHandler, and doubles tick callbacks. - Toggle Windows animations while ticker was constructed off UI thread:
_dispatcherQueueis null, callback returns without updatingSystemEnabled; animations keep using stale state. - Dispose during queued callback: guarded by
_disposed, safe when dispatcher exists. - iOS dispose after observer registration: observer is removed and disposed; no obvious stale callback issue.
Verdict: NEEDS_CHANGES
Confidence: low
Summary: The PR addresses the right accessibility gap, but current Windows ticker state handling is still incorrect and iOS/MacCatalyst PublicAPI entries are malformed. CI is also red/pending/undetermined, so this cannot be LGTM.
🛠️ Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix | iOS/MacCatalyst live SystemEnabled getter using UIAccessibility.IsReduceMotionEnabled; remove observer/dispose API; clean duplicate PublicAPI rows; add getter override PublicAPI row. |
✅ PASS targeted Apple builds | 3 files | Different from PR; less lifecycle/API surface risk. |
| PR | PR #35846 | Observer/cached-state iOS fix plus public Dispose API; Windows cached setting/event handler. | 5 files | Original PR; no tests detected and unresolved Windows/PublicAPI findings. |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| maui-expert-reviewer | 1 | Yes | Proposed live getter/no observer/no Dispose API for iOS/MacCatalyst. |
| loop | 1 | Stopped | Candidate 1 passed the available Apple compile checks and is demonstrably better for the iOS/MacCatalyst slice; no further iOS alternatives were necessary. |
Exhausted: No — stopped because candidate #1 passed the available tests and is materially better than the PR's iOS/MacCatalyst observer/dispose approach.
Selected Fix: Candidate #1 — Solves the iOS/MacCatalyst Reduce Motion bug with less public API churn and no observer lifecycle cleanup, while passing targeted net11.0-ios26.5 and net11.0-maccatalyst26.5 Core builds.
📝 Recommended PR Title & Description
Assessment: ✏️ Recommend updating — the current metadata is thorough, but it describes the raw PR's disposable observer/event approach; the winning fix removes the Apple dispose/observer API churn and keeps Windows lifecycle corrections, so the description would be stale as-is.
Recommended title
[iOS, MacCatalyst, Windows] PlatformTicker: Respect system animation accessibility settings
Recommended description
### Issue Details
- `PlatformTicker` on iOS, MacCatalyst, and Windows does not respect the OS animation accessibility settings.
- On iOS/MacCatalyst, enabling **Reduce Motion** (Settings -> Accessibility -> Motion -> Reduce Motion) has no effect — MAUI animations continue to play normally.
- On Windows, disabling **Animation effects** (Settings -> Accessibility -> Visual effects -> Animation effects) has no effect — MAUI animations continue to play normally.
- Android already honors these settings via `ValueAnimator.AreAnimatorsEnabled()` and the energy-saver / duration-scale listeners.
### Root Cause
**iOS / MacCatalyst**
- `PlatformTicker.iOS.cs` never connected the system Reduce Motion setting to `Ticker.SystemEnabled`.
- `AnimationManager.Add()` checks `Ticker.SystemEnabled` before accepting new animations.
- `AnimationManager.OnFire()` checks `Ticker.SystemEnabled` and force-finishes running animations when animations become disabled.
**Windows**
- `PlatformTicker.Windows.cs` never checked the Windows animation accessibility setting, so `Ticker.SystemEnabled` stayed true regardless of the "Show animations in Windows" setting.
- The Windows ticker also needs to report its actual render-subscription running state so `AnimationManager.Add()` does not add duplicate `CompositionTarget.Rendering` handlers for concurrent animations.
### Description of Change
**Accessibility and Animation Behavior**
- `PlatformTicker` now observes system animation accessibility settings:
- iOS/MacCatalyst respects **Reduce Motion**.
- Windows respects **Show animations in Windows** / **Animation effects**.
- `Ticker.SystemEnabled` is updated or queried through the platform setting so new animations are blocked when animations are disabled and running animations can be force-finished through the existing `AnimationManager` path.
**Windows lifecycle correctness**
- Windows `PlatformTicker` tracks whether it has subscribed to `CompositionTarget.Rendering` and reports that through `IsRunning`.
- `Start()` and `Stop()` remain idempotent so concurrent animations do not accumulate duplicate render callbacks.
- Windows setting-change handling updates `SystemEnabled` without silently dropping notifications when the ticker was created before a dispatcher queue was available.
**Public API / Resource Management**
- PublicAPI baselines are updated only for the actual platform API surface introduced by the final implementation.
- Avoid adding unnecessary Apple observer/dispose API surface when a live platform setting read can satisfy the `SystemEnabled` contract.
### What NOT to Do
- Do not leave Windows `PlatformTicker` inheriting base `Ticker.IsRunning`; the base implementation tracks a timer that Windows does not use.
- Do not silently ignore `UISettings.AnimationsEnabledChanged` when no dispatcher queue was captured.
- Do not duplicate existing entries in `PublicAPI.Unshipped.txt`; each API should appear once.
### Issues Fixed
Fixes #35845
### Tested the behaviour in the following platforms
- [ ] Windows
- [ ] Android
- [x] iOS
- [x] MacCatalyst
🏁 Report — Final Recommendation
Comparative Fix Report — PR #35846
Candidates Compared
| Rank | Candidate | Regression/build result | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
Not rerun; derived from PR + expert feedback | Best overall. Keeps the PR's iOS/MacCatalyst/Windows scope and addresses the expert reviewer's blocking Windows lifecycle and PublicAPI defects. |
| 2 | try-fix-1 |
Passed targeted Apple Core builds (net11.0-ios26.5, net11.0-maccatalyst26.5) |
Best tested Apple-only alternative. It avoids iOS/MacCatalyst observer/dispose API churn by using a live SystemEnabled getter, but it does not address the Windows fix that the PR currently includes. |
| 3 | pr |
Gate skipped; expert review found blocking defects | Correct general direction, but currently has unresolved Windows duplicate-subscription risk, dropped Windows setting-change notifications in the no-dispatcher case, duplicate iOS/MacCatalyst PublicAPI rows, and no tests. |
Candidate Details
pr
The raw PR implements accessibility-aware PlatformTicker behavior on iOS/MacCatalyst and Windows. It sets SystemEnabled from Reduce Motion / Animation Effects and subscribes to platform change notifications. However, Windows still inherits base Ticker.IsRunning, so concurrent animations can repeatedly add CompositionTarget.Rendering handlers. Its settings callback also silently does nothing if no DispatcherQueue was captured at construction. The iOS/MacCatalyst PublicAPI files contain duplicate existing entries.
pr-plus-reviewer
This candidate applies the expert reviewer's actionable feedback to the PR in a sandbox evaluation:
- Windows
PlatformTickergets real running-state tracking and anIsRunningoverride soAnimationManager.Add()does not repeatedly callStart()while a render subscription is already active. - Windows setting-change handling no longer silently drops notifications when
_dispatcherQueueis null. - iOS/MacCatalyst PublicAPI baselines are reduced to only the actual new API rows.
This is the strongest complete fix because it preserves all platforms covered by the submitted PR and removes the blocking implementation defects.
try-fix-1
This candidate replaces the PR's iOS/MacCatalyst observer/dispose implementation with a live SystemEnabled getter:
public override bool SystemEnabled => !UIAccessibility.IsReduceMotionEnabled;It passed targeted Apple Core builds and has lower lifecycle/API risk for iOS/MacCatalyst. Its limitation is scope: STEP 5a only produced an Apple-focused candidate, while PR #35846 also fixes Windows. Because it does not include a Windows solution, it ranks below pr-plus-reviewer even though it has better targeted build evidence for the iOS/MacCatalyst slice.
Winner
Winner: pr-plus-reviewer
pr-plus-reviewer is the only candidate that both preserves the PR's complete iOS/MacCatalyst/Windows behavior and addresses the expert reviewer's blocking defects. try-fix-1 is a strong Apple-only implementation and passed targeted builds, but it is incomplete for the PR's declared Windows scope. The raw PR ranks last because it has unresolved correctness defects and no detected tests.
🧭 Next Steps — review latest findings
No alternative fix was selected for this run. Review the session findings and CI results before merging.








Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Issue Details
PlatformTickeron iOS and Windows does not respect the OS animation accessibility settings.ValueAnimator.AreAnimatorsEnabled()and the energy-saver / duration-scale listeners.Root Cause of the issue
iOS
Windows
Android wires this up correctly:
Description of Change
Accessibility and Animation Behavior:
PlatformTickernow observes system accessibility settings—on Windows, it listens to the "Show animations in Windows" setting, and on iOS/MacCatalyst, it respects the "Reduce Motion" setting. The ticker automatically enables or disables animations based on these settings.Resource Management and Disposal:
PlatformTickerclasses now implementIDisposableand provideDispose()andDispose(bool disposing)methods to clean up event handlers and observers, preventing potential memory leaks.Disposemethods forPlatformTickeron all relevant platforms.Robustness Improvements:
Issues Fixed
Fixes #35845
Tested the behaviour in the following platforms
Before.mov
After-iOS.mov
Before-mac.mov
After-mac.mov
Before-windows.mp4
After-windows.mp4