Skip to content

[Android] Fix discrete gestures not triggering onFinalize#4196

Merged
m-bert merged 1 commit into
mainfrom
@mbert/fix-exclusive-tap
May 26, 2026
Merged

[Android] Fix discrete gestures not triggering onFinalize#4196
m-bert merged 1 commit into
mainfrom
@mbert/fix-exclusive-tap

Conversation

@m-bert

@m-bert m-bert commented May 26, 2026

Copy link
Copy Markdown
Collaborator

Description

Discrete gestures on Android transition to END state before being cancelled by other, higher priority gestures. Our current approach missed case where gestures like Tap end in such transition (5 -> 3), therefore onFinalize callback was never triggered.

Test plan

Tested on the following code:
import React from 'react';
import { StyleSheet, View } from 'react-native';
import {
  GestureDetector,
  useExclusiveGestures,
  useTapGesture,
} from 'react-native-gesture-handler';

export default function EmptyExample() {
  const t1 = useTapGesture({
    onBegin: () => {
      console.log('tap begin');
    },
    onActivate: () => {
      console.log('tap activate');
    },
    onDeactivate: () => {
      console.log('tap deactivate');
    },
    onFinalize: () => {
      console.log('tap finalize');
    },
  });

  const t2 = useTapGesture({
    numberOfTaps: 2,
    onBegin: () => {
      console.log('double tap begin');
    },
    onActivate: () => {
      console.log('double tap activate');
    },
    onDeactivate: () => {
      console.log('double tap deactivate');
    },
    onFinalize: () => {
      console.log('double tap finalize');
    },
  });

  const g = useExclusiveGestures(t2, t1);

  return (
    <View style={styles.container}>
      <GestureDetector gesture={g}>
        <View style={styles.box} />
      </GestureDetector>
    </View>
  );
}

const styles = StyleSheet.create({
  box: {
    width: 100,
    height: 100,
    backgroundColor: 'blue',
    borderRadius: 10,
  },
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Copilot AI review requested due to automatic review settings May 26, 2026 13:08
@m-bert m-bert requested a review from j-piasecki May 26, 2026 13:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes an Android edge case where discrete gestures (e.g., Tap) can transition to STATE_END while still “awaiting” another handler, then later get cancelled/failed without ever dispatching the synthetic state change that drives JS onFinalize.

Changes:

  • Extend the “awaiting handler finished before activation” synthetic dispatch logic to also cover STATE_END -> STATE_CANCELLED/FAILED transitions.
  • Add clarifying comments explaining the discrete-gesture scenario that prompted the change.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@m-bert m-bert merged commit 117087e into main May 26, 2026
4 checks passed
@m-bert m-bert deleted the @mbert/fix-exclusive-tap branch May 26, 2026 13:17
m-bert added a commit that referenced this pull request Jun 11, 2026
## Description

Cherry pick thread for release 2.32

## List of PRs

| PR  | Original commit |  Picked commit | Without confilct | 
|:----------:|:-------------:|:------:|:--------:|
| [[Android] Remove
`getChildInDrawingOrderAtIndex`](#4156)
|
[f1f09bc](f1f09bc)
|
[d76f2d9](d76f2d9)
| ❌ |
| [[iOS] Fix duplicated
`testID`](#4186)
|
[7feab6e](7feab6e)
|
[d1173ec](d1173ec)
| ❌ |
| [[Android] Fix discrete gestures not triggering
`onFinalize`](#4196)
|
[117087e](117087e)
|
[06212cf](06212cf)
| ✅ |
| [[Android] Fix wrong reported number of
pointers](#4218)
|
[f17bcbd](f17bcbd)
|
[5fd30f6](5fd30f6)
| ❌ |
| [fix(pods): Fix invalid `react-native/../react-native` resolution for
aliases](#4232)
|
[9a9f8b4](9a9f8b4)
|
[cacf6c0](cacf6c0)
| ✅ |
| [Move ruby utils to
module](#4245)
|
[62d0d52](62d0d52)
|
[3884f30](3884f30)
| ❌ |
| [[iOS] Fix handler retrieval and mismatched coordinate
space](#4199)
|
[b1da40b](b1da40b)
|
[2b48a8e](2b48a8e)
| ❌ |
| [[iOS] Don't iterate to root while resolving
recognizer](#4202)
|
[fba4dcc](fba4dcc)
|
[b81f2aa](b81f2aa)
| ❌ |
| [Support React Native
0.86](#4166)
|
[96dfc00](96dfc00)
|
[7df6d1a](7df6d1a)
| ❌ |
| [Fix `RNRenderer` import for React Native
0.86](#4160)
|
[0417378](0417378)
|
[6775d33](6775d33)
| ❌ |
| [Bump `expo` to stable
56](#4227)
|
[45e6ac8](45e6ac8)
|
[0478bb5](0478bb5)
| ❌ |
| [[macOS] Bump example
app](#3993)
|
[8ec0820](8ec0820)
|
[cfc5dd4](cfc5dd4)
| ❌ |
| [Bump
Reanimated](#4040)
|
[23d96d9](23d96d9)
|
[a2101eb](a2101eb)
| ❌ |
| [fix(Android): apply `numberOfPointers` config to the pointer
requirement in
`LongPressGestureHandler`](#4253)
|
[a70c6e3](a70c6e3)
|
[af40f9b](af40f9b)
| ✅ |

## Test plan

Tested that example apps are built correctly

---------

Co-authored-by: Pieter De Baets <pieter.debaets@gmail.com>
Co-authored-by: Mathieu Acthernoene <zoontek@gmail.com>
Co-authored-by: Jakub Piasecki <jakub.piasecki@swmansion.com>
Co-authored-by: Phil Pluckthun <phil@kitten.sh>
Co-authored-by: prashanFOMO <prashan@fomo.family>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants