Skip to content

Update-available icon, What's new in the library strip, version in settings - #177

Merged
SunkenInTime merged 7 commits into
mainfrom
devin/1790044703-strip-status-icons
Sep 22, 2026
Merged

SunkenInTime merged 7 commits into
mainfrom
devin/1790044703-strip-status-icons

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Three spots for update/version/patch-note info, none of them loud.

  • Update available (UpdateAvailableIcon, lib/widgets/strip_status_icons.dart): drawn by AppWindowStrip itself just before the caption buttons, so it shows on the library and editor screens without either placing it. Exists only while an update is waiting. Direct Windows installs open the existing DesktopUpdateDialog; Store/web reopen UpdateChecker.showUpdateDialog, the same dialog the automatic check shows, so dismissing the popup too fast is no longer the last chance.
  • What's new (WhatsNewIcon): inbox icon in the library strip, right before search. Opens ReleaseNotesDialog, fed by the stable updater manifest (app-archive.json) via ReleaseNotes.parse — multiple builds of one semantic version collapse to the highest build, installed/newer builds get an Installed/Available badge. PatchNotesList is shared with the update dialog.
  • Version: muted Icarus 4.6.2 (102) at the foot of the settings navigation rail (_VersionFooter, settings_tab.dart); click copies it for bug reports. No About icon in any strip.

Plumbing: the direct Windows updater controller moved out of FolderNavigator into desktopUpdateControllerProvider so both the automatic dialog listener and the strip icon watch one controller. DESIGN.md window-chrome rules updated to match.

strategy_view_skeleton_test now wraps in ProviderScope since the strip has a Riverpod consumer. update_checker_test / windows_desktop_update_controller_test fail on main already.

Link to Devin session: https://app.devin.ai/sessions/375a43fa29284c4ba7dcf33de224fe1b
Open in Devin Desktop: https://app.devin.ai/desktop/session/375a43fa29284c4ba7dcf33de224fe1b?variant=devin
Requested by: @SunkenInTime

SunkenInTime and others added 3 commits September 22, 2026 02:40
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 75880784-a341-4134-a827-596dbb870970

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment on lines +95 to +102
static ReleaseNotesEntry? _parseEntry(Map<String, dynamic> item) {
final version = item['version']?.toString().trim();
if (version == null || version.isEmpty) return null;

final shortVersion =
_toInt(item['shortVersion']) ?? int.tryParse(version.split('+').last);
if (shortVersion == null) return null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Malformed versions reach the release dialog

A manifest entry only needs a non-empty version string and an integer build number to be accepted. A value such as not-a-semver-release with shortVersion: 999 is shown as an available release, and the release header overflows because arbitrary version text shares a non-wrapping row with the badge and date. Validate the updater version format before constructing an entry, and constrain or ellipsize the version label in the dialog.

T-Rex Ran code and verified through T-Rex

@greptile-apps

greptile-apps Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Comments Outside Diff

These findings sit on lines the diff does not cover, so they could not be posted inline. Each one leaves this list once its file changes.

  • P1 Malformed version strings are accepted and can break the release-notes dialog layout

    • Bug
      • A manifest item such as { "version": "not-a-semver-release", "shortVersion": 999, "changes": [...] } is accepted, rendered as an Available release, and causes A RenderFlex overflowed by 44 pixels on the right in the release-notes dialog. This produces invalid release content and a Flutter rendering assertion rather than a safe unavailable/filtered result.
    • Cause
      • ReleaseNotes._parseEntry at lib/const/release_notes.dart:95-102 only requires a non-empty version and an integer shortVersion; it does not validate the version format. _ReleaseList at lib/widgets/dialogs/release_notes_dialog.dart:70-96 places the arbitrary version text, badge, spacer, and optional date in a non-wrapping Row.
    • Fix
      • Validate version against the updater’s supported version format before constructing an entry (and skip invalid items). Also make the title row resilient to untrusted long text, for example by constraining/ellipsizing the version text with Expanded or Flexible.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Desktop UI check on Linux (with a temporary, uncommitted try/catch around the custom-cursor init, since custom_mouse_cursor has no Linux implementation and the app won't launch here on main either).

Passed: icon alignment on library and editor; live release notes with 4.6.2 marked Installed, dated, bulleted, scrollable, dismissable; About popover content; Copy version writes Icarus 4.6.2+102 and toasts; no overlaps at the 1280px minimum; strip drag still moves the window; no new exceptions or layout overflows.

Live release notes About
Live release notes About

Not attributable to this PR:

  • Strip tooltips (new icons and the existing Library button) don't show on Linux; the Settings tooltip below the strip does. Pre-existing, root cause not chased.
  • No browser opened for Discord (new and existing link alike): the VM has no x-scheme-handler/https.

Untested: Windows updater path and update icon, loader/error states of the What's new dialog.

… in settings rail

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration devin-ai-integration Bot changed the title Top-row icons: update available, What's new, About Update-available icon, What's new in the library strip, version in settings Sep 22, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Verified the 6d0b53d7 layout change on Linux (same temporary cursor-startup bypass as before, removed after testing).

  • Library inbox sits immediately left of search and opens live release notes.
  • Editor strip has no inbox/info icons before the caption buttons.
  • Settings rail footer fits at 1280x720, shows Icarus 4.6.2 (102); click shows "Version copied" and copies exactly that text.
  • No new Dart exceptions or layout overflows.
Library strip Settings rail at minimum size
Library strip Settings rail footer

Updater, Discord, tooltip and network-failure paths were not retested in this run.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

What's new now puts each release in its own card (1bc54f07). Checked at 1280x720 on Linux; scrolls cleanly, no overflow or new exceptions.

Initial Scrolled
Initial cards Scrolled cards

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Release cards now use Settings.raisedSurface(16) instead of borders and dividers (02084c38). Checked at 1280x720, no overflow or new exceptions.

Initial Scrolled
Raised cards Scrolled cards

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Checked bd19a76e at 1280x720: dialog description removed, release cards are a flat secondary fill with 16px corners (no gradient, rim or shadow). No new Dart exceptions or overflow errors.

Flat release cards at 1280x720

Used the temporary Linux custom_mouse_cursor bypass to launch; reverted afterward.

@SunkenInTime
SunkenInTime merged commit eeea370 into main Sep 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant