Skip to content

[Android] Non-default system Display size stops native ScrollView/Switch/TextInput from receiving touches (Fabric, Galaxy S23 Ultra) #58360

Description

@khemraj-astro

Description

On a Samsung Galaxy S23 Ultra with the system Display size ("Screen zoom") set to anything other than the default, native Android views stop receiving touches from app launch under the New Architecture:

  • ScrollView / FlatList will not scroll
  • Switch will not flip
  • TextInput will not focus
  • native date-picker wheels will not spin
  • the native bottom tab bar does not respond

Meanwhile gesture-handler-based touchables in the same tree work normally. Setting Display size back to default makes everything work again immediately. System font size is irrelevant — only Display size triggers it.

Up front about the limitations of this report (see "What I could not establish" below): I have not been able to produce a reproducer that fires outside this device, so this is a symptom report rather than a diagnosed bug. I am filing it because there appears to be no existing issue describing the touch symptom, and because the mechanism note below may be enough for someone with the affected hardware to confirm or refute quickly.

Environment

  • react-native 0.86.2, New Architecture (Fabric), Hermes
  • Expo SDK 57
  • Samsung Galaxy S23 Ultra, One UI
  • Trigger: Settings → Display → Display size, any non-default value

What I could not establish

  • Not reproducible on a stock Android emulator. adb shell wm density 480 against a physical density of 420 is the same forced-density mechanism as Settings → Display size, but RN's plain ScrollView scrolled normally under it — including on a cold start with the override already applied (4 trials, all scrolled). So either the emulator path differs from One UI's implementation, or the trigger is narrower than "non-default density".
  • Device scope unknown. I only have confirmation on the S23 Ultra. I cannot say whether other Samsung models, other One UI versions, or non-Samsung devices are affected.
  • No version bisect. I do not know whether this worked on an earlier RN release.

I am happy to gather anything specific on the affected device if a maintainer says what would be useful.

Possibly relevant: PixelUtil reads physical density, not configuration density

Offered as a lead, not a diagnosis.

DisplayMetricsHolder.initDisplayMetrics() stores two different things:

val displayMetrics = context.resources.displayMetrics   // honours Display size
windowDisplayMetrics = displayMetrics

val screenDisplayMetrics = DisplayMetrics()
screenDisplayMetrics.setTo(displayMetrics)
wm.defaultDisplay.getRealMetrics(screenDisplayMetrics) // physical; ignores Display size

PixelUtil uses getScreenDisplayMetrics() — the getRealMetrics() one — for every dp↔px conversion (toPixelFromDIP, toPixelFromSP, toDIPFromPixel, getDisplayMetricDensity). A user's Display size setting changes resources.displayMetrics but not getRealMetrics(), so the two diverge exactly when this bug appears.

This also predicts something we observed: density overrides applied at both Activity and Application level had no effect, which is consistent with those overrides changing the configuration/window metrics that PixelUtil never reads.

I want to be clear that I have not verified this is the cause — it is a correlation between the code path and the trigger condition.

Related, though both describe layout/scaling rather than touch:

Workaround, for anyone who lands here

Routing touch through react-native-gesture-handler avoids it entirely — gesture-handler's ScrollView / FlatList on Android, and its pressables in place of RN's touchables. gesture-handler uses its own native-coordinate pipeline, which appears to be unaffected. This is what we shipped; it is a workaround, not a fix.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs: AttentionIssues where the author has responded to feedback.Needs: ReproThis issue could be improved with a clear list of steps to reproduce the issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions