KMP migration M1: multiplatform core + Compose UI, Android target#15
Merged
Conversation
…ng URL The server field is device_uudid (as sent by the iOS SDK), not device_uuid, so the UUID never showed up on the dashboard. Navigation stack was never implemented on Android; it now reports the host app's activity stack (Android) or view controller chain (iOS), excluding Updraft's own screens. BASE_URL_STAGING pointed at u2.mqd.me which no longer resolves; baseUrl stays overridable for self-hosted instances.
Navigation stack is captured when feedback is triggered, before the Updraft UI covers the app. Apps using single-activity navigation (Compose Navigation, Navigation Component) can plug their library in via Updraft.navigationStackProvider; the platform default reports the activity stack (Android) or view controller chain (iOS). Also fixes the package filter that swallowed host activities whose package merely shares the com.appswithlove.updraft prefix, like the sample app.
The legacy iOS SDK never used shake detection; its feedback trigger was UIApplicationUserDidTakeScreenshotNotification. The accelerometer-based shake also cannot work on the simulator (no accelerometer), so shake appeared broken there. Both triggers are now active on iOS: screenshot (all environments, legacy parity) and shake (physical devices).
Shake reaches iOS apps as a responder-chain motion event, not as accelerometer data, so the CMMotionManager detector never fired on the simulator and required nothing in the responder chain to consume the event on devices. The SDK now swizzles UIWindow.motionEnded:withEvent: at start, calling through to the original implementation. The IMP is a staticCFunction rather than a Kotlin lambda: block bridging would marshal the NSInteger motion argument as an object and crash.
The repo stays and becomes the single home for Android + iOS: root project renamed to updraft-sdk, POM name/URLs point at the new repo slug, README repositions the SDK as Kotlin/Compose Multiplatform and notes that updraft-sdk-ios is superseded. GitHub-side rename and archiving updraft-sdk-ios remain manual release-time steps.
… filter Superseded runs on the same ref are cancelled, ~/.konan is cached (the Kotlin/Native toolchain was re-provisioned on every macOS run before), gradle/actions/setup-gradle replaces the basic setup-java cache and validates the wrapper jar, markdown/docs pushes no longer trigger builds, timeouts bound hung runs, and the redundant pull_request trigger and chmod steps are removed (exec bit is committed).
…rsions Publishing previously ran no tests: a bad push to production would ship broken artifacts that Maven Central cannot replace. The job now runs the full build plus iOS simulator tests first, fails fast if the version is already tagged, publishes under a 'maven-central' GitHub environment (protection rules can be added in settings), and uses the maintained softprops/action-gh-release instead of the archived actions/create-release. JDK unified to 17 to match CI.
The SDK is built with Kotlin 2.2 / CMP 1.9: Kotlin Android consumers need >= 2.1 (metadata n+1 rule), KMP/CMP consumers >= 2.2, Java-only and XCFramework consumers are unaffected. The README lists the exact compile-time errors older projects will see and the fix.
The legacy SDK fetched strings from Loco into Android res/; Compose Multiplatform resources use the same strings.xml format, so updateLoco now writes into updraft-ui-compose commonMain composeResources and both platforms share the result. The API key moves from the build file (exposed in git history — rotate it) to local.properties.
michelutke
requested review from
vladislavfrolov
and removed request for
yannickpulver
July 23, 2026 06:51
Loco is the source of truth again: asset IDs renamed to underscores (compose-resources rejects dots), the ten strings missing from Loco added with German translations, and the draw-hint copy fixed there. This file state is the updateLoco output: alphabetical order and the removal of two unused legacy plurals (relative-age formatting was never implemented in 2.0).
Restores the legacy 'Released 3 weeks ago. You're currently on version X.' message using kotlin.time (no new dependency). Buckets: just now under an hour, then hours/days/weeks/months/years plurals. The plurals live in plurals.xml so updateLoco, which only rewrites strings.xml, cannot clobber them. Falls back to the previous message when create_at is missing or unparseable.
KMP migration M2: iOS support, device verification round, CMP rebrand
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.
What
Full rewrite of the Updraft SDK as Kotlin Multiplatform (milestone M1: Android target only, iOS follows in #14). One artifact becomes three:
:updraft-corecom.appswithlove.updraft:updraft-core:2.0.0Flow,Updraft.start(UpdraftSettings),Updraft.events: SharedFlow<UpdraftEvent>, update/feedback interactors,expect/actualplatform seams (shake, screenshot, key-value store, app info, foreground observer, URL opening).:updraft-ui-composecom.appswithlove.updraft:updraft-ui-compose:2.0.0FeedbackScreen(annotate + form),DrawingCanvas(FreeDrawView replacement with undo/redo), dialogs,UpdraftEventHost. Strings en/de via compose-resources.:updraft-sdkThe entire legacy stack (~3500 lines of Views/Fragments/FreeDrawView/Retrofit/RxJava2) is deleted.
Why
updraft-sdk-androidandupdraft-sdk-iosseparately with diverging feature sets.How
onUpload→callbackFlow<Double>,expectSuccessso HTTP errors fail the upload flow).SharedFlow<UpdraftEvent>that the wrapper (or the host app) collects.commonMain; drawing is a ~100-line custom controller (path list + undo/redo stacks) instead of the FreeDrawView port. Annotation strokes are recorded in canvas space and re-projected onto the full-resolution screenshot at send time so uploads align.expect/actualfunctions, kept deliberately small so the iOS milestone only adds actuals.Settings→UpdraftSettings,Updraft.initialize(context, settings)+getInstance()?.start()→Updraft.start(settings). Migration table in the README.docs/kmp-migration-m1-status.md— device verification happened on the M2 branch and found real issues there, see KMP migration M2: iOS support, device verification round, CMP rebrand #14.Decision: Compose UI also for Views-based Android apps
updraft-sdkships the Compose feedback UI to all Android apps, including classic Views apps — there will be no separateupdraft-ui-viewsartifact.UpdraftFeedbackActivity,UpdraftOverlayActivity), so nothing Compose-related touches the host app's view hierarchy or theme.updraft-coreonly (logic, no UI, no Compose) and bring their own feedback screen — documented in the README ("bring your own UI").Closes #12 — the legacy Views feedback flow crashed on Jetpack Compose UIs; the rewritten Compose-based flow replaces it entirely.