Skip to content

feat: Compose Multiplatform migration (Android / Desktop / iOS) — ready for review - #358

Open
rosuH wants to merge 488 commits into
masterfrom
feat/migrate_to_compose
Open

feat: Compose Multiplatform migration (Android / Desktop / iOS) — ready for review#358
rosuH wants to merge 488 commits into
masterfrom
feat/migrate_to_compose

Conversation

@rosuH

@rosuH rosuH commented Aug 30, 2025

Copy link
Copy Markdown
Owner

Summary

Compose Multiplatform / Kotlin Multiplatform migration for EasyWatermark, reconstructed as a sanitized fast-forward history with no repository evidence archive.

  • :shared owns the cross-platform domain, repositories, Session state machine, render geometry/pipeline, and shared Compose UI.
  • Android, Desktop, and iOS are thin platform shells around shared policy, with native picker/save/share/decode/encode edges.
  • CommonWatermarkPipeline is the Desktop/iOS production render spine; Android keeps its qualified platform raster edge.
  • Route, selection, offset, and export ownership are centralized in Session and protected by fail-closed architecture fitness checks.
  • Room schema v1 and the executable macrobenchmark fixture remain compatibility assets.

L0 sanitized integration

  • Replayed 58 non-empty product/test/CI commits from the existing PR base; skipped 49 scratch-only commits.
  • Added one test-isolation repair commit and one lightweight tracker/fitness closeout commit.
  • Removed the migration evidence archive and completed issue history from the published tree.
  • Final product tree matches the graduated local tree outside the explicit tracker/fitness and authorized test-only allowlists.
  • Update was an ordinary fast-forward from the existing PR branch; no force push, merge, or rebase of master.

Local integration gates

Gate Result
Ownership fitness G0–G7 PASS, including adversarial fail-closed scan
Android unit tests 105 passed, 0 failed
Shared Desktop tests 333 passed, 0 failed
Android debug assemble PASS
Desktop compile + headless flow PASS
Shared iOS Simulator tests PASS
Generic iOS Simulator Xcode build PASS
Product-tree equivalence + Room/fixture identity PASS
History/object hygiene PASS

Lint remains informational/fail-open, matching the PR workflow policy.

Runtime coverage

  • Android: emulator-based import, edit, preview, and export contracts.
  • Desktop: headless and interactive import/drop, preview, exact-path save, export, and reveal flows.
  • iOS: Simulator fixture-driven selected-source identity, preview, final export, and lifecycle contracts.

Simulator and unsigned-package proof is not release signing or physical-device certification.

Status

DONE_WITH_CONCERNS

Remaining non-blocking release/quality lanes:

  • physical-device accessibility and multi-device labs;
  • signed DMG/MSI/DEB distribution;
  • multi-API Android instrumented farm;
  • hard CI performance SLOs;
  • future scene-scoped Session design if iOS multi-window support is enabled.

Review / release boundary

This PR update does not merge, tag, release, or certify signed distribution. The next decision is owner review and merge after all required GitHub checks are green.

@rosuH rosuH closed this Aug 30, 2025
@rosuH rosuH reopened this Jun 26, 2026
@rosuH rosuH changed the title Feat/migrate to compose Advance Compose/KMP migration checkpoint Jun 26, 2026
@rosuH
rosuH marked this pull request as draft June 26, 2026 16:24
@rosuH rosuH changed the title Advance Compose/KMP migration checkpoint Draft: Compose/KMP migration checkpoint, not merge-ready Jun 26, 2026
rosuH added a commit that referenced this pull request Jun 28, 2026
…358 conflicts)

Unblock PR #358 pull_request CI while keeping it Draft. Resolve the 6 known conflicts:
- legacy View files kept deleted: MainActivity/AboutActivity/OpenSourceActivity/LaunchView
- .gitignore: union of both sides' additive entries
- pr_pre_check.yml: preserve the migration safety net (:app:assembleDebug, :shared:desktopTest,
  :app:testDebugUnitTest, strict WATERMARK_GOLDEN goldens); adopt master scaffolding (permissions,
  concurrency, paths-ignore, workflow_dispatch, wrapper validation, setup-android); DROP master's
  draft-skip guard so Draft PR #358 still runs the safety net; do NOT adopt master's compile-only -x test
- desktop_packaging.yml untouched
Verified: :app:assembleDebug + :shared:desktopTest BUILD SUCCESSFUL. Local commit only; not pushed.
rosuH added 30 commits July 25, 2026 12:04
…ntine

Enable exportSchema for committed AppDatabase v1 JSON. Install Desktop/iOS
template seeds via temp+atomic move. Wire ReplaceFileCorruptionHandler on
okio path DataStores with corrupt-file quarantine and empty defaults.
Add G3LifecycleFaultMatrixTest for corrupt Desktop source and Session
Permission/Io terminal cleanliness; land verify-g3-fault-matrix.sh and
evidence/g3/matrix.md mapping injection rows to tests.
…hes)

Cap concurrent ewm_src staging and filmstrip decode at 3, drop host
full-res sourceBytes pin after file-first stage, enforce cache entry
budgets, and wire trimCaches/onMemoryWarning without wiping Session.
Add ClampDragBench stage logging on shared drag, Desktop preview debounce
and saveFlow, and iOS preview refresh. Capture evidence that live draft is
absent and Desktop end-to-visible is dominated by 250ms debounce plus full
encode path. No live-draft product fix; no invented SLOs.
Emit UI-only draft offsets during CLAMP drag so the decal tracks the
pointer. Desktop offset/editor preview uses in-memory DesktopPreviewRaster
(max edge 720) without the 250ms debounce or full saveFlow encode path.
Session still applies at most one offset per gesture; export/Save As remain
full-res on committed Session offsets only.
…tartup

Add ProductBaselineProfileGenerator multi-step journeys and
EditorJourneyBenchmark (share-in editor + export entry). Create missing
benchmark-rules.pro, set app benchmark non-debuggable with full R8 rules,
and land observational frame measurements without inventing H3 SLOs.
Early-release owned Android export intermediates after compose/encode;
process-wide Desktop/iOS FontFamily + resolver caches; sequential Desktop
compose and iOS export scopes; byte-budgeted iOS host image caches with
tests. Evidence under evidence/h2. No H3 SLOs; full-res export unchanged.
Surface destination and filename policy, distinct processed/succeeded/failed
counts, success-where outcome, and taxonomy-mapped export errors without raw
Throwable.message. Wire Android, Desktop, and iOS hosts; dual-write EN strings.
Evidence under evidence/i0.
Add pure EditorLayoutClass (width-primary Compact/Medium/Expanded), expanded
editor preview+controls pane, and gallery Adaptive min-cell. Hosts feed Dp
via BoxWithConstraints without platform types in commonMain. Evidence under
evidence/i1.
Add name/role/value/selected/disabled semantics for sliders, choice chips,
option carousel, gallery cards, and About switches; polite liveRegion on
export progress. Dual-write EN a11y strings; pure AccessibilitySemantics
helpers + unit tests. Device TalkBack/VoiceOver lab residual. Evidence under
evidence/i2.
Formalize Design* into EwmTheme tokens; add MotionPolicy Full/Reduced/Off with
platform reduce-motion feed (Android animator scale, iOS UIAccessibility,
Desktop Full residual). Wire BrandLogo, ProductShellHost, export wipe, and
save-sheet contentSize. Pure unit tests; evidence under evidence/i3.
Show succinct on-device / selected-only copy near Launch pick and on-device +
EXIF-strip (ADR-0009) on the shared save/export sheet. Dual-write EN strings;
pure PrivacyConfidence tests; no analytics or tracking SDKs. Evidence under
evidence/i4. Closes Stage I.
Add parallel macos-latest job to PR Checks: :shared:iosSimulatorArm64Test
and unsigned iosApp generic iOS Simulator xcodebuild. Local smoke under
evidence/j1. XCUITest remains nightly/release residual.
Codify issue 13 §J2: explicit INCLUDE-only Auto Backup / data-extraction
rules (prefs, templates, DataStore, app-owned icons); PR structural gate +
lintDebug fail-open; nightly API 23/29/34/36 skeleton without emulator farm;
release baseline-prof presence check. assembleRelease smoke green.
OS-native app-data roots with safe legacy ~/.easywatermark copy-forward;
chooser formats capability-true (no WebP without ImageIO reader); declare
installer targetFormats with explicit residual for signing/notarization.
Unsigned createDistributable remains non-release. Unit + headless + package smoke.
Classify every catalog prerelease; write stable-by-default one-slice
promotion policy with rollback pin. Zero version bumps this slice
(no bulk upgrade). Pointer in AGENTS.md to evidence/j4/.
Inventory Swift Shared consumption; baseline ObjC symbol counts; mark
implementation-only iosMain types internal. Keep classic ObjC export —
no Alpha Swift export. linkDebugFramework + iosSimulatorArm64Test green.
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.

2 participants