Skip to content

Android: Material-3 pass over chat UI and Flutter host - #13

Merged
tiensonqin merged 2 commits into
mainfrom
devin/1790278204-android-material-ux
Sep 24, 2026
Merged

tiensonqin merged 2 commits into
mainfrom
devin/1790278204-android-material-ux

Conversation

@tiensonqin

@tiensonqin tiensonqin commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

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:

  • Attachment button was dead on tap — OpenAttachmentPicker set attachment_picker_open, but no view consumed the flag (the menu only opened on long-press via context_menu). For FlutterHost the button now sits in a stack and mounts attachment_picker_menu (dropdown_menu ~anchor:above, File / Camera / Photo / Audio, ~on_dismiss: CloseAttachmentPicker) when the flag is set — same pattern as task_status_picker_dialog. iOS path unchanged.
  • composer-asset extension registered for Android/Flutter — the OCaml schema listed only the ios/swiftui profile, so composer_asset_preview created an unregistered extension node on Android and the composer crashed when a draft had assets. Schema now declares android/flutter too, and logseqChatExtensionRegistry registers a Flutter widget (image thumbnail via Image.file, attachment fallback) with the matching fingerprint. app_test.ml fingerprint expectation updated.
  • Settings pickers are M3 preference rows — theme/language selects now render as ListTile rows (backend change in lui#33) and menu items carry ~selected_signal so the current choice is checkmarked.
  • page_delete_dialog, sync_status_sheet, graph_password_sheet get FlutterHost branches — labelled fields, error text, ghost/destructive/primary action bars; previously they emitted iOS style_class markup that rendered bare on Android.
  • Back clears block selection — BackAppNavigation now emits the unselect effect when outliner_selected_block_ids is non-empty instead of popping the nav stack, matching the contextual-action-bar convention on Android (pop-only path unchanged for return_to_app_root).
  • Host polish — edge-to-edge + transparent system bars, enableOnBackInvokedCallback, SnackBar on native effect errors (was silent log only), and a styled startup-error screen with Retry (was a bare Text).
  • Search field gets 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 updated composer-asset fingerprint 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

@devin-ai-integration

Copy link
Copy Markdown

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration
devin-ai-integration Bot force-pushed the devin/1790278204-android-material-ux branch from c0831a7 to 4fef989 Compare September 24, 2026 19:56
@tiensonqin
tiensonqin marked this pull request as ready for review September 24, 2026 20:53
@devin-ai-integration
devin-ai-integration Bot force-pushed the devin/1790278204-android-material-ux branch from 4fef989 to 1f67bec Compare September 24, 2026 20:55
@devin-ai-integration
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
devin-ai-integration Bot force-pushed the devin/1790278204-android-material-ux branch from 1f67bec to 6fe718d Compare September 24, 2026 22:40
@tiensonqin
tiensonqin merged commit fb4b84d into main Sep 24, 2026
3 checks passed
@tiensonqin
tiensonqin deleted the devin/1790278204-android-material-ux branch September 26, 2026 14:30
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.

1 participant