Improve Android app UI and controller flows

This commit is contained in:
2026-10-09 16:43:58 +08:00
parent c0e26b97fe
commit 608229a497
90 changed files with 8103 additions and 1133 deletions
@@ -0,0 +1,95 @@
✔ derives automatic frame names from current animation name and position (1.2763ms)
✔ keeps custom frame names and restores automatic names when cleared (0.1825ms)
✔ builds non-repeating animation edit context names (0.181ms)
✔ selects saved animation preview frames by ordered durations (0.9958ms)
✔ loads every preview frame through revision-checked pagination (0.7561ms)
✔ validates configurable animation preview concurrency (1.9627ms)
✔ rejects mixed revisions instead of showing a partial animation (1.0326ms)
✔ validates frame duration only when explicitly called (1.176ms)
✔ moves selected frames as one ordered group (0.5676ms)
✔ protects an eight pixel ring around interactive drag controls (0.4859ms)
✔ reorders mixed library keys without mutating the source list (0.3325ms)
✔ restores drag eligibility after protected pointer cancellation and drag end (1.1104ms)
✔ animation workspace exposes two previews and the simplified control order (23.9095ms)
✔ normal and pixel modes expose independent ranges and presets (3.1862ms)
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.4014ms)
✔ pixel stamps clip at every canvas edge (0.2968ms)
✔ normal circle geometry remains unchanged (0.1377ms)
✔ line interpolation includes endpoints without coordinate gaps (0.3125ms)
✔ older tools migrate while v3 restores the coordinate guide choice (0.3512ms)
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.2046ms)
✔ coordinate guide ticks preserve logical values through zoom and pan (0.2702ms)
✔ pixel mode markup and grid stay accessible and non-interactive (14.9772ms)
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.9471ms)
✔ canvas view clamps scale and keeps a visible section in the viewport (0.4943ms)
✔ zooming around an anchor preserves its logical position (0.2473ms)
✔ floating editor button stays inside its safe viewport bounds (0.1309ms)
✔ canvas editor markup, guarded input, and checkpoint events stay wired (4.5038ms)
✔ normalizes and converts hexadecimal colors (3.1945ms)
✔ converts RGB and HSV boundaries (0.699ms)
✔ round trips representative colors within 8-bit rounding (0.9168ms)
✔ recent colors deduplicate, normalize, and evict the oldest (0.4437ms)
✔ formats and projects looping playback without moving paused content (1.752ms)
✔ seek dispatcher keeps one request in flight and flushes the newest position (3.93ms)
✔ topbar current display dialog exposes static close and animation controls (8.6886ms)
✔ device workspace exposes the compact immediate pure-color test flow (12.5038ms)
✔ font catalog normalization, grouping, and search are stable (3.6219ms)
✔ font picker implements commit-only searchable combobox keyboard behavior (6.5188ms)
✔ settings places unrestricted FRP maintenance at the bottom (9.7463ms)
✔ FRP editor uses raw server storage and official validation errors (2.0804ms)
✔ network diagnostics renders layered evidence (4.4397ms)
✔ unavailable controls never masquerade as indefinite loading (9.4291ms)
✔ action controls do not bypass the shared state module (14.0548ms)
✔ HTTP requests time out with a stable user-facing error (10.9642ms)
✔ demo library actions stay black, explain restrictions, and preserve copy (1.7026ms)
✔ sortable cards protect controls and keep demo cards fixed (1.9263ms)
✔ media import workspace exposes streaming upload, crop controls, and queue polling (2.0486ms)
✔ free framing starts from the complete source and keeps one pixel visible (1.1908ms)
✔ free framing copy is stable and catalogued (0.1702ms)
✔ upload action has visible ordinary-build copy (0.3722ms)
✔ media naming happens after analysis and conflicts keep the draft (0.2871ms)
✔ awaiting-settings cards survive polling without hiding server transitions (0.2058ms)
✔ old scene migration rejects unknown fields and duplicate text without filtering (71.3308ms)
✔ PNG compression round trips sparse and full brush pixels without DOM (8.2936ms)
✔ blank and black are distinct; independent backgrounds follow layer order (5.6738ms)
✔ disabled background colors stay independent through storage and copy (21.0577ms)
✔ extended pixels survive storage but never enter the central output (9.418ms)
✔ move preview does not mutate source; confirmed clipping removes only outside ink (25.3666ms)
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (9.4652ms)
✔ multiple text groups isolate edits, copies and IDs (0.5377ms)
✔ strict v2 storage protects unknown data and the final brush invariant (7.1636ms)
✔ creates a fixed 64x64 RGB scene (11.4014ms)
✔ serializes pixelRgb as base64 and round trips an independent scene (54.9539ms)
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (45.076ms)
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (20.6105ms)
✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.6419ms)
✔ preserves and blocks a damaged stable draft (0.4874ms)
✔ does not discard a damaged higher-priority legacy key during fallback migration (3.3709ms)
✔ rejects damaged scene roots while skipping only damaged elements (8.7487ms)
✔ normalizes text fields and creates a centered lowercase ok element (0.4622ms)
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (17.8965ms)
✔ supports independent add, update, and delete operations for multiple text elements (0.8215ms)
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.502ms)
✔ alpha-composites full RGBA layers in array order without mutating inputs (2.4435ms)
✔ settings brightness explains an active temporary display-test override (12.3309ms)
✔ settings exposes full OTA upload progress and service recovery polling (6.7881ms)
✔ settings automatically opens and safely copies a detailed OTA failure log (4.2111ms)
✔ settings exposes a transactional performance-mode switch with the fixed warning (2.3383ms)
✔ settings exposes persisted animation preview concurrency below performance mode (2.3375ms)
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.8657ms)
✔ template manager uses a monitor and unified four-row card actions (18.9569ms)
✔ animation editing backs up and restores template edit ownership (3.8261ms)
✔ special editor exposes the agreed modes and guarded editing flow (9.4519ms)
✔ latched WiFi draft state remains dirty until explicitly cleared (3.7375ms)
✔ WiFi settings expose independent network and prompt-delay controls (5.8772ms)
✔ workspace order resolves saved ids and appends new registrations (1.7218ms)
✔ workspace order movement is immutable and respects both boundaries (0.3358ms)
✔ drawer exposes one editable list and commits only from the save action (8.5284ms)
ℹ tests 87
ℹ suites 0
ℹ pass 87
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 866.8466