[0.24][RN 0.83] Remote Select never invokes onPress (focus works)

:backhand_index_pointing_right: Bug Description


1. Summary

On Vega SDK 0.24 / React Native 0.83 / Kepler 4, remote Select (and Enter) never invokes onPress on the focused pressable. We originally used TouchableOpacity but I also tried Pressable and View with no luck. D-pad focus works. The same Select event does arrive on useTVEventHandler as eventType: 'select' | 'enter'.

This blocks our RN 0.72 → 0.83 migration: users cannot activate CTAs (sign-in, roadblock, tiles) unless we bypass native onPress.

App Name: Paramount+
App Link on Amazon Appstore (found through Developer Console → Actions column in App List → View on Amazon.com): com.cbs.ott (internal 0.83 QA build, not the store binary)

Bug Severity
Select one that applies

  • Impacts operation of app
  • Blocks current development
  • Improvement suggestion
  • Issue with documentation (If selected, please share the doc link and describe the issue)
  • Other

2. Steps to Reproduce

  1. Build a Kepler 4 / RN 0.83 app with SDK 0.24 and install it on Vega Virtual Device OS 1.2 (aarch64).
  2. Render a focused pressable that logs in onPress (Kepler Pressable, View + isPressable, or TouchableOpacity from react-native).
  3. Move focus onto that control with the D-pad (focus ring / onFocus fires).
  4. Press Select (VVD: inputd-cli button_press KEY_ENTER).
  5. Optionally also subscribe with useTVEventHandler and log event.eventType / event.eventKeyAction.

Component / APIs: onPress on Pressable / TouchableOpacity / pressable View; useTVEventHandler from @amazon-devices/react-native-kepler.

3. Observed Behavior

  • Focus works (onFocus / onBlur, D-pad navigation).
  • Select does not call onPress on any of:
    • Kepler Pressable
    • View with isPressable
    • TouchableOpacity remapped from react-native (activeOpacity={1}, including a fully visible control)
  • useTVEventHandler does receive the key: eventType is 'select' or 'enter', eventKeyAction === 0 (key down).
  • Not a crash. console.log / console.warn are often dropped on this OS; console.error shows as [KeplerScript-JavaScript].

4. Expected Behavior

Select on the focused pressable should fire onPress, as on Kepler 2 / RN 0.72.

4.a Possible Root Cause & Temporary Workaround

Possible cause: RN 0.83 / Fabric / bridgeless event-name normalization (0.24 notes mention media dual-dispatch). Select may be delivered to the TV event path but not mapped onto the focused component’s onPress.

Workaround (VirtualNav only):

import { HWEvent, useTVEventHandler } from '@amazon-devices/react-native-kepler';

const handleTVEvent = useCallback((event: HWEvent) => {
  if (!navHasFocus.current) return;
  if (
    (event.eventType !== 'select' && event.eventType !== 'enter') ||
    event.eventKeyAction !== 0
  ) {
    return;
  }
  handleCenterOnPressRef.current();
}, []);

useTVEventHandler(handleTVEvent);

Callback identity must be stable — Kepler re-subscribes if handleEvent changes. We still pass onPress={handleCenterOnPress} on the center TouchableOpacity; it never fires today. If native onPress is restored, this will double-fire.

This does not fix other pressables in our app (e.g. Show/Hide password).

5. Logs or crash report

Not a crash. No ACR. com.cbs.ott.main stayed in the foreground.

Native layer consumes the key (Consumed key:Return). No onPress / Pressable callback follows. JS console.log/warn are often dropped on this OS; we would still expect a CTA navigation side-effect, which did not happen.

6. Environment

SDK Version: 0.24.9914 (vega --version; Vega CLI 1.3.2)
React Native Version: RN 0.83 (@amazon-devices/react-native-kepler 4.0.0)
App State: Foreground
OS Information (cat /etc/os-release on VVD):

NAME="OS"
OE_VERSION="4.0.0"
OS_MAJOR_VERSION="1"
OS_MINOR_VERSION="2"
RELEASE_ID="21"
OS_VERSION="1.2"
BRANCH_CODE="TV Ship"
BUILD_DESC="OS 1.2 (TV Ship/101520710)"
BUILD_FINGERPRINT="1.0.152071.0(9a1d8dfa7da5d600)/101520710N:user/dev-keys"
BUILD_VARIANT="user"
BUILD_TAGS="dev-keys"
BUILD_DATE="Wed Jul 15 22:17:13 UTC 2026"
BUILD_TIMESTAMP="1784153833"
VERSION_NUMBER="2111172071030"

Device: Vega Virtual Device, tv, aarch64. I also previously reproduced the same issue on a physical device with the following details:

BRANCH_CODE=RN83 3P Alpha Release
BUILD_DESC=OS 1.1 (RN83 3P Alpha Release/301)
BUILD_FINGERPRINT=4.0.358278.0(3072cab629675a74)/301N:user/release-keys
VERSION_NUMBER=2101010030120

7. Example Code Snippet / Screenshots / Screengrabs

Fails (focus works, Select does nothing):

import { TouchableOpacity as RNPressable, Text } from 'react-native';

<RNPressable
  onFocus={handleCenterFocus}
  onBlur={handleCenterBlur}
  onPress={handleCenterOnPress}  // never called on Select
  activeOpacity={1}
  hasTVPreferredFocus={false}
>
  <Text>Press</Text>
</RNPressable>

Same failure with Kepler Pressable and View + isPressable + onPress, including a fully visible CTA.


:backhand_index_pointing_right: Playback Issues


N/A


:backhand_index_pointing_right: Additional Context


Hi @Jeff_Cannon,

Thank you for the detailed bug report. We understand this is blocking your RN 0.83 migration.

Our team is looking into the onPress not firing on remote Select with SDK 0.24 / RN 0.83 / Kepler 4. We’ll provide an update as soon as we have more information.

Thanks for helping us improve the Vega platform.

Warm regards,
Aishwarya

Hi @amen, following up and providing more details. Here’s the split in behavior we are seeing on virtual device vs real device:

  • Vega Virtual Device (OS 1.2): useTVEventHandler does receive Select, so a workaround works there. Native onPress still never fires on TouchableOpacity / Pressable / View.
  • Physical device: On current device OS, we still cannot fire Select. We are not seeing Select events on the TV-handler path either, so even the workaround does not activate. D-pad focus still works.

We also rebuilt the 0.83 / 0.24 upgrade from scratch following the migration guide again (no leftover 0.72 wiring) and hit the same Select → onPress failure.

To get the Kepler 4 process to launch without crashing on SIGSEGV (Kepler 2 natives in that process are two Hermes/RN/Folly copies), we autolink-disable and JS-stub the following libraries:

  • @amazon-devices/react-native-cookies / @react-native-cookies/cookies
  • @amazon-devices/expo-image
  • @amazon-devices/expo-font
  • @amazon-devices/expo-file-system
  • @amazon-devices/expo-linear-gradient
  • @amazon-devices/expo-constants
  • @amazon-devices/expo-crypto
  • @amazon-devices/lottie-react-native
  • @amazon-devices/react-native-masked-view
  • @amazon-devices/react-linear-gradient
  • @amazon-devices/react-native-screens
  • @amazon-devices/react-native-fast-image

We also call enableScreens(false) because on OS 1.2 screens_4 still maps to Kepler 2 screens-lib-2. These stubs are only so the app boots. They are not a substitute for native onPress.

Can you confirm whether Select → native onPress is a known Kepler 4 / RN 0.83 / SDK 0.24 gap, and whether a fix is on your side or if you have a suggestion based on the libraries we are stubbing that could be causing this issue? If this has to wait on an Amazon fix, we will park our migration work until then. Happy to capture more device logs if you need them.

Thanks for the further information. On the libraries topic, can you please confirm which versions of the libraries you’re using? Some of the libraries have had a major version bump as part of the update to RN 0.83.

This page includes the updated versions for RN 0.83. Supported Libraries and Services - Amazon Vega Docs

Hi @stmoy thanks for that link! I noticed we had not updated all of those libraries to those versions so I tried again and retested. Select → native onPress is still broken but it appears I couldn’t access many of the versions listed in that post.

Is there a reason we cannot access those documented 0.83 library versions from the @amazon-devices registry (rnpreview-npm-prod-local)? npm view only lists the versions below — expo-*@3.0.1, react-native-fast-image@4.0.0, and webview@4.0.2 all 404. If they live on a different feed or need extra access, we can switch and retest Select without the stubs. Providing all details below:

Runtime

  • SDK 0.24.9914, Vega CLI 1.3.2
  • @amazon-devices/react-native-kepler 4.0.0+rn0.83.0
  • react-native 0.83.0, react 19.2.0
  • Devices: Vega Virtual Device OS 1.2, and a Fire TV Stick on OS 1.2 (TV Ship/547)

Declared npm versions (P+ Kepler 4 app)

Package Declared / resolved
react-native-screens 3.0.1
react-navigation (__native, __stack, __core, __bottom-tabs, __elements, __routers) 8.0.1
react-native-safe-area-context 8.0.1
react-native-gesture-handler 4.0.0
react-native-reanimated 4.0.0
react-native-svg 3.0.0
lottie-react-native 3.0.0
kepler-ui-components 3.0.0
webview 3.5.8 (see unpublished note below)
expo-constants / expo-crypto / expo-file-system / expo-image / expo-linear-gradient 2.0.9000000000
react-linear-gradient 2.0.9000000000
react-native-fast-image 2.0.9000000000
react-native-masked-view 2.0.9000000000
react-native-cookies 1.1.9000000000
react-native-device-info 2.1.9000000000
async-storage 2.1.9000000000

expo-font is not in this app. The 0.83 tab marks it unsupported, so we load fonts without that package.

Versions on the 0.83 tab that are not on the Amazon npm feed (k-artifactory-external.labcollab.net):

  • expo-* ~3.0.0 / ~3.0.1 — only 2.0.9000000000 exists
  • react-native-fast-image ~4.0.0 — only 2.0.9000000000 exists
  • webview ~4.0.2 — only 3.5.7 / 3.5.8 exist

Those 9000000000 packages also warn that the version is missing from each package’s kepler-compatibility.json.

Stubs are still required to boot, even after the version bumps. On public OS 1.2 those packages still autolink Kepler 2 system .sos (libexpo-image-2, libexpo-crypto-2, screens-lib-2, fast-image-lib-8, etc.). Mixing those into a Kepler 4 process SIGSEGVs in libRCT-folly-0.83.so. We autolink-disable and JS-stub:

  • react-native-fast-image
  • lottie-react-native
  • react-linear-gradient
  • expo-linear-gradient
  • react-native-screens
  • react-native-masked-view
  • react-native-cookies
  • expo-image
  • expo-file-system
  • expo-crypto

We do not stub Kepler 4, Reanimated 4, SVG 3, gesture-handler 4, navigation 8, safe-area 8.0.1, kepler-ui-components 3, device-info, expo-constants, webview, or async-storage.

Select after that upgrade

  • Native onPress still never fires on TouchableOpacity / Kepler Pressable / pressable View (VVD and Fire TV Stick).
  • VVD: useTVEventHandler still sees select/enter, so a handler workaround can fire there. Native onPress still does not.
  • Fire TV Stick OS 1.2: Select still does not activate CTAs, including with that TV-handler workaround. D-pad focus still works.

Thank you @Jeff_Cannon for this information. I’m continuing to investigate with our team internally.

On the libraries topic specifically, we’ve published new versions of many of these packages alongside SDK v0.24; for example, fast-image is available on npm with version 4.0.0; similarly, react-native-kepler is version 4.0.1: @amazon-devices/react-native-kepler - npm

Although we had private versions of the libraries during the alpha preview earlier this year, we recommend that apps use the publicly available versions now that the alpha is concluded. Is there a particular reason to use the artifactory npm feed instead of the publicly available npm feed?

Hi @Jeff_Cannon,

Thank you for the thorough follow-up and for sharing the library version details — that was very helpful.

useTVEventHandler - HWEvent Key Values Differ by Vega OS Version

On RN 0.83, the HWEvent.eventType values that useTVEventHandler delivers for remote hardware keys differ between Vega OS versions:

  • Vega OS 1.2 emits the raw, lowercased platform key value (e.g. enter, fastforward, rewind, volumeup, channelup, 1, dot).
  • A future Vega OS release will normalize these values to match the RN 0.72 behavior (e.g. select, skip_forward, skip_backward, etc.).

Because raw values are still valid strings, a switch (event.eventType) that matches only the normalized names will never hit its cases on Vega OS 1.2 - the affected remote buttons appear “dead” with no crash and no warning.

Cross-version eventType reference

Remote Button Future Vega OS (normalized) Vega OS 1.2 (raw)
OK / Select (D-pad center) select enter
Fast Forward skip_forward fastforward / forward
Rewind skip_backward rewind
Volume Up volume_up volumeup
Volume Down volume_down volumedown
Channel Up channel_up channelup
Channel Down channel_down channeldown
Number keys 0–9 num_0num_9 09
Period / Dot period dot

Migration pattern - match both forms per logical button

import { useTVEventHandler } from '@amazon-devices/react-native-kepler';

useTVEventHandler((event) => {
  // Key-down only; ignore key-up.
  if (event.eventKeyAction === 1) return;

  switch (event.eventType) {
    // Fast Forward — normalized (future OS) OR raw (Vega 1.2)
    case 'skip_forward':
    case 'fastforward':
    case 'forward':
      seekForward();
      break;

    // Rewind
    case 'skip_backward':
    case 'rewind':
      seekBackward();
      break;

    // OK / Select
    case 'select':
    case 'enter':
      activateFocusedItem();
      break;

    // Volume
    case 'volume_up':
    case 'volumeup':
      volumeUp();
      break;
    case 'volume_down':
    case 'volumedown':
      volumeDown();
      break;

    // Channel
    case 'channel_up':
    case 'channelup':
      channelUp();
      break;
    case 'channel_down':
    case 'channeldown':
      channelDown();
      break;

    // Number keys (e.g. "5")
    case 'num_5':
    case '5':
      enterDigit(5);
      break;

    default:
      break;
  }
});

You can remove the raw-value branches once your minimum supported OS version ships the normalization fix.

Could you try applying the dual-match useTVEventHandler pattern above and let us know if that unblocks your migration?

Warm regards,
Aishwarya