Skip to content

Port native rich composer editor to Android #2

Description

@HorusGoul

Context

iOS has a local Expo module for the rich composer: apps/mobile/modules/t3-composer-editor. It registers T3ComposerEditor for Apple only and backs the composer with a UIKit UITextView implementation.

Android currently falls back to apps/mobile/src/native/T3ComposerEditor.tsx, which uses a plain React Native TextInput wrapped by expo-paste-input.

Why this matters

The thread composer and new-task draft screen pass skills, selection state, and pasted image callbacks into ComposerEditor. The iOS native implementation provides richer behavior than the Android fallback:

  • inline @file mention chips with file icons
  • inline skill chips
  • atomic token deletion behavior
  • copy/cut serialization back to source text instead of attachment placeholders
  • controlled selection/value sync via native event counts
  • native pasted-image URI events
  • imperative focus, blur, and setSelection

Feature examples

  • In ThreadComposer, users can mention files and skills while drafting a turn.
  • In NewTaskDraftScreen, users can compose a new task with skill chips and pasted images.

Acceptance criteria

  • Add an Android implementation for the T3ComposerEditor native view, or an equivalent native module with the same JS contract.
  • Match the iOS prop/event surface used by apps/mobile/src/native/T3ComposerEditor.ios.tsx.
  • Preserve source text semantics for inline tokens during edit, copy, cut, delete, and selection updates.
  • Support native image paste callbacks on Android.
  • Keep the existing JS fallback path safe when the native view is unavailable.
  • Add focused tests for shared adapter logic and Android-native behavior where practical.

Current test coverage note

There are TypeScript tests around composer revision and image conversion (apps/mobile/src/native/composerEditorRevision.test.ts, apps/mobile/src/lib/composerImages.test.ts), but I did not find native Swift/UIKit tests for the existing iOS implementation or Android native tests for this surface.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions