Skip to content

Commit 71f4f8a

Browse files
m-bertjanicduplessisWoLewickiAndreasHogstromYevheniiKotyrlo
authored
[Release] 2.31.0 cherry-pick thread (#4050)
## Description Cherry pick thread for release 2.31.0 ## List of PRs - #3983 - #3987 - #3989 - #3991 - #4010 - #4015 - #4020 - #4029 - [Already existing] #4039 - #4047 ## Needs double-check - #3964 - [Original commit](560d1b5#diff-3a70a725140527b922181806417d7510bb1c7a19ee9243a0dce4ce7d826ab235) - [Cherry-picked commit](058addc) - Follow up: [85c364a](85c364a) - #4003 - [Original commit](7406046) - [Cherry-picked commit](92b3bca) - #4012 - [Original commit](58c4641) - [Cherry-picked commit](4225660) - This is only TS check so I think it shouldn't break anything - #4023 - [Original commit](3918d8a) - [Cherry-picked commit](e7e8506) - I've checked that only formatting part was skipped, so up to you if you want to check that as well ## Test plan 🚀 --------- Co-authored-by: Janic Duplessis <janicduplessis@gmail.com> Co-authored-by: Wojciech Lewicki <wojciech.lewicki@swmansion.com> Co-authored-by: Andreas Högström <andreas.hogstrom@navigraph.com> Co-authored-by: YevheniiKotyrlo <44449990+YevheniiKotyrlo@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Jakub Piasecki <jakub.piasecki@swmansion.com> Co-authored-by: David Duarte <34779165+DavidDuarte22@users.noreply.github.com>
1 parent 56b4fde commit 71f4f8a

40 files changed

+340
-200
lines changed

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -577,11 +577,22 @@ open class GestureHandler {
577577
onStateChange(newState, oldState)
578578
}
579579

580-
fun wantsEvent(event: MotionEvent): Boolean = isEnabled &&
581-
state != STATE_FAILED &&
582-
state != STATE_CANCELLED &&
583-
state != STATE_END &&
584-
isTrackingPointer(event.getPointerId(event.actionIndex))
580+
fun wantsEvent(event: MotionEvent): Boolean {
581+
if (!isEnabled || state == STATE_FAILED || state == STATE_CANCELLED || state == STATE_END) {
582+
return false
583+
}
584+
585+
if (event.actionMasked == MotionEvent.ACTION_MOVE) {
586+
for (i in 0 until event.pointerCount) {
587+
if (isTrackingPointer(event.getPointerId(i))) {
588+
return true
589+
}
590+
}
591+
return false
592+
} else {
593+
return isTrackingPointer(event.getPointerId(event.actionIndex))
594+
}
595+
}
585596

586597
open fun shouldRequireToWaitForFailure(handler: GestureHandler): Boolean {
587598
if (handler === this) {

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
1414
fun dropRelationsForHandlerWithTag(handlerTag: Int) {
1515
waitForRelations.remove(handlerTag)
1616
simultaneousRelations.remove(handlerTag)
17+
blockingRelations.remove(handlerTag)
1718
}
1819

1920
private fun convertHandlerTagsArray(config: ReadableMap, key: String): IntArray {
@@ -64,6 +65,7 @@ class RNGestureHandlerInteractionManager : GestureHandlerInteractionController {
6465
fun reset() {
6566
waitForRelations.clear()
6667
simultaneousRelations.clear()
68+
blockingRelations.clear()
6769
}
6870

6971
companion object {

packages/react-native-gesture-handler/apple/Handlers/RNFlingHandler.m

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ @implementation RNBetterSwipeGestureRecognizer {
1616

1717
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
1818
{
19-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
19+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
2020
_gestureHandler = gestureHandler;
2121
_lastPoint = CGPointZero;
2222
_hasBegan = NO;
@@ -26,7 +26,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
2626

2727
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
2828
{
29-
[_gestureHandler setCurrentPointerType:event];
29+
[_gestureHandler setCurrentPointerTypeForEvent:event];
3030
_lastPoint = [[[touches allObjects] objectAtIndex:0] locationInView:_gestureHandler.recognizer.view];
3131
[_gestureHandler reset];
3232
[super touchesBegan:touches withEvent:event];
@@ -119,7 +119,7 @@ @implementation RNBetterSwipeGestureRecognizer {
119119

120120
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
121121
{
122-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
122+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
123123
_gestureHandler = gestureHandler;
124124

125125
maxDuration = 1.0;
@@ -132,9 +132,9 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
132132
return self;
133133
}
134134

135-
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer fromReset:(BOOL)fromReset
135+
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer
136136
{
137-
[_gestureHandler handleGesture:self fromReset:fromReset];
137+
[_gestureHandler handleGesture:self];
138138
}
139139

140140
- (void)mouseDown:(NSEvent *)event

packages/react-native-gesture-handler/apple/Handlers/RNForceTouchHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ @implementation RNForceTouchGestureRecognizer {
2828

2929
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3030
{
31-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
31+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
3232
_gestureHandler = gestureHandler;
3333
_force = defaultForce;
3434
_minForce = defaultMinForce;
@@ -40,7 +40,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4040

4141
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
4242
{
43-
[_gestureHandler setCurrentPointerType:event];
43+
[_gestureHandler setCurrentPointerTypeForEvent:event];
4444
if (_firstTouch) {
4545
// ignore rest of fingers
4646
return;

packages/react-native-gesture-handler/apple/Handlers/RNHoverHandler.m

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,22 @@ @implementation RNBetterHoverGestureRecognizer {
4040

4141
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4242
{
43-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
43+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
4444
_gestureHandler = gestureHandler;
4545
_hoverEffect = RNGestureHandlerHoverEffectNone;
4646
}
4747
return self;
4848
}
4949

50+
- (void)handleGesture:(UIHoverGestureRecognizer *)recognizer
51+
{
52+
if (recognizer.state == UIGestureRecognizerStateBegan) {
53+
[_gestureHandler setCurrentPointerType:RNGestureHandlerMouse];
54+
}
55+
56+
[_gestureHandler handleGesture:self];
57+
}
58+
5059
- (void)triggerAction
5160
{
5261
[_gestureHandler handleGesture:self fromReset:NO];
@@ -153,11 +162,22 @@ - (void)configure:(NSDictionary *)config
153162
#endif
154163
}
155164

165+
- (void)setCurrentPointerType:(RNGestureHandlerPointerType)pointerType
166+
{
167+
_pointerType = pointerType;
168+
169+
if (@available(iOS 16.1, *)) {
170+
if (((UIHoverGestureRecognizer *)self.recognizer).zOffset > 0.0) {
171+
_pointerType = RNGestureHandlerStylus;
172+
}
173+
}
174+
}
175+
156176
- (RNGestureHandlerEventExtraData *)eventExtraData:(UIGestureRecognizer *)recognizer
157177
{
158178
return [RNGestureHandlerEventExtraData forPosition:[recognizer locationInView:recognizer.view]
159179
withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
160-
withPointerType:UITouchTypePencil];
180+
withPointerType:_pointerType];
161181
}
162182

163183
@end
@@ -173,6 +193,7 @@ - (instancetype)initWithTag:(NSNumber *)tag
173193
{
174194
if ((self = [super initWithTag:tag])) {
175195
_recognizer = [NSGestureRecognizer alloc];
196+
_pointerType = RNGestureHandlerMouse;
176197
}
177198

178199
return self;
@@ -199,21 +220,29 @@ - (void)mouseEntered:(NSEvent *)event
199220
{
200221
[self sendEventsInState:RNGestureHandlerStateBegan
201222
forViewWithTag:_view.reactTag
202-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
223+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
224+
withNumberOfTouches:1
225+
withPointerType:_pointerType]];
203226
[self sendEventsInState:RNGestureHandlerStateActive
204227
forViewWithTag:_view.reactTag
205-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
228+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
229+
withNumberOfTouches:1
230+
withPointerType:_pointerType]];
206231
}
207232

208233
- (void)mouseExited:(NSEvent *)theEvent
209234
{
210235
[self sendEventsInState:RNGestureHandlerStateEnd
211236
forViewWithTag:_view.reactTag
212-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
237+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
238+
withNumberOfTouches:1
239+
withPointerType:_pointerType]];
213240

214241
[self sendEventsInState:RNGestureHandlerStateUndetermined
215242
forViewWithTag:_view.reactTag
216-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
243+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
244+
withNumberOfTouches:1
245+
withPointerType:_pointerType]];
217246
}
218247

219248
@end

packages/react-native-gesture-handler/apple/Handlers/RNLongPressHandler.m

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
3333
- (NSUInteger)getDuration;
3434

3535
#if !TARGET_OS_OSX
36+
- (void)handleGesture:(UIGestureRecognizer *)recognizer;
3637
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
3738
#else
39+
- (void)handleGesture:(NSGestureRecognizer *)recognizer;
3840
- (void)handleGesture:(NSGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
3941
#endif
4042

@@ -47,12 +49,18 @@ @implementation RNBetterLongPressGestureRecognizer {
4749

4850
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4951
{
50-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
52+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
5153
_gestureHandler = gestureHandler;
5254
}
5355
return self;
5456
}
5557

58+
- (void)handleGesture:(UIGestureRecognizer *)recognizer
59+
{
60+
previousTime = CACurrentMediaTime();
61+
[_gestureHandler handleGesture:recognizer fromReset:NO];
62+
}
63+
5664
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
5765
{
5866
previousTime = CACurrentMediaTime();
@@ -79,7 +87,7 @@ - (CGPoint)translationInView
7987

8088
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
8189
{
82-
[_gestureHandler setCurrentPointerType:event];
90+
[_gestureHandler setCurrentPointerTypeForEvent:event];
8391
[super touchesBegan:touches withEvent:event];
8492
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
8593

packages/react-native-gesture-handler/apple/Handlers/RNManualHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ @implementation RNManualRecognizer {
1616

1717
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
1818
{
19-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
19+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
2020
_gestureHandler = gestureHandler;
2121
_shouldSendBeginEvent = YES;
2222
}
@@ -59,7 +59,7 @@ - (void)interactionsEnded:(NSSet *)touches withEvent:(UIEvent *)event
5959
#if !TARGET_OS_OSX
6060
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
6161
{
62-
[_gestureHandler setCurrentPointerType:event];
62+
[_gestureHandler setCurrentPointerTypeForEvent:event];
6363
[super touchesBegan:touches withEvent:event];
6464

6565
[self interactionsBegan:touches withEvent:event];

packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ @implementation RNDummyGestureRecognizer {
2929

3030
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3131
{
32-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
32+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
3333
_gestureHandler = gestureHandler;
3434
}
3535
return self;
@@ -38,7 +38,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3838
#if !TARGET_OS_OSX
3939
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
4040
{
41-
[_gestureHandler setCurrentPointerType:event];
41+
[_gestureHandler setCurrentPointerTypeForEvent:event];
4242
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
4343
}
4444

@@ -166,7 +166,7 @@ - (void)bindToView:(UIView *)view
166166

167167
- (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event
168168
{
169-
[self setCurrentPointerType:event];
169+
[self setCurrentPointerTypeForEvent:event];
170170
[self reset];
171171

172172
if (_disallowInterruption) {
@@ -182,21 +182,27 @@ - (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event
182182

183183
[self sendEventsInState:RNGestureHandlerStateActive
184184
forViewWithTag:sender.reactTag
185-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
185+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
186+
withNumberOfTouches:event.allTouches.count
187+
withPointerType:_pointerType]];
186188
}
187189

188190
- (void)handleTouchUpOutside:(UIView *)sender forEvent:(UIEvent *)event
189191
{
190192
[self sendEventsInState:RNGestureHandlerStateEnd
191193
forViewWithTag:sender.reactTag
192-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
194+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
195+
withNumberOfTouches:event.allTouches.count
196+
withPointerType:_pointerType]];
193197
}
194198

195199
- (void)handleTouchUpInside:(UIView *)sender forEvent:(UIEvent *)event
196200
{
197201
[self sendEventsInState:RNGestureHandlerStateEnd
198202
forViewWithTag:sender.reactTag
199-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
203+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
204+
withNumberOfTouches:event.allTouches.count
205+
withPointerType:_pointerType]];
200206
}
201207

202208
- (void)handleDragExit:(UIView *)sender forEvent:(UIEvent *)event
@@ -207,33 +213,42 @@ - (void)handleDragExit:(UIView *)sender forEvent:(UIEvent *)event
207213
[control cancelTrackingWithEvent:event];
208214
[self sendEventsInState:RNGestureHandlerStateEnd
209215
forViewWithTag:sender.reactTag
210-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
216+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
217+
withNumberOfTouches:event.allTouches.count
218+
withPointerType:_pointerType]];
211219
} else {
212220
[self sendEventsInState:RNGestureHandlerStateActive
213221
forViewWithTag:sender.reactTag
214-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
222+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
223+
withNumberOfTouches:event.allTouches.count
224+
withPointerType:_pointerType]];
215225
}
216226
}
217227

218228
- (void)handleDragEnter:(UIView *)sender forEvent:(UIEvent *)event
219229
{
220230
[self sendEventsInState:RNGestureHandlerStateActive
221231
forViewWithTag:sender.reactTag
222-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES withPointerType:_pointerType]];
232+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:YES
233+
withNumberOfTouches:event.allTouches.count
234+
withPointerType:_pointerType]];
223235
}
224236

225237
- (void)handleTouchCancel:(UIView *)sender forEvent:(UIEvent *)event
226238
{
227239
[self sendEventsInState:RNGestureHandlerStateCancelled
228240
forViewWithTag:sender.reactTag
229-
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO withPointerType:_pointerType]];
241+
withExtraData:[RNGestureHandlerEventExtraData forPointerInside:NO
242+
withNumberOfTouches:event.allTouches.count
243+
withPointerType:_pointerType]];
230244
}
231245

232246
#else
233247

234248
- (RNGestureHandlerEventExtraData *)eventExtraData:(RNDummyGestureRecognizer *)recognizer
235249
{
236250
return [RNGestureHandlerEventExtraData forPointerInside:[self containsPointInView]
251+
withNumberOfTouches:1
237252
withPointerType:RNGestureHandlerMouse];
238253
}
239254

packages/react-native-gesture-handler/apple/Handlers/RNPanHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ @implementation RNBetterPanGestureRecognizer {
5050

5151
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
5252
{
53-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
53+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
5454
_gestureHandler = gestureHandler;
5555
_minDistSq = NAN;
5656
_minVelocityX = NAN;
@@ -233,7 +233,7 @@ - (void)mouseUp:(NSEvent *)event
233233

234234
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
235235
{
236-
[_gestureHandler setCurrentPointerType:event];
236+
[_gestureHandler setCurrentPointerTypeForEvent:event];
237237
// super call was moved to interactionsBegan method to keep the
238238
// original order of calls
239239
[self interactionsBegan:touches withEvent:event];

0 commit comments

Comments
 (0)