@nativescript/core 9.0.0-alpha.13-next-11-12-2025-19281881648 → 9.0.0-alpha.13-next-11-12-2025-19284346663

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/application/application.android.js +335 -352
  2. package/application/application.android.js.map +1 -1
  3. package/application/application.ios.js +4 -19
  4. package/application/application.ios.js.map +1 -1
  5. package/config/config.interface.d.ts +21 -0
  6. package/connectivity/index.android.js +22 -22
  7. package/connectivity/index.android.js.map +1 -1
  8. package/data/observable/index.d.ts +2 -1
  9. package/data/observable/index.js +31 -19
  10. package/data/observable/index.js.map +1 -1
  11. package/fps-meter/fps-native.ios.js +1 -1
  12. package/fps-meter/fps-native.ios.js.map +1 -1
  13. package/http/http-request/index.ios.js +1 -1
  14. package/http/http-request/index.ios.js.map +1 -1
  15. package/package.json +1 -1
  16. package/timer/index.ios.js +1 -1
  17. package/timer/index.ios.js.map +1 -1
  18. package/ui/action-bar/index.android.js +18 -18
  19. package/ui/action-bar/index.android.js.map +1 -1
  20. package/ui/action-bar/index.ios.js +1 -1
  21. package/ui/action-bar/index.ios.js.map +1 -1
  22. package/ui/animation/index.ios.js +2 -3
  23. package/ui/animation/index.ios.js.map +1 -1
  24. package/ui/button/index.android.js +19 -19
  25. package/ui/button/index.android.js.map +1 -1
  26. package/ui/button/index.ios.js +1 -2
  27. package/ui/button/index.ios.js.map +1 -1
  28. package/ui/core/control-state-change/index.ios.js +1 -1
  29. package/ui/core/control-state-change/index.ios.js.map +1 -1
  30. package/ui/core/view/index.android.js +190 -190
  31. package/ui/core/view/index.android.js.map +1 -1
  32. package/ui/core/view/index.ios.js +1 -1
  33. package/ui/core/view/index.ios.js.map +1 -1
  34. package/ui/core/view/view-helper/index.ios.d.ts +4 -4
  35. package/ui/core/view/view-helper/index.ios.js +7 -19
  36. package/ui/core/view/view-helper/index.ios.js.map +1 -1
  37. package/ui/date-picker/index.android.js +38 -38
  38. package/ui/date-picker/index.android.js.map +1 -1
  39. package/ui/date-picker/index.ios.js +1 -1
  40. package/ui/date-picker/index.ios.js.map +1 -1
  41. package/ui/editable-text-base/index.android.js +34 -34
  42. package/ui/editable-text-base/index.android.js.map +1 -1
  43. package/ui/frame/fragment.transitions.android.js +95 -95
  44. package/ui/frame/fragment.transitions.android.js.map +1 -1
  45. package/ui/frame/index.ios.js +13 -18
  46. package/ui/frame/index.ios.js.map +1 -1
  47. package/ui/gestures/index.android.js +129 -130
  48. package/ui/gestures/index.android.js.map +1 -1
  49. package/ui/gestures/index.ios.js +3 -5
  50. package/ui/gestures/index.ios.js.map +1 -1
  51. package/ui/gestures/touch-manager.js +32 -32
  52. package/ui/gestures/touch-manager.js.map +1 -1
  53. package/ui/image/index.android.js +19 -19
  54. package/ui/image/index.android.js.map +1 -1
  55. package/ui/image-cache/index.android.js +12 -14
  56. package/ui/image-cache/index.android.js.map +1 -1
  57. package/ui/image-cache/index.ios.js +6 -6
  58. package/ui/image-cache/index.ios.js.map +1 -1
  59. package/ui/list-picker/index.android.js +35 -35
  60. package/ui/list-picker/index.android.js.map +1 -1
  61. package/ui/list-picker/index.ios.js +2 -2
  62. package/ui/list-picker/index.ios.js.map +1 -1
  63. package/ui/list-view/index.android.js +278 -320
  64. package/ui/list-view/index.android.js.map +1 -1
  65. package/ui/list-view/index.ios.js +11 -27
  66. package/ui/list-view/index.ios.js.map +1 -1
  67. package/ui/page/index.ios.js +4 -57
  68. package/ui/page/index.ios.js.map +1 -1
  69. package/ui/scroll-view/index.ios.js +2 -2
  70. package/ui/scroll-view/index.ios.js.map +1 -1
  71. package/ui/search-bar/index.android.js +48 -52
  72. package/ui/search-bar/index.android.js.map +1 -1
  73. package/ui/search-bar/index.ios.js +3 -6
  74. package/ui/search-bar/index.ios.js.map +1 -1
  75. package/ui/segmented-bar/index.android.js +55 -59
  76. package/ui/segmented-bar/index.android.js.map +1 -1
  77. package/ui/segmented-bar/index.ios.js +1 -1
  78. package/ui/segmented-bar/index.ios.js.map +1 -1
  79. package/ui/slider/index.android.js +23 -25
  80. package/ui/slider/index.android.js.map +1 -1
  81. package/ui/slider/index.ios.js +2 -2
  82. package/ui/slider/index.ios.js.map +1 -1
  83. package/ui/split-view/index.ios.js +1 -6
  84. package/ui/split-view/index.ios.js.map +1 -1
  85. package/ui/switch/index.android.js +18 -18
  86. package/ui/switch/index.android.js.map +1 -1
  87. package/ui/switch/index.ios.js +1 -1
  88. package/ui/switch/index.ios.js.map +1 -1
  89. package/ui/tab-view/index.android.js +163 -179
  90. package/ui/tab-view/index.android.js.map +1 -1
  91. package/ui/tab-view/index.ios.js +8 -18
  92. package/ui/tab-view/index.ios.js.map +1 -1
  93. package/ui/text-base/index.android.js +91 -94
  94. package/ui/text-base/index.android.js.map +1 -1
  95. package/ui/text-base/index.ios.js +6 -15
  96. package/ui/text-base/index.ios.js.map +1 -1
  97. package/ui/text-field/index.ios.js +2 -3
  98. package/ui/text-field/index.ios.js.map +1 -1
  99. package/ui/text-view/index.ios.js +2 -6
  100. package/ui/text-view/index.ios.js.map +1 -1
  101. package/ui/time-picker/index.android.js +21 -21
  102. package/ui/time-picker/index.android.js.map +1 -1
  103. package/ui/time-picker/index.ios.js +1 -1
  104. package/ui/time-picker/index.ios.js.map +1 -1
  105. package/ui/transition/fade-transition.ios.js +5 -6
  106. package/ui/transition/fade-transition.ios.js.map +1 -1
  107. package/ui/transition/modal-transition.ios.js +19 -26
  108. package/ui/transition/modal-transition.ios.js.map +1 -1
  109. package/ui/transition/page-transition.android.js +3 -12
  110. package/ui/transition/page-transition.android.js.map +1 -1
  111. package/ui/transition/page-transition.ios.js +19 -25
  112. package/ui/transition/page-transition.ios.js.map +1 -1
  113. package/ui/transition/slide-transition.ios.js +5 -6
  114. package/ui/transition/slide-transition.ios.js.map +1 -1
  115. package/ui/web-view/index.android.js +58 -62
  116. package/ui/web-view/index.android.js.map +1 -1
  117. package/ui/web-view/index.ios.js +18 -18
  118. package/ui/web-view/index.ios.js.map +1 -1
  119. package/utils/native-helper.ios.js +20 -20
  120. package/utils/native-helper.ios.js.map +1 -1
@@ -80,202 +80,184 @@ function initializeTouchListener() {
80
80
  if (TouchListener) {
81
81
  return;
82
82
  }
83
- var TouchListenerImpl = /** @class */ (function (_super) {
84
- __extends(TouchListenerImpl, _super);
85
- function TouchListenerImpl(owner) {
86
- var _this = _super.call(this) || this;
87
- _this.owner = new WeakRef(owner);
88
- return global.__native(_this);
89
- }
90
- TouchListenerImpl.prototype.onTouch = function (view, event) {
91
- var owner = this.owner.get();
92
- if (!owner) {
93
- return;
94
- }
95
- owner.handleGestureTouch(event);
96
- var nativeView = owner.nativeViewProtected;
97
- if (!nativeView || !nativeView.onTouchEvent) {
98
- return false;
99
- }
100
- return nativeView.onTouchEvent(event);
101
- };
102
- var _a;
103
- TouchListenerImpl = __decorate([
104
- Interfaces([android.view.View.OnTouchListener]),
105
- __metadata("design:paramtypes", [typeof (_a = typeof View !== "undefined" && View) === "function" ? _a : Object])
106
- ], TouchListenerImpl);
107
- return TouchListenerImpl;
108
- }(java.lang.Object));
83
+ var TouchListenerImpl = (function (_super) {
84
+ __extends(TouchListenerImpl, _super);
85
+ function TouchListenerImpl(owner) {
86
+ var _this = _super.call(this) || this;
87
+ _this.owner = new WeakRef(owner);
88
+ return global.__native(_this);
89
+ }
90
+ TouchListenerImpl.prototype.onTouch = function (view, event) {
91
+ var owner = this.owner.get();
92
+ if (!owner) {
93
+ return;
94
+ }
95
+ owner.handleGestureTouch(event);
96
+ var nativeView = owner.nativeViewProtected;
97
+ if (!nativeView || !nativeView.onTouchEvent) {
98
+ return false;
99
+ }
100
+ return nativeView.onTouchEvent(event);
101
+ };
102
+ var _a;
103
+ TouchListenerImpl = __decorate([
104
+ Interfaces([android.view.View.OnTouchListener]),
105
+ __metadata("design:paramtypes", [typeof (_a = typeof View !== "undefined" && View) === "function" ? _a : Object])
106
+ ], TouchListenerImpl);
107
+ return TouchListenerImpl;
108
+ }(java.lang.Object));
109
109
  TouchListener = TouchListenerImpl;
110
110
  }
111
111
  function initializeDialogFragment() {
112
112
  if (DialogFragment) {
113
113
  return;
114
114
  }
115
- var DialogImpl = /** @class */ (function (_super) {
116
- __extends(DialogImpl, _super);
117
- function DialogImpl(fragment, context, themeResId) {
118
- var _this = _super.call(this, context, themeResId) || this;
119
- _this.fragment = fragment;
120
- if (SDK_VERSION >= 33 && OnBackPressedCallback) {
121
- var callback = new OnBackPressedCallback(true);
122
- callback['_dialog'] = new WeakRef(_this);
123
- // @ts-ignore
124
- _this.getOnBackPressedDispatcher().addCallback(_this, callback);
125
- }
126
- return global.__native(_this);
127
- }
128
- DialogImpl.prototype.onDetachedFromWindow = function () {
129
- _super.prototype.onDetachedFromWindow.call(this);
130
- this.fragment = null;
131
- };
132
- DialogImpl.prototype.onBackPressed = function () {
133
- if (SDK_VERSION >= 33) {
134
- _super.prototype.onBackPressed.call(this);
135
- return;
115
+ var DialogImpl = (function (_super) {
116
+ __extends(DialogImpl, _super);
117
+ function DialogImpl(fragment, context, themeResId) {
118
+ var _this = _super.call(this, context, themeResId) || this;
119
+ _this.fragment = fragment;
120
+ if (SDK_VERSION >= 33 && OnBackPressedCallback) {
121
+ var callback = new OnBackPressedCallback(true);
122
+ callback["_dialog"] = new WeakRef(_this);
123
+ _this.getOnBackPressedDispatcher().addCallback(_this, callback);
124
+ }
125
+ return global.__native(_this);
136
126
  }
137
- var view = this.fragment.owner;
138
- var args = {
139
- eventName: 'activityBackPressed',
140
- object: view,
141
- activity: view._context,
142
- cancel: false,
127
+ DialogImpl.prototype.onDetachedFromWindow = function () {
128
+ _super.prototype.onDetachedFromWindow.call(this);
129
+ this.fragment = null;
143
130
  };
144
- // Fist fire application.android global event
145
- getNativeScriptGlobals().events.notify(args);
146
- if (args.cancel) {
147
- return;
148
- }
149
- view.notify(args);
150
- if (!args.cancel && !view.onBackPressed()) {
151
- _super.prototype.onBackPressed.call(this);
152
- }
153
- };
154
- return DialogImpl;
155
- }(androidx.appcompat.app.AppCompatDialog));
156
- var DialogFragmentImpl = /** @class */ (function (_super) {
157
- __extends(DialogFragmentImpl, _super);
158
- function DialogFragmentImpl() {
159
- var _this = _super.call(this) || this;
160
- return global.__native(_this);
161
- }
162
- DialogFragmentImpl.prototype.onCreate = function (savedInstanceState) {
163
- var _a;
164
- _super.prototype.onCreate.call(this, savedInstanceState);
165
- var ownerId = (_a = this.getArguments()) === null || _a === void 0 ? void 0 : _a.getInt(DOMID);
166
- var options = getModalOptions(ownerId);
167
- // The teardown when the activity is destroyed happens after the state is saved, but is not recoverable,
168
- // Cancel the native dialog in this case or the app will crash with subsequent errors.
169
- if (savedInstanceState != null && options === undefined) {
170
- this.dismissAllowingStateLoss();
171
- }
172
- };
173
- DialogFragmentImpl.prototype.onCreateDialog = function (savedInstanceState) {
174
- var ownerId = this.getArguments().getInt(DOMID);
175
- var options = getModalOptions(ownerId);
176
- this.owner = options.owner;
177
- // Set owner._dialogFragment to this in case the DialogFragment was recreated after app suspend
178
- this.owner._dialogFragment = this;
179
- this._fullscreen = options.fullscreen;
180
- this._animated = options.animated;
181
- this._cancelable = options.cancelable;
182
- this._stretched = options.stretched;
183
- this._dismissCallback = options.dismissCallback;
184
- this._shownCallback = options.shownCallback;
185
- this._windowSoftInputMode = options.windowSoftInputMode;
186
- this.setStyle(androidx.fragment.app.DialogFragment.STYLE_NO_TITLE, 0);
187
- var theme = this.getTheme();
188
- if (this._fullscreen) {
189
- // In fullscreen mode, get the application's theme.
190
- theme = this.getActivity().getApplicationInfo().theme;
191
- }
192
- var dialog = new DialogImpl(this, this.getActivity(), theme);
193
- // do not override alignment unless fullscreen modal will be shown;
194
- // otherwise we might break component-level layout:
195
- // https://github.com/NativeScript/NativeScript/issues/5392
196
- if (!this._fullscreen && !this._stretched) {
197
- this.owner.horizontalAlignment = 'center';
198
- this.owner.verticalAlignment = 'middle';
199
- }
200
- else {
201
- this.owner.horizontalAlignment = 'stretch';
202
- this.owner.verticalAlignment = 'stretch';
203
- }
204
- // set the modal window animation
205
- // https://github.com/NativeScript/NativeScript/issues/5989
206
- if (this._animated) {
207
- dialog.getWindow().setWindowAnimations(styleAnimationDialog);
208
- }
209
- dialog.setCanceledOnTouchOutside(this._cancelable);
210
- return dialog;
211
- };
212
- DialogFragmentImpl.prototype.onCreateView = function (inflater, container, savedInstanceState) {
213
- var owner = this.owner;
214
- this.activity = new WeakRef(this.getActivity());
215
- owner._setupAsRootView(this.getActivity());
216
- owner._isAddedToNativeVisualTree = true;
217
- // we need to set the window SoftInputMode here.
218
- // it wont work is set in onStart
219
- var window = this.getDialog().getWindow();
220
- if (this._windowSoftInputMode !== undefined) {
221
- window.setSoftInputMode(this._windowSoftInputMode);
222
- }
223
- else {
224
- // the dialog seems to not follow the default activity softInputMode,
225
- // thus set we set it here.
226
- window.setSoftInputMode(owner._context.getWindow().getAttributes().softInputMode);
227
- }
228
- return owner.nativeViewProtected;
229
- };
230
- DialogFragmentImpl.prototype.onStart = function () {
231
- _super.prototype.onStart.call(this);
232
- if (this._fullscreen) {
131
+ DialogImpl.prototype.onBackPressed = function () {
132
+ if (SDK_VERSION >= 33) {
133
+ _super.prototype.onBackPressed.call(this);
134
+ return;
135
+ }
136
+ var view = this.fragment.owner;
137
+ var args = {
138
+ eventName: "activityBackPressed",
139
+ object: view,
140
+ activity: view._context,
141
+ cancel: false,
142
+ };
143
+ getNativeScriptGlobals().events.notify(args);
144
+ if (args.cancel) {
145
+ return;
146
+ }
147
+ view.notify(args);
148
+ if (!args.cancel && !view.onBackPressed()) {
149
+ _super.prototype.onBackPressed.call(this);
150
+ }
151
+ };
152
+ return DialogImpl;
153
+ }(androidx.appcompat.app.AppCompatDialog));
154
+ var DialogFragmentImpl = (function (_super) {
155
+ __extends(DialogFragmentImpl, _super);
156
+ function DialogFragmentImpl() {
157
+ var _this = _super.call(this) || this;
158
+ return global.__native(_this);
159
+ }
160
+ DialogFragmentImpl.prototype.onCreate = function (savedInstanceState) {
161
+ var _a;
162
+ _super.prototype.onCreate.call(this, savedInstanceState);
163
+ var ownerId = (_a = this.getArguments()) === null || _a === void 0 ? void 0 : _a.getInt(DOMID);
164
+ var options = getModalOptions(ownerId);
165
+ if (savedInstanceState != null && options === undefined) {
166
+ this.dismissAllowingStateLoss();
167
+ }
168
+ };
169
+ DialogFragmentImpl.prototype.onCreateDialog = function (savedInstanceState) {
170
+ var ownerId = this.getArguments().getInt(DOMID);
171
+ var options = getModalOptions(ownerId);
172
+ this.owner = options.owner;
173
+ this.owner._dialogFragment = this;
174
+ this._fullscreen = options.fullscreen;
175
+ this._animated = options.animated;
176
+ this._cancelable = options.cancelable;
177
+ this._stretched = options.stretched;
178
+ this._dismissCallback = options.dismissCallback;
179
+ this._shownCallback = options.shownCallback;
180
+ this._windowSoftInputMode = options.windowSoftInputMode;
181
+ this.setStyle(androidx.fragment.app.DialogFragment.STYLE_NO_TITLE, 0);
182
+ var theme = this.getTheme();
183
+ if (this._fullscreen) {
184
+ theme = this.getActivity().getApplicationInfo().theme;
185
+ }
186
+ var dialog = new DialogImpl(this, this.getActivity(), theme);
187
+ if (!this._fullscreen && !this._stretched) {
188
+ this.owner.horizontalAlignment = "center";
189
+ this.owner.verticalAlignment = "middle";
190
+ }
191
+ else {
192
+ this.owner.horizontalAlignment = "stretch";
193
+ this.owner.verticalAlignment = "stretch";
194
+ }
195
+ if (this._animated) {
196
+ dialog.getWindow().setWindowAnimations(styleAnimationDialog);
197
+ }
198
+ dialog.setCanceledOnTouchOutside(this._cancelable);
199
+ return dialog;
200
+ };
201
+ DialogFragmentImpl.prototype.onCreateView = function (inflater, container, savedInstanceState) {
202
+ var owner = this.owner;
203
+ this.activity = new WeakRef(this.getActivity());
204
+ owner._setupAsRootView(this.getActivity());
205
+ owner._isAddedToNativeVisualTree = true;
233
206
  var window = this.getDialog().getWindow();
234
- var length = android.view.ViewGroup.LayoutParams.MATCH_PARENT;
235
- window.setLayout(length, length);
236
- // This removes the default backgroundDrawable so there are no margins.
237
- window.setBackgroundDrawable(new android.graphics.drawable.ColorDrawable(android.graphics.Color.WHITE));
238
- }
239
- var owner = this.owner;
240
- if (owner && !owner.isLoaded) {
241
- owner.callLoaded();
242
- }
243
- this._shownCallback();
244
- };
245
- DialogFragmentImpl.prototype.onDismiss = function (dialog) {
246
- var _a;
247
- _super.prototype.onDismiss.call(this, dialog);
248
- var manager = this.getFragmentManager();
249
- var activity = (_a = this.activity) === null || _a === void 0 ? void 0 : _a.get();
250
- if (manager && !(activity === null || activity === void 0 ? void 0 : activity.isChangingConfigurations())) {
251
- removeModal(this.owner._domId);
252
- this._dismissCallback();
253
- }
254
- var owner = this.owner;
255
- if (owner && owner.isLoaded) {
256
- owner.callUnloaded();
257
- }
258
- };
259
- DialogFragmentImpl.prototype.onDestroy = function () {
260
- var _a;
261
- _super.prototype.onDestroy.call(this);
262
- var owner = this.owner;
263
- var activity = (_a = this.activity) === null || _a === void 0 ? void 0 : _a.get();
264
- if (!(activity === null || activity === void 0 ? void 0 : activity.isChangingConfigurations())) {
265
- this.activity = null;
266
- }
267
- if (owner) {
268
- // Android calls onDestroy before onDismiss.
269
- // Make sure we unload first and then call _tearDownUI.
270
- if (owner.isLoaded) {
207
+ if (this._windowSoftInputMode !== undefined) {
208
+ window.setSoftInputMode(this._windowSoftInputMode);
209
+ }
210
+ else {
211
+ window.setSoftInputMode(owner._context.getWindow().getAttributes().softInputMode);
212
+ }
213
+ return owner.nativeViewProtected;
214
+ };
215
+ DialogFragmentImpl.prototype.onStart = function () {
216
+ _super.prototype.onStart.call(this);
217
+ if (this._fullscreen) {
218
+ var window = this.getDialog().getWindow();
219
+ var length = android.view.ViewGroup.LayoutParams.MATCH_PARENT;
220
+ window.setLayout(length, length);
221
+ window.setBackgroundDrawable(new android.graphics.drawable.ColorDrawable(android.graphics.Color.WHITE));
222
+ }
223
+ var owner = this.owner;
224
+ if (owner && !owner.isLoaded) {
225
+ owner.callLoaded();
226
+ }
227
+ this._shownCallback();
228
+ };
229
+ DialogFragmentImpl.prototype.onDismiss = function (dialog) {
230
+ var _a;
231
+ _super.prototype.onDismiss.call(this, dialog);
232
+ var manager = this.getFragmentManager();
233
+ var activity = (_a = this.activity) === null || _a === void 0 ? void 0 : _a.get();
234
+ if (manager && !(activity === null || activity === void 0 ? void 0 : activity.isChangingConfigurations())) {
235
+ removeModal(this.owner._domId);
236
+ this._dismissCallback();
237
+ }
238
+ var owner = this.owner;
239
+ if (owner && owner.isLoaded) {
271
240
  owner.callUnloaded();
272
241
  }
273
- owner._isAddedToNativeVisualTree = false;
274
- owner._tearDownUI(true);
275
- }
276
- };
277
- return DialogFragmentImpl;
278
- }(androidx.fragment.app.DialogFragment));
242
+ };
243
+ DialogFragmentImpl.prototype.onDestroy = function () {
244
+ var _a;
245
+ _super.prototype.onDestroy.call(this);
246
+ var owner = this.owner;
247
+ var activity = (_a = this.activity) === null || _a === void 0 ? void 0 : _a.get();
248
+ if (!(activity === null || activity === void 0 ? void 0 : activity.isChangingConfigurations())) {
249
+ this.activity = null;
250
+ }
251
+ if (owner) {
252
+ if (owner.isLoaded) {
253
+ owner.callUnloaded();
254
+ }
255
+ owner._isAddedToNativeVisualTree = false;
256
+ owner._tearDownUI(true);
257
+ }
258
+ };
259
+ return DialogFragmentImpl;
260
+ }(androidx.fragment.app.DialogFragment));
279
261
  DialogFragment = DialogFragmentImpl;
280
262
  }
281
263
  function saveModal(options) {
@@ -533,11 +515,29 @@ export class View extends ViewCommon {
533
515
  return false;
534
516
  }
535
517
  handleGestureTouch(event) {
536
- for (const type in this._gestureObservers) {
537
- const list = this._gestureObservers[type];
538
- list.forEach((element) => {
539
- element.androidOnTouchEvent(event);
540
- });
518
+ // This keeps a copy of gesture observers from the map to ensure concurrency
519
+ const allObservers = Object.values(this._gestureObservers);
520
+ for (const observers of allObservers) {
521
+ const length = observers.length;
522
+ if (!length) {
523
+ continue;
524
+ }
525
+ if (length === 1) {
526
+ const entry = observers[0];
527
+ if (entry) {
528
+ entry.androidOnTouchEvent(event);
529
+ }
530
+ }
531
+ else {
532
+ // This keeps a copy of gesture observers list to ensure concurrency
533
+ const observersCp = observers.slice();
534
+ for (let i = 0; i < length; i++) {
535
+ const entry = observersCp[i];
536
+ if (entry) {
537
+ entry.androidOnTouchEvent(event);
538
+ }
539
+ }
540
+ }
541
541
  }
542
542
  if (this.parent instanceof View) {
543
543
  this.parent.handleGestureTouch(event);