Skip to content

0.6.0 — Widget kit expansion, transitive API check, verified device smoke

Choose a tag to compare

@royt93 royt93 released this 23 Oct 13:47
· 50 commits to main since this release
  • Widget kit expansion, additive only: the public API check reports no removed export. The new service-state widgets are presentation-only: pass plain state and callbacks, your code calls the service. Constructors that validate input at runtime are not const. Failures show generic copy, and a pending call locks the buttons. Some widgets take an explicit status from the caller instead of inferring success from a callback that returns.
  • The API check (tool/api_compatibility.dart) now follows local export barrels (including show/hide, relative paths and cycles) and fails loudly on export forms it cannot resolve. It is still a regex scanner, not the Dart analyzer: class fields and getters are not covered, so a break there is not detected.
  • Added save-recovery widgets CloudSaveStatusCard, SaveConflictPicker (keep local / use cloud, each with inline confirmation) and CheckpointResumeCard (confirm before discarding a checkpoint).
  • Added content-delivery widgets ContentPackStatusCard, ScenePreloadStatusPanel and ContentRevisionHistoryPanel. The panel lists metadata only (opaque revision reference, version, label, time) and never a checksum or content body; restoring needs confirmation, and the caller performs the rollback (for example RemoteContentPack.rollbackToChecksum) and refreshes its content.
  • Added offline-delivery widgets OutboxQueueStatusCard and OutboxConflictSummaryPanel. Neither shows a queued payload or key; the conflict panel works on caller-approved labels and opaque references, and accepting the remote version states that it does not undo local effects.
  • Added PlayerDataRightsPanel (export, plus erase behind inline confirmation, for PlayerDataRightsService), PrestigeReadinessCard (progress toward the threshold; the button is enabled only when ready, and the caller should confirm, for example with PrestigeConfirmationCard.show, before calling PrestigeService.prestige) and CooldownActionButton (disabled while a PersistentCooldownService cooldown runs). The cooldown gate is UI only: re-check the service inside your tap handler.
  • Added ConsentPreferencesPanel (ongoing per-category choices with explicit granted/denied/unknown status; the caller applies the change, for example ConsentStateService.grant/deny), SyncStatusCard (idle/syncing/synced/failed state with a retry button for achievement or leaderboard sync; the caller maps its SdkResult to the status) and BatterySaverIndicator (banner while the caller holds performance reduced for low battery; renders nothing when inactive).
  • Added RemoteKillSwitchPanel (device-local kill behind inline confirmation, plus clear for an existing local override; it never re-enables a remotely killed feature and shows only caller-sanitized text), PlatformCapabilityMatrix (read-only supported/unsupported list shown by icon and text, with a note that values are platform defaults rather than a live check) and DeepLinkResultCard (generic outcome per status; it never renders the link, its parameters or an exception, so the caller maps DeepLinkHandleResult to a status).
  • Added SessionTimelineInspector (bounded, caller-formatted session-relative history; never accepts raw controller metadata), EconomyCertificateStatusCard (displays verification status and never accepts balances, certificate data or the secret; “valid” means signature checked, not player honesty) and GuardrailStatusPanel (read-only caller-supplied rollout rows, without new read APIs or actions on ShadowActivationController).
  • Added MemoryWatchdogPanel (bounded caller-fed debug diagnostics; detector only), AnnouncementPreviewCard (shows caller-resolved localized text and invokes a caller preview callback) and RewardedAdResultCard (caller-owned seam state; it never grants a reward, which the caller grants exactly once after showRewardedAd returns true).
  • Added AnalyticsQueueStatusCard (caller-supplied queue snapshot: counts and generic status only, never event names or payloads) and SaveRestorePreviewPanel (read-only preview of what a restore would change, with restore behind inline confirmation; the caller performs the restore).
  • Added RemoteConfigHealthCard (source and schema-violation count only; no keys or values), ReminderPreferencesPanel (caller-owned preferences; notification delivery may be delayed or skipped), and ConnectivityStatusCard (reachability/queue count; queued work drains automatically when online).
  • Added RewardPlanPreviewCard (caller-formatted reward lines with explicit ready/stale/executing/applied/failed status; a preview is not a grant, and the caller sets applied only from a committed record), ReplayVerificationResultCard (outcome and randomness checks reported separately, with a skipped randomness check shown as skipped, never as a match; it is not proof of fair play) and RewardAuditTrailPanel (sanitized, bounded rows and one retry-all action for unfinished rewards; the caller refreshes the rows afterwards because completion of the retry does not mean every record committed).
  • Added OnboardingFlowQueueCard (read-only queue of caller-mapped onboarding flows with seen/next/pending state and an optional mark-seen action; flow ids identify rows in callbacks and are never shown) and ExperimentVariantAssignmentCard (caller-mapped experiment assignments; the per-device anonymous id never enters the widget, and the override action is debug-only, so pass the callback only in debug or profile builds).
  • Added accessibility and player-comfort widgets, retention/progression/social HUD widgets and juice/motion widgets (see common_widgets.dart and the showcase screen for the full list).
  • Verified (see each task spec in doc/task/done/ for the exact run): Linux + Flutter 3.35.1 golden baselines per widget wave, full root and example suites, API compatibility, analyzers, five quality gates and CI. Wave 23 device smoke ran on a Samsung S24 Ultra; Waves 26, 27, 29, 31 and 32 ran on a TECNO KJ7; other waves' device results are recorded in their task specs. Showcase and test callbacks are UI fixtures held in memory: they prove layout and callback wiring, not real certificate verification, rewarded-ad payout, platform screen-reader announcement, memory-leak freedom, 60 FPS or persistence.