feat: Compose Multiplatform migration (Android / Desktop / iOS) — ready for review - #358
Open
rosuH wants to merge 488 commits into
Open
feat: Compose Multiplatform migration (Android / Desktop / iOS) — ready for review#358rosuH wants to merge 488 commits into
rosuH wants to merge 488 commits into
Conversation
rosuH
marked this pull request as draft
June 26, 2026 16:24
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.
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Compose Multiplatform / Kotlin Multiplatform migration for EasyWatermark, reconstructed as a sanitized fast-forward history with no repository evidence archive.
:sharedowns the cross-platform domain, repositories, Session state machine, render geometry/pipeline, and shared Compose UI.CommonWatermarkPipelineis the Desktop/iOS production render spine; Android keeps its qualified platform raster edge.L0 sanitized integration
master.Local integration gates
Lint remains informational/fail-open, matching the PR workflow policy.
Runtime coverage
Simulator and unsigned-package proof is not release signing or physical-device certification.
Status
DONE_WITH_CONCERNS
Remaining non-blocking release/quality lanes:
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.