feat: text metrics (DasherCore v0.2.4) + version line (RFC 0016) - #19
Merged
Conversation
… #56) Bumps third_party/DasherCore to v0.2.4 and wires the text-size callback: the engine measures labels with the same Paint (typeface + size transform) the canvas draws opcode-5 text with, replacing the codepoints x size/2 estimate whose error compounds down the label chain and jumbles deep-zoom text. - jni_bridge: textSizeCallback marshals into Kotlin NativeBridge.onTextSize (same cached-methodID pattern as the other engine callbacks); nativeSetTextSizeCallback / nativeTextMetricsChanged bindings. - DasherCanvasView.measureGlyphText applies the canvas's exact opcode-5 size transform (x2.5, floored at 8) so measurement and drawing agree; glyphFontName changes fire textMetricsChanged. - MainActivity and the IME both install their own measurement (the NativeBridge listener is static, so the IME must not inherit the Activity's canvas). Signed-off-by: will wade <willwade@gmail.com>
One quiet 'Dasher <version>' line at the bottom of Settings -> Privacy, reading AnalyticsService.appVersion (BuildConfig.VERSION_NAME) - the same value analytics already reports, so UI and telemetry cannot disagree. appVersion() collapses into a public val as the single source. Interim home pending the About section (RFC 0006). Fixes #17. Signed-off-by: will wade <willwade@gmail.com>
willwade
force-pushed
the
feat/version-in-privacy
branch
from
August 22, 2026 09:22
7e00d45 to
3ef3444
Compare
willwade
added a commit
to dasher-project/Dasher-Apple
that referenced
this pull request
Aug 24, 2026
Fixes #35. ## What - `AnalyticsPrivacySection` footer gains a plain `Dasher <version>` line — shown on iOS, macOS and visionOS (every target that renders the shared Privacy section) - New `AnalyticsService.displayVersion` (public static) reads `CFBundleShortVersionString`; the private `appVersion` used by analytics events now routes through it, so **the UI line and telemetry share one constant by construction** ## Why Per [RFC 0016](https://github.com/dasher-project/governance/blob/main/rfcs/0016-version-in-settings.md): support triage needs the build version without asking users to guess (packaged installs often can't tell). Interim placement in Privacy until RFC 0006's About section exists. Mirrors [Dasher-Android #19](dasher-project/Dasher-Android#19) and [Dasher-GTK #55](dasher-project/Dasher-GTK#55). ## Verification - `xcodebuild -scheme DasherMac` (CI gate): BUILD SUCCEEDED, 0 errors - By construction: shown string == `app_version` in analytics events Signed-off-by: will wade <willwade@gmail.com>
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.
Supersedes #16 (squash-merged into its stacked base by mistake) and #18 (auto-closed by the same). One PR, two commits, net diff identical to those two combined.
1. Real text metrics for label layout (DasherCore #56 / v0.2.4)
The engine laid out node labels using a
codepoints × fontSize/2estimate whose error compounds down the label shunting chain — deep-zoom text degenerates into jumbles (user-visible on Windows; same engine path here). Wiresdasher_set_text_size_callbackend to end:textSizeCallbackmarshals intoNativeBridge.onTextSize(same cached-methodID pattern as the other callbacks); newnativeSetTextSizeCallback/nativeTextMetricsChanged.DasherCanvasView.measureGlyphTextmeasures with the same Paint + size transform (×2.5, floor 8) the canvas draws opcode-5 text with, so layout and drawing agree; font changes invalidate cached metrics.2. App version line in Settings → Privacy (RFC 0016, fixes #17)
Quiet
Dasher <version>line readingAnalyticsService.appVersion(BuildConfig.VERSION_NAME) — same value analytics reports; UI and telemetry cannot disagree.Testing
:app:compileDebugKotlin,:app:testDebugUnitTest,:app:assembleDebug(native vs v0.2.4, arm64-v8a + x86_64) green locally; CI green on the superseded PRs (same code).DCO signed (both commits carried it).