pythonnative 0.17.0__py3-none-any.whl → 0.18.0__py3-none-any.whl

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.
pythonnative/__init__.py CHANGED
@@ -51,7 +51,7 @@ Example:
51
51
  ```
52
52
  """
53
53
 
54
- __version__ = "0.17.0"
54
+ __version__ = "0.18.0"
55
55
 
56
56
  from . import runtime, sdk
57
57
  from .alerts import Alert
@@ -61,11 +61,17 @@ from .components import (
61
61
  ActivityIndicatorProps,
62
62
  Button,
63
63
  ButtonProps,
64
+ Checkbox,
65
+ CheckboxProps,
64
66
  Column,
67
+ DatePicker,
68
+ DatePickerProps,
65
69
  ErrorBoundary,
66
70
  FlatList,
67
71
  Fragment,
68
72
  Image,
73
+ ImageBackground,
74
+ ImageBackgroundProps,
69
75
  ImageProps,
70
76
  KeyboardAvoidingView,
71
77
  KeyboardAvoidingViewProps,
@@ -84,6 +90,8 @@ from .components import (
84
90
  ScrollView,
85
91
  ScrollViewProps,
86
92
  SectionList,
93
+ SegmentedControl,
94
+ SegmentedControlProps,
87
95
  Slider,
88
96
  SliderProps,
89
97
  Spacer,
@@ -96,6 +104,8 @@ from .components import (
96
104
  TextInput,
97
105
  TextInputProps,
98
106
  TextProps,
107
+ TouchableOpacity,
108
+ TouchableOpacityProps,
99
109
  View,
100
110
  ViewProps,
101
111
  WebView,
@@ -126,7 +136,25 @@ from .hooks import (
126
136
  use_state,
127
137
  use_window_dimensions,
128
138
  )
129
- from .native_modules import Camera, FileSystem, Location, Notifications
139
+ from .native_modules import (
140
+ AppState,
141
+ Battery,
142
+ Biometrics,
143
+ Camera,
144
+ Clipboard,
145
+ FileSystem,
146
+ Haptics,
147
+ Linking,
148
+ Location,
149
+ NetInfo,
150
+ Notifications,
151
+ Permissions,
152
+ SecureStore,
153
+ Share,
154
+ Vibration,
155
+ use_app_state,
156
+ use_net_info,
157
+ )
130
158
  from .navigation import (
131
159
  NavigationContainer,
132
160
  create_drawer_navigator,
@@ -178,11 +206,14 @@ __all__ = [
178
206
  # Components
179
207
  "ActivityIndicator",
180
208
  "Button",
209
+ "Checkbox",
181
210
  "Column",
211
+ "DatePicker",
182
212
  "ErrorBoundary",
183
213
  "FlatList",
184
214
  "Fragment",
185
215
  "Image",
216
+ "ImageBackground",
186
217
  "KeyboardAvoidingView",
187
218
  "Modal",
188
219
  "Picker",
@@ -193,17 +224,22 @@ __all__ = [
193
224
  "SafeAreaView",
194
225
  "ScrollView",
195
226
  "SectionList",
227
+ "SegmentedControl",
196
228
  "Slider",
197
229
  "Spacer",
198
230
  "StatusBar",
199
231
  "Switch",
200
232
  "Text",
201
233
  "TextInput",
234
+ "TouchableOpacity",
202
235
  "View",
203
236
  "WebView",
204
237
  # Built-in Props dataclasses
205
238
  "ActivityIndicatorProps",
206
239
  "ButtonProps",
240
+ "CheckboxProps",
241
+ "DatePickerProps",
242
+ "ImageBackgroundProps",
207
243
  "ImageProps",
208
244
  "KeyboardAvoidingViewProps",
209
245
  "ModalProps",
@@ -212,12 +248,14 @@ __all__ = [
212
248
  "ProgressBarProps",
213
249
  "SafeAreaViewProps",
214
250
  "ScrollViewProps",
251
+ "SegmentedControlProps",
215
252
  "SliderProps",
216
253
  "SpacerProps",
217
254
  "StatusBarProps",
218
255
  "SwitchProps",
219
256
  "TextInputProps",
220
257
  "TextProps",
258
+ "TouchableOpacityProps",
221
259
  "ViewProps",
222
260
  "WebViewProps",
223
261
  # Core
@@ -286,10 +324,23 @@ __all__ = [
286
324
  # Imperative
287
325
  "Alert",
288
326
  # Native modules
327
+ "AppState",
328
+ "Battery",
329
+ "Biometrics",
289
330
  "Camera",
331
+ "Clipboard",
290
332
  "FileSystem",
333
+ "Haptics",
334
+ "Linking",
291
335
  "Location",
336
+ "NetInfo",
292
337
  "Notifications",
338
+ "Permissions",
339
+ "SecureStore",
340
+ "Share",
341
+ "Vibration",
342
+ "use_app_state",
343
+ "use_net_info",
293
344
  # Networking + persistence
294
345
  "AsyncStorage",
295
346
  "fetch",
pythonnative/animated.py CHANGED
@@ -62,6 +62,12 @@ from .style import StyleProp, resolve_style
62
62
  _TARGET_FPS = 60.0
63
63
  _FRAME_DT = 1.0 / _TARGET_FPS
64
64
 
65
+ # Upper bound on how much wall-clock time the animation loop will try to
66
+ # catch up on in a single iteration after thread starvation. At 60 fps
67
+ # this is ~333 ms of simulated motion; further drift is dropped to keep
68
+ # the loop responsive.
69
+ _MAX_CATCHUP_FRAMES = 20
70
+
65
71
  _EASINGS: Dict[str, Callable[[float], float]] = {
66
72
  "linear": lambda t: t,
67
73
  "ease_in": lambda t: t * t,
@@ -199,6 +205,20 @@ class _AnimationManager:
199
205
 
200
206
  def _loop(self) -> None:
201
207
  last = time.monotonic()
208
+ # Clamping the per-tick dt is important for numerical stability:
209
+ # an underdamped spring with a 0.3 s step explodes immediately,
210
+ # and on iOS/Android the animation thread can be starved for
211
+ # several frames during render bursts. We integrate physics on a
212
+ # clamped dt (max 2 target frames) and sub-step when wall-clock
213
+ # has advanced more than that, so the perceived motion still
214
+ # tracks real time at most a couple of frames behind. After an
215
+ # extreme starvation (e.g. the app was backgrounded for seconds)
216
+ # we cap the catch-up at ``_MAX_CATCHUP_FRAMES`` worth of
217
+ # physics; any further wall-clock drift is dropped on the floor,
218
+ # which keeps the loop responsive instead of spinning forward
219
+ # through hundreds of substeps.
220
+ max_step = _FRAME_DT * 2.0
221
+ max_catchup = _FRAME_DT * _MAX_CATCHUP_FRAMES
202
222
  while not self._stopped:
203
223
  now = time.monotonic()
204
224
  dt = now - last
@@ -209,13 +229,19 @@ class _AnimationManager:
209
229
  time.sleep(0.05)
210
230
  last = time.monotonic()
211
231
  continue
212
- for anim in active:
213
- try:
214
- finished = anim.advance(dt)
215
- except Exception:
216
- finished = True
217
- if finished:
218
- self.remove(anim)
232
+ remaining = min(dt, max_catchup)
233
+ while remaining > 0.0:
234
+ step = remaining if remaining <= max_step else max_step
235
+ remaining -= step
236
+ for anim in active:
237
+ if getattr(anim, "_completed", False):
238
+ continue
239
+ try:
240
+ finished = anim.advance(step)
241
+ except Exception:
242
+ finished = True
243
+ if finished:
244
+ self.remove(anim)
219
245
  time.sleep(_FRAME_DT)
220
246
 
221
247