microsoft / microsoft/fluentui-android

[Drawer] `BottomDrawer` does not respond to mouse drag/fling

Open
#836 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Kotlin
Stars
677
Forks
126
PR merge metrics
No merged PRs in 30d

Description

Environment Information
  • Package version(s): com.microsoft.fluentui:FluentUIAndroid:0.3.12
  • Android SDK version: compileSdk 35 / targetSdk 35, tested on Android 15
Please provide a reproduction of the bug:

Reproduces on a stock BottomDrawer containing a scrollable list (LazyColumn) when interacted with via a mouse (InputDevice.SOURCE_MOUSE) instead of a finger.

Steps (against a BottomDrawer demo or our host app):

  1. Run on an Android device with a connected mouse (Bluetooth/USB, Samsung DeX, or a Chromebook with Android subsystem).
  2. Open a BottomDrawer whose content is taller than the drawer's expanded height (e.g. an account list).
  3. With the mouse pointer over the top region of the drawer (drag handle / header area), press → drag up/down → release at varying speeds.
  4. Repeat the same gestures with a finger on the touchscreen for comparison.

on Samsung Galaxy S25 / Android 15. Internal tracking: Microsoft ADO OS#60001005 (resolved as External against this library).

Actual behavior:
  • Slow mouse press-and-drag → works; inner list scrolls.
  • Fast mouse flick / fling → either toggles the drawer's expand/collapse state, or becomes a no-op when the drawer is already fully expanded. Fling velocity is not forwarded to the inner scrollable child.
  • The same gestures with a finger on the touchscreen work as expected.

Suspected cause: the drawer's gesture / nested-scroll handling does not differentiate SOURCE_MOUSE (or SOURCE_CLASS_POINTER) from SOURCE_TOUCHSCREEN. Fling thresholds tuned for finger swipes classify mouse drag velocity as a drawer-state fling and consume it, instead of dispatching it through the nested-scroll connection to the inner content. When drawerState == Expanded, the consumed fling has nowhere to go and is dropped.

Expected behavior:

Mouse drag and fling on the drawer should behave the same as finger drag/fling:

  • Drag deltas should scroll the inner content when the drawer is at its expanded state.
  • Unconsumed fling velocity from the drawer should be forwarded to the inner scrollable child via nested scroll, regardless of input source.
  • Pointer-source events should ideally bypass the touch-tuned fling classifier (or use a pointer-appropriate threshold).
Priorities and help requested:

Are you willing to submit a PR to fix? No (happy to test a fix and provide additional repro on the affected device.)

Requested priority: Normal (impacts mouse / DeX / Chromebook users; finger input unaffected; no host-app workaround short of forking BottomDrawer.)

Products/applications affected: Microsoft Windows App for Android (WAA) — Drawer used for the account switcher; any consumer of fluentui_drawer's BottomDrawer with scrollable content is likely affected when the device uses pointer-class input.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by locating the BottomDrawer gesture and nested-scroll implementation, then reproduce the described mouse and finger interactions with a scrollable LazyColumn. Compare how pointer-source drag and fling events are classified and consumed. Done means mouse drags and flings match touch behavior, including forwarding usable velocity to the inner content when the drawer is expanded.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.