Skip to content

The glass look, a device bar and a status bar, one summary before a flash, and the fixes left from the review - #38

Merged
ifoknr merged 29 commits into
masterfrom
design-3.0
Nov 10, 2026
Merged

ifoknr merged 29 commits into
masterfrom
design-3.0

Conversation

@ifoknr

@ifoknr ifoknr commented Nov 9, 2026 •

Copy link
Copy Markdown
Owner

On top of the review branch (#37, itself on #36). Two halves: the app's new look, and the fixes and suggestions the review left for later. The version is not bumped; the notes sit under ## Unreleased in CHANGELOG.md until a release is decided.

The look

  • Glass: Palette.Dark is grey glass, Palette.Light frosted glass: translucent surfaces over a sky gradient, hairline edges, one accent. Cards 16 px, buttons 10 px, chips as pills; dialogs to match. New keys: Glass, GlassLine, SkyBrush, AccentGradient, OkSoft/OkLine, AppIcon.
  • Icon: a screen with the bolt in glass, grey for dark and frosted for light (tools/icon/glass-*.svg, rendered by render_glass.js into Assets/, big_icon.png and icon.ico).
  • Rail: pages in three groups (Phone, Files, More tools); Settings and About at the foot; the chosen page in glass with its icon in the accent; the version read from the code.
  • Device bar above every page: product, serial, slot, mode, lock state, a Restart menu, Disconnect, USB check, and Stop while a command runs. Status bar below: how many phones fastboot sees, the last command and how long it took, the fastboot/adb versions.
  • Flash: the result is a strip over the page (partitions written, time, both slots, deferred ones) with Restart and Open the log, instead of a box; the log sits beside the queue and runs the page's height; each row shows a state glyph and a critical badge where a wrong image can brick the phone.
  • Samsung: the firmware's model against the phone's in one row; the file list with part badges, MD5 chips and a readable size; one main button (the Download-mode flash), the rest secondary.
  • Empty pages (Payload, Image Tools, Samsung, Build Super): a dashed drop frame with the formats they take.
  • Root: four numbered steps, the current one lit, the done ones ticked, the rest dimmed; a "before you start" card.
  • Settings: the font preview card is gone (the page is its own preview); driver rows carry a green or red dot and the install button only when missing; Check now sits by the version; a glass-backdrop switch (Windows 11 Mica); a shortcuts card. Chinese, Japanese and Korean (about an eighth translated) leave the list until complete; a saved choice still applies.
  • About: a glass hero with the new icon; the links as a row of icon buttons. Terminal: output on top, the line below, the suggestions under it.
  • Shortcuts: Ctrl+O opens a file on the page, Ctrl+L the log, F1 the page's help, Ctrl+, Settings.

Behaviour

  • One summary before a payload flash: the file, the phone (serial · product · slot · mode) and every point to know (pending update, missing logical partitions, images without a hash, super space, both slots). A point that can cost data needs "I have read this" ticked. Five questions became one.
  • The phone named in every confirmation: flash, erase, slot switch, boot once, delete.
  • A log file per flash: %APPDATA%\Fastboot Studio\logs\flash-<date>-<serial>.log (newest 30 kept); Logs has Open log folder.
  • A hung fastboot can be stopped: every step command has a 15-minute deadline and the bar's Stop kills it; the error says it was stopped.
  • Root asked for only when turned on: a phone over ADB is asked for su only with the new Settings switch (off by default).
  • Odin: the size limit reads the sector size from the PIT (v1 block size; v2 device type 2 = eMMC 512 bytes, 8 = UFS 4096; neither known → the UFS limit blocks, the eMMC one warns, MayNotFit). Files are flashed in Odin's order (BL, AP, CP, CSC) whatever order they were picked in.
  • Terminal asks before flashall, update, set_active/--set-active, delete-logical-partition, snapshot-update.
  • Images are written beside and renamed once complete (AtomicFile: payload extraction, super extraction, sparse↔raw, rawprogram, super build): a stopped run never leaves a file that looks finished.
  • CI: every GitHub Action pinned to its commit. The screenshot script answers the one summary and reads the result strip.

Checks

  • Core tests: 440 pass (12 new: Odin size by device type, Odin order, the new Terminal risks, AtomicFile).
  • WPF app builds (net8.0-windows, Release, win-x64). Every AutomationId the screenshot script uses is still in the XAML.
  • The Windows screenshot run (the end-to-end test: 12 partitions flashed, 20 backed up, every page captured in both languages) runs on this branch.

ifoknr and others added 28 commits November 2, 2026 12:12
…rom dl.google.com, checked against Google's catalogue (r13 pinned by SHA-256), added with pnputil
…as Heimdall sends them; files read and checked before anything is sent (MD5, LZ4); a plan checked against the phone's PIT and model; the stand-in phone takes flashes; tests
…checked, the plan with its warnings, the flash with progress, the result; help, README and CI screenshots; v2.9.0 notes
…nst a new reading; PIT v1 block sizes count in the size check
…files closed

Flashing
- Boot image check: the page is locked while the image is read, and the flash only
  goes to the phone the image was checked for; a phone removed or swapped meanwhile
  stops it.
- Root page: a step that throws is shown as a failure; before, "flashed, restart?" could
  follow a flash that never ran, and "fastboot reboot" went out with no serial.
- Partition names and paths go to fastboot through one quoting helper; a payload naming
  a partition that cannot sit on a command line ("-w") is refused; the Terminal and the
  Backup poller stay out during every fastboot command, not only payload flashes.
- Current slot read as "_a" is handled like "a" (slot switch, vbmeta question).

Odin
- A BL or CP for another model next to the right AP is refused (it only warned as
  "mixed" before); a tar whose name is not Samsung's is flagged, its model is unknown.
- Empty files are refused; PGPT, SGPT and PIT are protected and not offered as targets;
  a failure before the first byte still ends the session.
- The phone leaving during the confirmation no longer crashes the window.
- Tar listing: a size that would wrap the bounds check, a long-name entry claiming
  gigabytes, and pax "size" records (entries over 8 GiB).

Files that are damaged or crafted
- Payload: a blob is refused as soon as it inflates past its blocks (was: held whole in
  memory first); zip offsets are checked against the file; NUL/CON/COM1 are not file names.
- super: extents past their block device, slot count 0 and tables past the metadata
  area are damaged metadata, not partitions to extract.
- cpio: sizes near 2 GB ended in an exception; ramdisks are listed in long arithmetic.
- rawprogram: SECTOR_SIZE_IN_BYTES of 0 stacked every piece at offset 0.
- sparse parts: a part that fails to open no longer leaks the ones already opened.

Elsewhere
- settings.json: one writer at a time, written beside and moved over.
- Payload extraction asks before replacing images already in the folder; the Backup
  page no longer selects a device twice.
- Window chrome buttons carry names for screen readers; the Odin totals line wraps.
- CI: screenshot commits as IFOKNR, the branch name through the environment,
  release permissions only on the release job.
- README (both languages), the XDA post and the driver notes match 2.9.
- Tests for each new check (428 in all).
…erminal risks, images written beside then renamed, actions pinned by commit

- The Odin "too big" check reads the sector size from the PIT: a v1 block size, or the
  entry's device type on v2 (2 = eMMC, 512 bytes; 8 = UFS, 4096). When the PIT says
  neither, the UFS limit blocks and the eMMC limit is a warning (MayNotFit).
- A firmware is flashed in Odin's order (BL, AP, CP, CSC) whatever order the files
  were picked in.
- The Terminal asks before flashall, update, set_active (and --set-active),
  delete-logical-partition and snapshot-update.
- Extracted and built images (payload, super, sparse, rawprogram, super build) are
  written as .part and renamed once complete (AtomicFile), so a stopped run leaves
  nothing that looks finished.
- Every GitHub Action is pinned to its commit.
- 440 tests.
…tion, a log file per flash, a stop for a hung fastboot, root asked for only when turned on

- The questions before a payload flash (pending update, missing logical partitions,
  images without a hash, super space, both slots) are one dialog: what is written,
  to which phone, and every point to know; a point that can cost data needs the
  "I have read this" box.
- Every flash, erase, slot switch, boot-once and delete confirmation ends with the
  phone's serial, product, slot and mode.
- While a payload is flashed the log is also written to
  %APPDATA%\Fastboot Studio\logs\flash-<date>-<serial>.log (newest 30 kept); the
  Logs page opens the folder.
- Every step command (flash, erase, boot…) has a 15-minute deadline and can be
  stopped (cancelCurrent, wired to the device bar next).
- A connected phone is asked for root (su) only when the Settings switch is on.
…ar, the Flash page's result strip, the new icon

- Palette.Dark (grey glass) and Palette.Light (frosted): translucent surfaces over a sky
  gradient, hairline edges, one accent; Glass/GlassLine/SkyBrush/AccentGradient keys.
- Cards 16 px, buttons 10 px, chips as pills, inputs and segments to match.
- The rail: pages in three groups (Phone, Files, More tools), Settings and About at the
  foot, the chosen page in glass with its icon in the accent, the version read from the
  code.
- A device bar above every page: product, serial, slot, mode, lock state, Restart menu,
  Disconnect, USB check, and Stop while a command runs. A status bar below: how many
  phones fastboot sees, the last command and how long it took, the tools' versions.
- Flash: the result is a strip over the page (partitions written, time, both slots,
  deferred), the log sits beside the queue and runs the page's height, each row shows a
  state glyph and a "critical" badge where a wrong image can brick the phone.
- The glass icon (tools/icon/glass-*.svg, render_glass.js): a screen with the bolt, grey
  glass for dark, frosted for light; big_icon.png and icon.ico from it.
- The screenshot script answers the one flash summary and reads the result strip.
… Settings, About, Terminal, shortcuts, Mica

- Samsung: the firmware's model against the phone's in one row at the top; the file
  list with part badges, MD5 state chips and a readable size; one main button
  (Download-mode flash) with the rest secondary.
- Payload, Image Tools, Samsung and Build Super open on a dashed drop frame with the
  formats they take.
- Root: four numbered steps; the current one lit, the ones done ticked, the rest
  dimmed; a "before you start" card.
- Settings: the font preview card is gone (the page itself is the preview); the driver
  rows carry a green or red dot and the install button only when missing; check-for-
  updates sits by the version; a glass-backdrop switch (Windows 11, Mica); a shortcuts
  card.
- About: a glass hero with the new icon; the links as a row of icon buttons.
- Terminal: output on top, the line below it, the suggestions under the line.
- Ctrl+O opens a file on the page, Ctrl+L the log, F1 the page's help, Ctrl+, Settings.
Chinese, Japanese and Korean have about an eighth of the strings translated, so they
leave the language list (and the tour) until they are done; a choice saved earlier still
applies.
…ild Super scrolls on short windows

Seen on the first Windows run: the rail's DockPanel laid the pages out left to right, the
phone's name in the device bar was drawn black, and at 720 px the Build Super list had no
height left, so its rows were not there to read.
zh-CN and ja-JP now carry all 1104 strings (984 and 983 added, a dozen old ones corrected). The
languages return to Settings once Korean is complete too.
…or not

The Odin window reads a phone in Download mode without any firmware open, so its button
cannot live only inside the open-firmware view; the card keeps a second, larger one.
…ack under software rendering

Seen in the light-theme screenshots: the page area was black and every glass surface grey.
…lass

Page #121214, cards #1B1B1F, raised #26262B, hairlines #2C2C32, accent #7AA2FF. WPF draws no
blur behind a translucent card, so the glass read as washed-out grey; solid tones look the
same on every machine.
On by default it cleared the window's background; under software drawing (the default) Windows
paints nothing there, so every page sat on black. The real cause of the black screenshots.
…peats the phone chip the bar shows

A corner radius of 99 on a 24 px chip made WPF draw an ellipse.
@ifoknr
ifoknr changed the base branch from review-2.9 to master November 10, 2026 16:26
@ifoknr
ifoknr merged commit a19b231 into master Nov 10, 2026
2 checks passed
ifoknr added a commit that referenced this pull request Nov 10, 2026
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