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.
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/FlatListwill not scrollSwitchwill not flipTextInputwill not focusMeanwhile 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
What I could not establish
adb shell wm density 480against a physical density of 420 is the same forced-density mechanism as Settings → Display size, but RN's plainScrollViewscrolled 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".I am happy to gather anything specific on the affected device if a maintainer says what would be useful.
Possibly relevant:
PixelUtilreads physical density, not configuration densityOffered as a lead, not a diagnosis.
DisplayMetricsHolder.initDisplayMetrics()stores two different things:PixelUtilusesgetScreenDisplayMetrics()— thegetRealMetrics()one — for every dp↔px conversion (toPixelFromDIP,toPixelFromSP,toDIPFromPixel,getDisplayMetricDensity). A user's Display size setting changesresources.displayMetricsbut notgetRealMetrics(), 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
PixelUtilnever 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:
PixelUtilusesgetScreenDisplayMetrics()instead ofgetWindowDisplayMetrics(), regressed in 0.83 (closed without a fix)DisplayMetricsHolderinitialised once and never refreshed (open)Workaround, for anyone who lands here
Routing touch through
react-native-gesture-handleravoids it entirely — gesture-handler'sScrollView/FlatListon 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.