Android: Material-3 pass over chat UI and Flutter host - #13
Merged
Merged
Conversation
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
devin-ai-integration
Bot
force-pushed
the
devin/1790278204-android-material-ux
branch
from
September 24, 2026 19:56
c0831a7 to
4fef989
Compare
tiensonqin
marked this pull request as ready for review
September 24, 2026 20:53
devin-ai-integration
Bot
force-pushed
the
devin/1790278204-android-material-ux
branch
from
September 24, 2026 20:55
4fef989 to
1f67bec
Compare
devin-ai-integration
Bot
changed the base branch from
devin/1790251566-headless-drive-e2e
to
main
September 24, 2026 22:38
Review-driven M3 optimizations across every screen (complements the lui backend fixes in logseq/lui): - composer attachment button: tap now opens a dropdown menu with File / Camera / Photo / Audio entries (was dead — attachment_picker_open had no consumer; only a hidden long-press context menu worked) - composer-asset: register the extension for the Android/Flutter profile and add a Flutter preview widget (image thumbnail or file fallback) — asset chips previously crashed the composer - settings: theme and language pickers render as M3 preference rows (backend change) with the current selection checkmarked in the menu - page delete dialog / sync status sheet / graph password sheet: add FlutterHost branches — labelled fields, error text, proper ghost/destructive/primary action bars (was iOS style-class markup rendered bare) - search bar: search IME action - host: edge-to-edge + transparent system bars, predictive back (enableOnBackInvokedCallback), SnackBar on native effect errors, styled startup-error screen with Retry - bump lui pin to the Material-3 backend branch (re-pin to merge SHA after logseq/lui#33 lands)
devin-ai-integration
Bot
force-pushed
the
devin/1790278204-android-material-ux
branch
from
September 24, 2026 22:40
1f67bec to
6fe718d
Compare
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
Material-3 pass over the whole Android (Flutter) surface, driven by a per-screen review against Material conventions. Complements the lui backend fixes in logseq/lui#33 (this branch pins lui to that branch — repin to the merge SHA after it lands).
Notable changes:
OpenAttachmentPickersetattachment_picker_open, but no view consumed the flag (the menu only opened on long-press viacontext_menu). For FlutterHost the button now sits in astackand mountsattachment_picker_menu(dropdown_menu ~anchor:above, File / Camera / Photo / Audio,~on_dismiss: CloseAttachmentPicker) when the flag is set — same pattern astask_status_picker_dialog. iOS path unchanged.composer-assetextension registered for Android/Flutter — the OCaml schema listed only theios/swiftuiprofile, socomposer_asset_previewcreated an unregistered extension node on Android and the composer crashed when a draft had assets. Schema now declaresandroid/fluttertoo, andlogseqChatExtensionRegistryregisters a Flutter widget (image thumbnail viaImage.file, attachment fallback) with the matching fingerprint.app_test.mlfingerprint expectation updated.selects now render asListTilerows (backend change in lui#33) and menu items carry~selected_signalso the current choice is checkmarked.page_delete_dialog,sync_status_sheet,graph_password_sheetgetFlutterHostbranches — labelled fields, error text, ghost/destructive/primary action bars; previously they emitted iOSstyle_classmarkup that rendered bare on Android.BackAppNavigationnow emits theunselecteffect whenoutliner_selected_block_idsis non-empty instead of popping the nav stack, matching the contextual-action-bar convention on Android (pop-only path unchanged forreturn_to_app_root).enableOnBackInvokedCallback, SnackBar on native effect errors (was silent log only), and a styled startup-error screen with Retry (was a bareText).TextInputAction.search.Why
The review (per-screen audit of flutter host, nav shell, outliner/composer, settings/search) found: invisible text/backgrounds from unmapped color tokens (backend), dead tap targets (attachment button), a composer crash on assets, iOS-only dialogs rendered bare, a drawer that couldn't close with back and opened on any swipe (backend), back exiting through block selection, and missing host ergonomics (edge-to-edge, predictive back, error feedback).
Testing
dune build @shared/native/runtest— 716 tests green (includes updatedcomposer-assetfingerprint test). Dart changes not locally compiled (no Flutter toolchain here); the Android e2e CI job builds the APK and exercises the app.Base:
devin/1790251566-headless-drive-e2e(main currently can't build — PR #12 fixes the#main-pin vendored-datascript regression this needs).Link to Devin session: https://app.devin.ai/sessions/9a91e201984a4d4f96ce3e0f86ac6668
Open in Devin Desktop: https://app.devin.ai/desktop/session/9a91e201984a4d4f96ce3e0f86ac6668?variant=devin
Requested by: @tiensonqin