one 2.0.0-beta.100.1 → 2.0.0-beta.102.1

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 (177) hide show
  1. package/android/src/main/java/com/margelo/nitro/one/HybridOneAdaptive.kt +392 -0
  2. package/android/src/main/java/com/margelo/nitro/one/HybridOneDocumentPicker.kt +147 -0
  3. package/dist/cjs/one.cjs +1 -0
  4. package/dist/cjs/one.native.cjs +1 -0
  5. package/dist/cjs/one.native.js +1 -0
  6. package/dist/cjs/one.native.js.map +1 -1
  7. package/dist/cjs/platform/adaptive/index.native.cjs +79 -53
  8. package/dist/cjs/platform/adaptive/index.native.js +79 -53
  9. package/dist/cjs/platform/adaptive/index.native.js.map +1 -1
  10. package/dist/cjs/platform/document-picker/index.cjs +58 -0
  11. package/dist/cjs/platform/document-picker/index.native.cjs +57 -0
  12. package/dist/cjs/platform/document-picker/index.native.js +59 -0
  13. package/dist/cjs/platform/document-picker/index.native.js.map +1 -0
  14. package/dist/cjs/platform/document-picker/options.cjs +42 -0
  15. package/dist/cjs/platform/document-picker/options.native.cjs +64 -0
  16. package/dist/cjs/platform/document-picker/options.native.js +66 -0
  17. package/dist/cjs/platform/document-picker/options.native.js.map +1 -0
  18. package/dist/cjs/platform/document-picker/types.cjs +16 -0
  19. package/dist/cjs/platform/document-picker/types.native.cjs +18 -0
  20. package/dist/cjs/platform/document-picker/types.native.js +20 -0
  21. package/dist/cjs/platform/document-picker/types.native.js.map +1 -0
  22. package/dist/cjs/platform/index.cjs +2 -0
  23. package/dist/cjs/platform/index.native.cjs +2 -0
  24. package/dist/cjs/platform/index.native.js +2 -0
  25. package/dist/cjs/platform/index.native.js.map +1 -1
  26. package/dist/cjs/platform/specs/OneAdaptive.nitro.cjs +16 -0
  27. package/dist/cjs/platform/specs/OneAdaptive.nitro.native.cjs +18 -0
  28. package/dist/cjs/platform/specs/OneAdaptive.nitro.native.js +20 -0
  29. package/dist/cjs/platform/specs/OneAdaptive.nitro.native.js.map +1 -0
  30. package/dist/cjs/platform/specs/OneDocumentPicker.nitro.cjs +16 -0
  31. package/dist/cjs/platform/specs/OneDocumentPicker.nitro.native.cjs +18 -0
  32. package/dist/cjs/platform/specs/OneDocumentPicker.nitro.native.js +20 -0
  33. package/dist/cjs/platform/specs/OneDocumentPicker.nitro.native.js.map +1 -0
  34. package/dist/cjs/platform/ui/Image.native.cjs +32 -5
  35. package/dist/cjs/platform/ui/Image.native.js +32 -5
  36. package/dist/cjs/platform/ui/Image.native.js.map +1 -1
  37. package/dist/cjs/vite/plugins/swiftPackagePlugin.cjs +4 -1
  38. package/dist/cjs/vite/plugins/swiftPackagePlugin.native.cjs +4 -1
  39. package/dist/cjs/vite/plugins/swiftPackagePlugin.native.js +4 -1
  40. package/dist/cjs/vite/plugins/swiftPackagePlugin.native.js.map +1 -1
  41. package/dist/esm/one.mjs +2 -1
  42. package/dist/esm/one.mjs.map +1 -1
  43. package/dist/esm/one.native.js +2 -1
  44. package/dist/esm/one.native.js.map +1 -1
  45. package/dist/esm/platform/adaptive/index.native.js +79 -53
  46. package/dist/esm/platform/adaptive/index.native.js.map +1 -1
  47. package/dist/esm/platform/document-picker/index.mjs +39 -0
  48. package/dist/esm/platform/document-picker/index.mjs.map +1 -0
  49. package/dist/esm/platform/document-picker/index.native.js +36 -0
  50. package/dist/esm/platform/document-picker/index.native.js.map +1 -0
  51. package/dist/esm/platform/document-picker/options.mjs +22 -0
  52. package/dist/esm/platform/document-picker/options.mjs.map +1 -0
  53. package/dist/esm/platform/document-picker/options.native.js +42 -0
  54. package/dist/esm/platform/document-picker/options.native.js.map +1 -0
  55. package/dist/esm/platform/document-picker/types.mjs +0 -0
  56. package/dist/esm/platform/document-picker/types.native.js +0 -0
  57. package/dist/esm/platform/index.mjs +2 -1
  58. package/dist/esm/platform/index.mjs.map +1 -1
  59. package/dist/esm/platform/index.native.js +2 -1
  60. package/dist/esm/platform/index.native.js.map +1 -1
  61. package/dist/esm/platform/specs/OneAdaptive.nitro.mjs +0 -0
  62. package/dist/esm/platform/specs/OneAdaptive.nitro.native.js +0 -0
  63. package/dist/esm/platform/specs/OneDocumentPicker.nitro.mjs +0 -0
  64. package/dist/esm/platform/specs/OneDocumentPicker.nitro.native.js +0 -0
  65. package/dist/esm/platform/ui/Image.native.js +32 -5
  66. package/dist/esm/platform/ui/Image.native.js.map +1 -1
  67. package/dist/esm/vite/plugins/swiftPackagePlugin.mjs +4 -1
  68. package/dist/esm/vite/plugins/swiftPackagePlugin.mjs.map +1 -1
  69. package/dist/esm/vite/plugins/swiftPackagePlugin.native.js +4 -1
  70. package/dist/esm/vite/plugins/swiftPackagePlugin.native.js.map +1 -1
  71. package/ios/Nitro/HybridOneAdaptive.swift +243 -0
  72. package/ios/Nitro/HybridOneDocumentPicker.swift +156 -0
  73. package/ios/Nitro/HybridOneNotifications.swift +12 -16
  74. package/ios/OneNotificationsLaunch.mm +37 -0
  75. package/nitrogen/generated/android/One+autolinking.cmake +4 -0
  76. package/nitrogen/generated/android/OneOnLoad.cpp +38 -2
  77. package/nitrogen/generated/android/c++/JDocumentPickerAsset.hpp +70 -0
  78. package/nitrogen/generated/android/c++/JDocumentPickerNativeResult.hpp +83 -0
  79. package/nitrogen/generated/android/c++/JFunc_void_SizeClass.hpp +79 -0
  80. package/nitrogen/generated/android/c++/JFunc_void_std__optional_HingeState_.hpp +80 -0
  81. package/nitrogen/generated/android/c++/JHingeState.hpp +62 -0
  82. package/nitrogen/generated/android/c++/JHingeStatus.hpp +64 -0
  83. package/nitrogen/generated/android/c++/JHybridOneAdaptiveSpec.cpp +138 -0
  84. package/nitrogen/generated/android/c++/JHybridOneAdaptiveSpec.hpp +68 -0
  85. package/nitrogen/generated/android/c++/JHybridOneDocumentPickerSpec.cpp +79 -0
  86. package/nitrogen/generated/android/c++/JHybridOneDocumentPickerSpec.hpp +63 -0
  87. package/nitrogen/generated/android/c++/JNetworkStateType.hpp +3 -3
  88. package/nitrogen/generated/android/c++/JResolvedDocumentPickerOptions.hpp +80 -0
  89. package/nitrogen/generated/android/c++/JSizeClass.hpp +62 -0
  90. package/nitrogen/generated/android/c++/JUserInterfaceSizeClass.hpp +61 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/DocumentPickerAsset.kt +66 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/DocumentPickerNativeResult.kt +56 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/Func_void_SizeClass.kt +78 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/Func_void_std__optional_HingeState_.kt +78 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HingeState.kt +56 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HingeStatus.kt +25 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneAdaptiveSpec.kt +87 -0
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneDocumentPickerSpec.kt +57 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/NetworkStateType.kt +2 -2
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/ResolvedDocumentPickerOptions.kt +56 -0
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SizeClass.kt +56 -0
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/UserInterfaceSizeClass.kt +24 -0
  103. package/nitrogen/generated/ios/One-Swift-Cxx-Bridge.cpp +71 -13
  104. package/nitrogen/generated/ios/One-Swift-Cxx-Bridge.hpp +316 -65
  105. package/nitrogen/generated/ios/One-Swift-Cxx-Umbrella.hpp +31 -0
  106. package/nitrogen/generated/ios/OneAutolinking.mm +16 -0
  107. package/nitrogen/generated/ios/OneAutolinking.swift +24 -0
  108. package/nitrogen/generated/ios/c++/HybridOneAdaptiveSpecSwift.cpp +11 -0
  109. package/nitrogen/generated/ios/c++/HybridOneAdaptiveSpecSwift.hpp +135 -0
  110. package/nitrogen/generated/ios/c++/HybridOneDocumentPickerSpecSwift.cpp +11 -0
  111. package/nitrogen/generated/ios/c++/HybridOneDocumentPickerSpecSwift.hpp +93 -0
  112. package/nitrogen/generated/ios/swift/DocumentPickerAsset.swift +70 -0
  113. package/nitrogen/generated/ios/swift/DocumentPickerNativeResult.swift +53 -0
  114. package/nitrogen/generated/ios/swift/Func_void_DocumentPickerNativeResult.swift +46 -0
  115. package/nitrogen/generated/ios/swift/Func_void_SizeClass.swift +46 -0
  116. package/nitrogen/generated/ios/swift/Func_void_std__optional_HingeState_.swift +46 -0
  117. package/nitrogen/generated/ios/swift/HingeState.swift +34 -0
  118. package/nitrogen/generated/ios/swift/HingeStatus.swift +48 -0
  119. package/nitrogen/generated/ios/swift/HybridOneAdaptiveSpec.swift +60 -0
  120. package/nitrogen/generated/ios/swift/HybridOneAdaptiveSpec_cxx.swift +246 -0
  121. package/nitrogen/generated/ios/swift/HybridOneDocumentPickerSpec.swift +55 -0
  122. package/nitrogen/generated/ios/swift/HybridOneDocumentPickerSpec_cxx.swift +145 -0
  123. package/nitrogen/generated/ios/swift/NetworkStateType.swift +4 -4
  124. package/nitrogen/generated/ios/swift/ResolvedDocumentPickerOptions.swift +40 -0
  125. package/nitrogen/generated/ios/swift/SizeClass.swift +34 -0
  126. package/nitrogen/generated/ios/swift/UserInterfaceSizeClass.swift +44 -0
  127. package/nitrogen/generated/shared/c++/DocumentPickerAsset.hpp +96 -0
  128. package/nitrogen/generated/shared/c++/DocumentPickerNativeResult.hpp +90 -0
  129. package/nitrogen/generated/shared/c++/HingeState.hpp +88 -0
  130. package/nitrogen/generated/shared/c++/HingeStatus.hpp +84 -0
  131. package/nitrogen/generated/shared/c++/HybridOneAdaptiveSpec.cpp +26 -0
  132. package/nitrogen/generated/shared/c++/HybridOneAdaptiveSpec.hpp +74 -0
  133. package/nitrogen/generated/shared/c++/HybridOneDocumentPickerSpec.cpp +21 -0
  134. package/nitrogen/generated/shared/c++/HybridOneDocumentPickerSpec.hpp +67 -0
  135. package/nitrogen/generated/shared/c++/NetworkStateType.hpp +5 -5
  136. package/nitrogen/generated/shared/c++/ResolvedDocumentPickerOptions.hpp +88 -0
  137. package/nitrogen/generated/shared/c++/SizeClass.hpp +88 -0
  138. package/nitrogen/generated/shared/c++/UserInterfaceSizeClass.hpp +80 -0
  139. package/package.json +10 -10
  140. package/src/one.ts +3 -0
  141. package/src/platform/adaptive/index.native.ts +99 -66
  142. package/src/platform/document-picker/index.native.ts +50 -0
  143. package/src/platform/document-picker/index.ts +51 -0
  144. package/src/platform/document-picker/options.ts +30 -0
  145. package/src/platform/document-picker/types.ts +34 -0
  146. package/src/platform/index.native.ts +8 -0
  147. package/src/platform/index.ts +8 -0
  148. package/src/platform/specs/OneAdaptive.nitro.ts +18 -0
  149. package/src/platform/specs/OneDocumentPicker.nitro.ts +16 -0
  150. package/src/platform/ui/Image.native.tsx +43 -8
  151. package/src/vite/plugins/swiftPackagePlugin.ts +9 -1
  152. package/types/one.d.ts +2 -1
  153. package/types/one.d.ts.map +1 -1
  154. package/types/platform/adaptive/index.native.d.ts +7 -3
  155. package/types/platform/adaptive/index.native.d.ts.map +1 -1
  156. package/types/platform/document-picker/index.d.ts +7 -0
  157. package/types/platform/document-picker/index.d.ts.map +1 -0
  158. package/types/platform/document-picker/index.native.d.ts +7 -0
  159. package/types/platform/document-picker/index.native.d.ts.map +1 -0
  160. package/types/platform/document-picker/options.d.ts +7 -0
  161. package/types/platform/document-picker/options.d.ts.map +1 -0
  162. package/types/platform/document-picker/types.d.ts +20 -0
  163. package/types/platform/document-picker/types.d.ts.map +1 -0
  164. package/types/platform/index.d.ts +2 -0
  165. package/types/platform/index.d.ts.map +1 -1
  166. package/types/platform/index.native.d.ts +2 -0
  167. package/types/platform/index.native.d.ts.map +1 -1
  168. package/types/platform/specs/OneAdaptive.nitro.d.ts +14 -0
  169. package/types/platform/specs/OneAdaptive.nitro.d.ts.map +1 -0
  170. package/types/platform/specs/OneDocumentPicker.nitro.d.ts +14 -0
  171. package/types/platform/specs/OneDocumentPicker.nitro.d.ts.map +1 -0
  172. package/types/platform/ui/Image.native.d.ts +16 -2
  173. package/types/platform/ui/Image.native.d.ts.map +1 -1
  174. package/types/vite/plugins/swiftPackagePlugin.d.ts.map +1 -1
  175. package/ios/OneNativeAdaptive.h +0 -5
  176. package/ios/OneNativeAdaptive.mm +0 -96
  177. package/ios/OneNativeAdaptiveBridge.swift +0 -134
@@ -0,0 +1,392 @@
1
+ package com.margelo.nitro.one
2
+
3
+ import android.app.Activity
4
+ import android.content.ComponentCallbacks
5
+ import android.content.Context
6
+ import android.content.res.Configuration
7
+ import android.hardware.Sensor
8
+ import android.hardware.SensorEvent
9
+ import android.hardware.SensorEventListener
10
+ import android.hardware.SensorManager
11
+ import android.os.Handler
12
+ import android.os.Looper
13
+ import androidx.core.content.ContextCompat
14
+ import androidx.core.util.Consumer
15
+ import androidx.window.WindowSdkExtensions
16
+ import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter
17
+ import androidx.window.layout.FoldingFeature
18
+ import androidx.window.layout.WindowInfoTracker
19
+ import androidx.window.layout.WindowLayoutInfo
20
+ import androidx.window.layout.WindowMetricsCalculator
21
+ import com.margelo.nitro.NitroModules
22
+ import com.margelo.nitro.core.Promise
23
+
24
+ // window size class and hinge state, the android half of OneAdaptive. size
25
+ // classes come from the current activity window's WindowMetrics against the
26
+ // Jetpack WindowSizeClass breakpoints (width compact below 600dp, height
27
+ // compact below 480dp, else regular) and re-emit on configuration and
28
+ // window-layout changes. hinge status comes from the WindowInfoTracker
29
+ // FoldingFeature (FLAT fullyOpen, HALF_OPENED partiallyOpen) with the angle
30
+ // from the hinge-angle sensor in radians; a hinge sensor with no
31
+ // FoldingFeature in the current window reads closed, and a device with no
32
+ // hinge sensor reads null. the first listener starts the monitors and the
33
+ // last removal stops them, including the sensor.
34
+ class HybridOneAdaptive : HybridOneAdaptiveSpec() {
35
+ private val sizeClassListeners = mutableMapOf<Int, (SizeClass) -> Unit>()
36
+ private val hingeListeners = mutableMapOf<Int, (HingeState?) -> Unit>()
37
+ private var nextListenerId = 0
38
+
39
+ private var configCallbacks: ComponentCallbacks? = null
40
+ private var layoutTracker: WindowInfoTrackerCallbackAdapter? = null
41
+ private val layoutConsumer = Consumer<WindowLayoutInfo> { info ->
42
+ synchronized(this) {
43
+ foldingFeatures = info.displayFeatures.filterIsInstance<FoldingFeature>()
44
+ }
45
+ emitSizeClassIfChanged()
46
+ emitHinge()
47
+ }
48
+ private var foldingFeatures: List<FoldingFeature> = emptyList()
49
+
50
+ private var sensorListener: SensorEventListener? = null
51
+ private var lastAngleDeg: Float? = null
52
+ private var hingeSensorChecked = false
53
+ private var hingeSensor: Sensor? = null
54
+
55
+ private var lastSizeClass: SizeClass? = null
56
+ private var lastHinge: HingeState? = null
57
+ private var lastHingeSet = false
58
+
59
+ private fun activity(): Activity? =
60
+ NitroModules.applicationContext?.currentActivity
61
+
62
+ private fun appContext(): Context? = NitroModules.applicationContext
63
+
64
+ private fun computeSizeClass(): SizeClass {
65
+ val current = activity()
66
+ ?: return SizeClass(UserInterfaceSizeClass.UNSPECIFIED, UserInterfaceSizeClass.UNSPECIFIED)
67
+ return try {
68
+ val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(current)
69
+ val density = current.resources.displayMetrics.density
70
+ if (density <= 0) {
71
+ return SizeClass(UserInterfaceSizeClass.UNSPECIFIED, UserInterfaceSizeClass.UNSPECIFIED)
72
+ }
73
+ val widthDp = metrics.bounds.width() / density
74
+ val heightDp = metrics.bounds.height() / density
75
+ SizeClass(
76
+ if (widthDp < 600) UserInterfaceSizeClass.COMPACT else UserInterfaceSizeClass.REGULAR,
77
+ if (heightDp < 480) UserInterfaceSizeClass.COMPACT else UserInterfaceSizeClass.REGULAR
78
+ )
79
+ } catch (e: Exception) {
80
+ throw OneNativeError("E_ADAPTIVE_SIZE_CLASS", "Adaptive.getSizeClass: ${e.message}")
81
+ }
82
+ }
83
+
84
+ private fun hasHingeSensor(): Boolean {
85
+ synchronized(this) {
86
+ if (hingeSensorChecked) return hingeSensor != null
87
+ hingeSensorChecked = true
88
+ hingeSensor =
89
+ try {
90
+ val manager = appContext()?.getSystemService(Context.SENSOR_SERVICE) as? SensorManager
91
+ manager?.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
92
+ } catch (e: Exception) {
93
+ null
94
+ }
95
+ return hingeSensor != null
96
+ }
97
+ }
98
+
99
+ private fun currentFoldingFeatures(): List<FoldingFeature> {
100
+ synchronized(this) {
101
+ if (foldingFeatures.isNotEmpty()) return foldingFeatures
102
+ }
103
+ // one-shot read before any layout callback has landed.
104
+ return try {
105
+ val context = appContext()
106
+ val current = activity()
107
+ if (context == null || current == null) emptyList()
108
+ else if (WindowSdkExtensions.getInstance().extensionVersion < 9) emptyList()
109
+ else {
110
+ WindowInfoTracker.getOrCreate(context)
111
+ .getCurrentWindowLayoutInfo(current)
112
+ .displayFeatures.filterIsInstance<FoldingFeature>()
113
+ }
114
+ } catch (e: Exception) {
115
+ emptyList()
116
+ }
117
+ }
118
+
119
+ private fun computeHinge(): HingeState? {
120
+ if (!hasHingeSensor()) return null
121
+ val angleRad =
122
+ synchronized(this) { lastAngleDeg }?.let { (it * Math.PI / 180.0) }
123
+ val features = currentFoldingFeatures()
124
+ val feature = features.firstOrNull()
125
+ return when (feature?.state) {
126
+ FoldingFeature.State.FLAT ->
127
+ HingeState(HingeStatus.FULLYOPEN, angleRad ?: Math.PI)
128
+ FoldingFeature.State.HALF_OPENED ->
129
+ HingeState(HingeStatus.PARTIALLYOPEN, angleRad ?: (Math.PI / 2.0))
130
+ else -> HingeState(HingeStatus.CLOSED, angleRad ?: 0.0)
131
+ }
132
+ }
133
+
134
+ override fun getSizeClass(): Promise<SizeClass> =
135
+ Promise.async {
136
+ try {
137
+ computeSizeClass()
138
+ } catch (e: OneNativeError) {
139
+ throw e
140
+ } catch (e: Exception) {
141
+ throw OneNativeError("E_ADAPTIVE_SIZE_CLASS", "Adaptive.getSizeClass: ${e.message}")
142
+ }
143
+ }
144
+
145
+ // synchronous seed for the JS import-time read: the same measurement as
146
+ // getSizeClass/getHinge, unspecified when no activity is attached yet.
147
+ override fun getInitialSizeClass(): SizeClass = computeSizeClass()
148
+
149
+ override fun getInitialHinge(): HingeState? = computeHinge()
150
+
151
+ override fun getHinge(): Promise<HingeState?> =
152
+ Promise.async {
153
+ try {
154
+ computeHinge()
155
+ } catch (e: OneNativeError) {
156
+ throw e
157
+ } catch (e: Exception) {
158
+ throw OneNativeError("E_ADAPTIVE_HINGE", "Adaptive.getHinge: ${e.message}")
159
+ }
160
+ }
161
+
162
+ override fun addSizeClassListener(listener: (sizeClass: SizeClass) -> Unit): () -> Unit {
163
+ val id: Int
164
+ val shouldStart: Boolean
165
+ synchronized(this) {
166
+ id = nextListenerId++
167
+ sizeClassListeners[id] = listener
168
+ shouldStart = sizeClassListeners.size + hingeListeners.size == 1
169
+ }
170
+ if (shouldStart) startMonitors()
171
+ // deliver the current value to the newcomer without racing the monitor.
172
+ try {
173
+ val current = computeSizeClass()
174
+ synchronized(this) {
175
+ if (lastSizeClass == null) lastSizeClass = current
176
+ }
177
+ listener(current)
178
+ } catch (e: Exception) {
179
+ // monitoring continues; the next change still emits.
180
+ }
181
+ return { removeSizeClassListener(id) }
182
+ }
183
+
184
+ override fun addHingeListener(listener: (hinge: HingeState?) -> Unit): () -> Unit {
185
+ val id: Int
186
+ val shouldStart: Boolean
187
+ synchronized(this) {
188
+ id = nextListenerId++
189
+ hingeListeners[id] = listener
190
+ shouldStart = sizeClassListeners.size + hingeListeners.size == 1
191
+ }
192
+ if (shouldStart) startMonitors() else startSensorIfNeeded()
193
+ try {
194
+ val current = computeHinge()
195
+ synchronized(this) {
196
+ if (!lastHingeSet) {
197
+ lastHinge = current
198
+ lastHingeSet = true
199
+ }
200
+ }
201
+ listener(current)
202
+ } catch (e: Exception) {
203
+ }
204
+ return { removeHingeListener(id) }
205
+ }
206
+
207
+ private fun removeSizeClassListener(id: Int) {
208
+ val shouldStop: Boolean
209
+ synchronized(this) {
210
+ sizeClassListeners.remove(id)
211
+ shouldStop = sizeClassListeners.isEmpty() && hingeListeners.isEmpty()
212
+ }
213
+ if (shouldStop) stopMonitors()
214
+ }
215
+
216
+ private fun removeHingeListener(id: Int) {
217
+ val shouldStop: Boolean
218
+ val stopSensor: Boolean
219
+ synchronized(this) {
220
+ hingeListeners.remove(id)
221
+ shouldStop = sizeClassListeners.isEmpty() && hingeListeners.isEmpty()
222
+ stopSensor = hingeListeners.isEmpty()
223
+ }
224
+ if (stopSensor) stopSensor()
225
+ if (shouldStop) stopMonitors()
226
+ }
227
+
228
+ private fun startMonitors() {
229
+ val context = appContext() ?: return
230
+ synchronized(this) {
231
+ if (configCallbacks == null) {
232
+ val callbacks =
233
+ object : ComponentCallbacks {
234
+ override fun onConfigurationChanged(newConfig: Configuration) {
235
+ emitSizeClassIfChanged()
236
+ emitHinge()
237
+ }
238
+
239
+ override fun onLowMemory() = Unit
240
+ }
241
+ configCallbacks = callbacks
242
+ context.registerComponentCallbacks(callbacks)
243
+ }
244
+ }
245
+ startLayoutTracking()
246
+ startSensorIfNeeded()
247
+ }
248
+
249
+ private fun startLayoutTracking() {
250
+ synchronized(this) {
251
+ if (layoutTracker != null) return
252
+ }
253
+ try {
254
+ val context = appContext() ?: return
255
+ val current = activity() ?: return
256
+ val tracker = WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(context))
257
+ tracker.addWindowLayoutInfoListener(
258
+ current, ContextCompat.getMainExecutor(context), layoutConsumer
259
+ )
260
+ synchronized(this) {
261
+ layoutTracker = tracker
262
+ }
263
+ } catch (e: Exception) {
264
+ // window tracking is best-effort; configuration changes still emit.
265
+ }
266
+ }
267
+
268
+ private fun startSensorIfNeeded() {
269
+ val hasListeners: Boolean
270
+ synchronized(this) {
271
+ hasListeners = hingeListeners.isNotEmpty()
272
+ if (!hasListeners || sensorListener != null) return
273
+ }
274
+ if (!hasHingeSensor()) return
275
+ try {
276
+ val manager = appContext()?.getSystemService(Context.SENSOR_SERVICE) as? SensorManager
277
+ val sensor = synchronized(this) { hingeSensor } ?: return
278
+ val listener =
279
+ object : SensorEventListener {
280
+ override fun onSensorChanged(event: SensorEvent) {
281
+ val degrees = event.values.firstOrNull() ?: return
282
+ synchronized(this@HybridOneAdaptive) {
283
+ lastAngleDeg = degrees
284
+ }
285
+ emitHinge()
286
+ }
287
+
288
+ override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit
289
+ }
290
+ manager?.registerListener(
291
+ listener, sensor, SensorManager.SENSOR_DELAY_NORMAL,
292
+ Handler(Looper.getMainLooper())
293
+ )
294
+ synchronized(this) {
295
+ // a second caller may have registered while we were working.
296
+ if (sensorListener == null) sensorListener = listener
297
+ else manager?.unregisterListener(listener)
298
+ }
299
+ } catch (e: Exception) {
300
+ // hinge angle stays at its default; status still reports.
301
+ }
302
+ }
303
+
304
+ private fun stopSensor() {
305
+ val listener: SensorEventListener?
306
+ synchronized(this) {
307
+ listener = sensorListener
308
+ sensorListener = null
309
+ }
310
+ if (listener != null) {
311
+ try {
312
+ val manager = appContext()?.getSystemService(Context.SENSOR_SERVICE) as? SensorManager
313
+ manager?.unregisterListener(listener)
314
+ } catch (e: Exception) {
315
+ }
316
+ }
317
+ }
318
+
319
+ private fun stopMonitors() {
320
+ val callbacks: ComponentCallbacks?
321
+ val tracker: WindowInfoTrackerCallbackAdapter?
322
+ synchronized(this) {
323
+ callbacks = configCallbacks
324
+ configCallbacks = null
325
+ tracker = layoutTracker
326
+ layoutTracker = null
327
+ }
328
+ if (callbacks != null) {
329
+ try {
330
+ appContext()?.unregisterComponentCallbacks(callbacks)
331
+ } catch (e: Exception) {
332
+ }
333
+ }
334
+ if (tracker != null) {
335
+ try {
336
+ tracker.removeWindowLayoutInfoListener(layoutConsumer)
337
+ } catch (e: Exception) {
338
+ }
339
+ }
340
+ stopSensor()
341
+ }
342
+
343
+ private fun emitSizeClassIfChanged() {
344
+ val next: SizeClass
345
+ try {
346
+ next = computeSizeClass()
347
+ } catch (e: Exception) {
348
+ return
349
+ }
350
+ // a rotation can detach the activity before the new window exists;
351
+ // reattach layout tracking once it is back.
352
+ if (next.horizontal != UserInterfaceSizeClass.UNSPECIFIED) startLayoutTracking()
353
+ val changed: Boolean
354
+ synchronized(this) {
355
+ changed = lastSizeClass == null || lastSizeClass != next
356
+ if (changed) lastSizeClass = next
357
+ }
358
+ if (!changed) return
359
+ val current = synchronized(this) { sizeClassListeners.values.toList() }
360
+ current.forEach {
361
+ try {
362
+ it(next)
363
+ } catch (e: Exception) {
364
+ }
365
+ }
366
+ }
367
+
368
+ private fun emitHinge() {
369
+ val next: HingeState?
370
+ try {
371
+ next = computeHinge()
372
+ } catch (e: Exception) {
373
+ return
374
+ }
375
+ val changed: Boolean
376
+ synchronized(this) {
377
+ changed = !lastHingeSet || lastHinge != next
378
+ if (changed) {
379
+ lastHinge = next
380
+ lastHingeSet = true
381
+ }
382
+ }
383
+ if (!changed) return
384
+ val current = synchronized(this) { hingeListeners.values.toList() }
385
+ current.forEach {
386
+ try {
387
+ it(next)
388
+ } catch (e: Exception) {
389
+ }
390
+ }
391
+ }
392
+ }
@@ -0,0 +1,147 @@
1
+ package com.margelo.nitro.one
2
+
3
+ import android.app.Activity
4
+ import android.content.ActivityNotFoundException
5
+ import android.content.Intent
6
+ import android.net.Uri
7
+ import android.provider.OpenableColumns
8
+ import com.facebook.react.bridge.ActivityEventListener
9
+ import com.margelo.nitro.NitroModules
10
+ import com.margelo.nitro.core.Promise
11
+ import java.io.File
12
+ import java.io.FileOutputStream
13
+ import java.util.UUID
14
+
15
+ // imperative document picker: ACTION_OPEN_DOCUMENT filtered by mime type.
16
+ // each picked file is copied into the app cache under its display name and
17
+ // returned as a file uri, so no provider grant outlives the pick. backing out
18
+ // resolves canceled; only runtime failures reject. calls arrive on the js
19
+ // thread and results on the ui thread, so the pending slot is only taken or
20
+ // settled under the lock.
21
+ class HybridOneDocumentPicker : HybridOneDocumentPickerSpec(), ActivityEventListener {
22
+ private val lock = Any()
23
+ private var pending: Promise<DocumentPickerNativeResult>? = null
24
+
25
+ init {
26
+ NitroModules.applicationContext?.addActivityEventListener(this)
27
+ }
28
+
29
+ override fun dispose() {
30
+ NitroModules.applicationContext?.removeActivityEventListener(this)
31
+ takePending()?.reject(OneNativeError(E_FAILED, "DocumentPicker.getDocument: torn down mid-request"))
32
+ super.dispose()
33
+ }
34
+
35
+ // a hybrid object has no lifecycle owner to register activity result
36
+ // launchers against, so it launches the intent the classic way and reads
37
+ // the result through the activity event listener.
38
+ @Suppress("DEPRECATION")
39
+ override fun getDocument(options: ResolvedDocumentPickerOptions): Promise<DocumentPickerNativeResult> {
40
+ val promise = Promise<DocumentPickerNativeResult>()
41
+ // one pick in flight: native owns the slot, so a second pick rejects
42
+ // instead of clobbering the pending promise.
43
+ synchronized(lock) {
44
+ if (pending != null) {
45
+ promise.reject(OneNativeError(E_FAILED, "DocumentPicker.getDocument: another request is already in flight"))
46
+ return promise
47
+ }
48
+ pending = promise
49
+ }
50
+ val activity = NitroModules.applicationContext?.currentActivity
51
+ if (activity == null) {
52
+ rejectPending("found no activity to present from")
53
+ return promise
54
+ }
55
+ val intent =
56
+ Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
57
+ addCategory(Intent.CATEGORY_OPENABLE)
58
+ if (options.types.size == 1) {
59
+ type = options.types[0]
60
+ } else {
61
+ type = "*/*"
62
+ putExtra(Intent.EXTRA_MIME_TYPES, options.types)
63
+ }
64
+ putExtra(Intent.EXTRA_ALLOW_MULTIPLE, options.multiple)
65
+ }
66
+ try {
67
+ activity.startActivityForResult(intent, REQUEST_DOCUMENT, null)
68
+ } catch (e: ActivityNotFoundException) {
69
+ rejectPending("found no document picker on this device")
70
+ } catch (e: Exception) {
71
+ rejectPending(e.message ?: "could not open the document picker")
72
+ }
73
+ return promise
74
+ }
75
+
76
+ override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
77
+ if (requestCode != REQUEST_DOCUMENT) return
78
+ val uris = pickedUris(resultCode, data)
79
+ if (uris.isEmpty()) {
80
+ takePending()?.resolve(DocumentPickerNativeResult(true, null))
81
+ return
82
+ }
83
+ // copying can take a while for large files; keep it off the ui thread.
84
+ Thread {
85
+ try {
86
+ val assets = uris.map { copyToCache(it) }.toTypedArray()
87
+ takePending()?.resolve(DocumentPickerNativeResult(false, assets))
88
+ } catch (e: Exception) {
89
+ rejectPending(e.message ?: "could not copy a picked file")
90
+ }
91
+ }.start()
92
+ }
93
+
94
+ override fun onNewIntent(intent: Intent) {}
95
+
96
+ private fun pickedUris(resultCode: Int, data: Intent?): List<Uri> {
97
+ if (resultCode != Activity.RESULT_OK || data == null) return emptyList()
98
+ val clip = data.clipData
99
+ if (clip != null) {
100
+ return (0 until clip.itemCount).mapNotNull { clip.getItemAt(it).uri }
101
+ }
102
+ return listOfNotNull(data.data)
103
+ }
104
+
105
+ // each pick gets its own directory so the display name survives as the
106
+ // file name without colliding with an earlier pick of the same name.
107
+ private fun copyToCache(source: Uri): DocumentPickerAsset {
108
+ val context =
109
+ NitroModules.applicationContext
110
+ ?: throw IllegalStateException("the react context is not ready")
111
+ val resolver = context.contentResolver
112
+ var name: String? = null
113
+ resolver.query(source, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use {
114
+ val index = it.getColumnIndex(OpenableColumns.DISPLAY_NAME)
115
+ if (it.moveToFirst() && index >= 0) name = it.getString(index)
116
+ }
117
+ // a display name is the provider's word, so strip any path from it.
118
+ val fileName = name?.substringAfterLast('/')?.takeIf { it.isNotBlank() } ?: "document"
119
+ val dir = File(File(context.cacheDir, "one-native-document-picker"), UUID.randomUUID().toString())
120
+ dir.mkdirs()
121
+ val dest = File(dir, fileName)
122
+ (resolver.openInputStream(source) ?: throw IllegalStateException("cannot open $source")).use { input ->
123
+ FileOutputStream(dest).use { output -> input.copyTo(output) }
124
+ }
125
+ return DocumentPickerAsset(
126
+ Uri.fromFile(dest).toString(),
127
+ fileName,
128
+ resolver.getType(source),
129
+ dest.length().toDouble()
130
+ )
131
+ }
132
+
133
+ private fun takePending(): Promise<DocumentPickerNativeResult>? = synchronized(lock) {
134
+ val promise = pending
135
+ pending = null
136
+ promise
137
+ }
138
+
139
+ private fun rejectPending(message: String) {
140
+ takePending()?.reject(OneNativeError(E_FAILED, "DocumentPicker.getDocument: $message"))
141
+ }
142
+
143
+ companion object {
144
+ private const val E_FAILED = "E_DOCUMENT_PICKER_FAILED"
145
+ private const val REQUEST_DOCUMENT = 0x1B01
146
+ }
147
+ }
package/dist/cjs/one.cjs CHANGED
@@ -83,6 +83,7 @@ const One = Object.freeze({
83
83
  Network: import_platform.Network,
84
84
  Browser: import_platform.Browser,
85
85
  ImagePicker: import_platform.ImagePicker,
86
+ DocumentPicker: import_platform.DocumentPicker,
86
87
  SecureStore: import_platform.SecureStore,
87
88
  useNetworkState: import_platform.useNetworkState
88
89
  });
@@ -86,6 +86,7 @@ var One = Object.freeze({
86
86
  Network: import_platform.Network,
87
87
  Browser: import_platform.Browser,
88
88
  ImagePicker: import_platform.ImagePicker,
89
+ DocumentPicker: import_platform.DocumentPicker,
89
90
  SecureStore: import_platform.SecureStore,
90
91
  useNetworkState: import_platform.useNetworkState
91
92
  });
@@ -86,6 +86,7 @@ var One = Object.freeze({
86
86
  Network: import_platform.Network,
87
87
  Browser: import_platform.Browser,
88
88
  ImagePicker: import_platform.ImagePicker,
89
+ DocumentPicker: import_platform.DocumentPicker,
89
90
  SecureStore: import_platform.SecureStore,
90
91
  useNetworkState: import_platform.useNetworkState
91
92
  });
@@ -1 +1 @@
1
- {"version":3,"file":"one.native.js","names":[],"sources":["cjs/one.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar one_exports = {};\n__export(one_exports, {\n One: () => One\n});\nmodule.exports = __toCommonJS(one_exports);\nvar import_platform = require(\"./platform\");\nvar import_safe_area_context = require(\"./safe-area-context\");\nfunction currentPlatform() {\n var _Reflect_get;\n var defined = (_Reflect_get = Reflect.get(globalThis, \"__ONE_PLATFORM__\")) !== null && _Reflect_get !== void 0 ? _Reflect_get : typeof process !== \"undefined\" ? process.env.ONE_PLATFORM : void 0;\n return defined === \"ios\" || defined === \"android\" || defined === \"rnx\" ? defined : \"web\";\n}\nvar iOS = Object.freeze({\n ...import_platform.Swift,\n Widgets: import_platform.Widgets,\n LiveActivities: import_platform.LiveActivities,\n WidgetUI: import_platform.WidgetUI,\n Color: import_platform.Color.ios,\n MenuAction: import_platform.MenuAction,\n SplitView: import_platform.SplitView,\n ToolbarHost: import_platform.ToolbarHost,\n BarButtonItem: import_platform.ToolbarItem,\n ZoomTransitionAlignmentRectDetector: import_platform.ZoomTransitionAlignmentRectDetector,\n ZoomTransitionEnabler: import_platform.ZoomTransitionEnabler,\n ZoomTransitionSource: import_platform.ZoomTransitionSource\n});\nvar Android = Object.freeze({\n ...import_platform.Compose,\n Color: import_platform.Color.android,\n Menu: import_platform.Menu,\n ContextMenu: import_platform.ContextMenu\n});\nvar SafeArea = Object.freeze({\n Provider: import_safe_area_context.SafeAreaProvider,\n View: import_safe_area_context.SafeAreaView,\n initialMetrics: import_safe_area_context.initialWindowMetrics,\n useFrame: import_safe_area_context.useSafeAreaFrame,\n useInsets: import_safe_area_context.useSafeAreaInsets\n});\nvar UI = Object.freeze({\n ...import_platform.UI,\n Fonts: import_platform.Fonts,\n SafeArea,\n TextInput: import_platform.TextInput,\n useFonts: import_platform.useFonts,\n useNativeState: import_platform.useNativeState,\n useSizeClass: import_platform.useSizeClass,\n getSizeClass: import_platform.getSizeClass,\n useHinge: import_platform.useHinge,\n getHinge: import_platform.getHinge,\n onHingeChange: import_platform.onHingeChange,\n ReservedRegions: import_platform.ReservedRegions\n});\nvar One = Object.freeze({\n get platform() {\n return currentPlatform();\n },\n AppInfo: import_platform.AppInfo,\n Database: import_platform.Database,\n iOS,\n Android,\n UI,\n Notifications: import_platform.Notifications,\n Clipboard: import_platform.Clipboard,\n Haptics: import_platform.Haptics,\n Network: import_platform.Network,\n Browser: import_platform.Browser,\n ImagePicker: import_platform.ImagePicker,\n SecureStore: import_platform.SecureStore,\n useNetworkState: import_platform.useNetworkState\n});\n//# sourceMappingURL=one.js.map\n"],"mappings":";;;AACA,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,cAAc,CAAC;AACnB,SAAS,aAAa,EACpB,WAAW,IACb,CAAC;AACD,OAAO,UAAU,aAAa,WAAW;AACzC,IAAI,kBAAkB,QAAQ,4BAAY;AAC1C,IAAI,2BAA2B,QAAQ,qCAAqB;AAC5D,SAAS,kBAAkB;CACzB,IAAI;CACJ,IAAI,WAAW,eAAe,QAAQ,IAAI,YAAY,kBAAkB,OAAO,QAAQ,iBAAiB,KAAK,IAAI,eAAe,OAAO,YAAY,cAAc,QAAQ,IAAI,eAAe,KAAK;CACjM,OAAO,YAAY,SAAS,YAAY,aAAa,YAAY,QAAQ,UAAU;AACrF;AACA,IAAI,MAAM,OAAO,OAAO;CACtB,GAAG,gBAAgB;CACnB,SAAS,gBAAgB;CACzB,gBAAgB,gBAAgB;CAChC,UAAU,gBAAgB;CAC1B,OAAO,gBAAgB,MAAM;CAC7B,YAAY,gBAAgB;CAC5B,WAAW,gBAAgB;CAC3B,aAAa,gBAAgB;CAC7B,eAAe,gBAAgB;CAC/B,qCAAqC,gBAAgB;CACrD,uBAAuB,gBAAgB;CACvC,sBAAsB,gBAAgB;AACxC,CAAC;AACD,IAAI,UAAU,OAAO,OAAO;CAC1B,GAAG,gBAAgB;CACnB,OAAO,gBAAgB,MAAM;CAC7B,MAAM,gBAAgB;CACtB,aAAa,gBAAgB;AAC/B,CAAC;AACD,IAAI,WAAW,OAAO,OAAO;CAC3B,UAAU,yBAAyB;CACnC,MAAM,yBAAyB;CAC/B,gBAAgB,yBAAyB;CACzC,UAAU,yBAAyB;CACnC,WAAW,yBAAyB;AACtC,CAAC;AACD,IAAI,KAAK,OAAO,OAAO;CACrB,GAAG,gBAAgB;CACnB,OAAO,gBAAgB;CACvB;CACA,WAAW,gBAAgB;CAC3B,UAAU,gBAAgB;CAC1B,gBAAgB,gBAAgB;CAChC,cAAc,gBAAgB;CAC9B,cAAc,gBAAgB;CAC9B,UAAU,gBAAgB;CAC1B,UAAU,gBAAgB;CAC1B,eAAe,gBAAgB;CAC/B,iBAAiB,gBAAgB;AACnC,CAAC;AACD,IAAI,MAAM,OAAO,OAAO;CACtB,IAAI,WAAW;EACb,OAAO,gBAAgB;CACzB;CACA,SAAS,gBAAgB;CACzB,UAAU,gBAAgB;CAC1B;CACA;CACA;CACA,eAAe,gBAAgB;CAC/B,WAAW,gBAAgB;CAC3B,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,aAAa,gBAAgB;CAC7B,aAAa,gBAAgB;CAC7B,iBAAiB,gBAAgB;AACnC,CAAC"}
1
+ {"version":3,"file":"one.native.js","names":[],"sources":["cjs/one.native.js"],"sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar one_exports = {};\n__export(one_exports, {\n One: () => One\n});\nmodule.exports = __toCommonJS(one_exports);\nvar import_platform = require(\"./platform\");\nvar import_safe_area_context = require(\"./safe-area-context\");\nfunction currentPlatform() {\n var _Reflect_get;\n var defined = (_Reflect_get = Reflect.get(globalThis, \"__ONE_PLATFORM__\")) !== null && _Reflect_get !== void 0 ? _Reflect_get : typeof process !== \"undefined\" ? process.env.ONE_PLATFORM : void 0;\n return defined === \"ios\" || defined === \"android\" || defined === \"rnx\" ? defined : \"web\";\n}\nvar iOS = Object.freeze({\n ...import_platform.Swift,\n Widgets: import_platform.Widgets,\n LiveActivities: import_platform.LiveActivities,\n WidgetUI: import_platform.WidgetUI,\n Color: import_platform.Color.ios,\n MenuAction: import_platform.MenuAction,\n SplitView: import_platform.SplitView,\n ToolbarHost: import_platform.ToolbarHost,\n BarButtonItem: import_platform.ToolbarItem,\n ZoomTransitionAlignmentRectDetector: import_platform.ZoomTransitionAlignmentRectDetector,\n ZoomTransitionEnabler: import_platform.ZoomTransitionEnabler,\n ZoomTransitionSource: import_platform.ZoomTransitionSource\n});\nvar Android = Object.freeze({\n ...import_platform.Compose,\n Color: import_platform.Color.android,\n Menu: import_platform.Menu,\n ContextMenu: import_platform.ContextMenu\n});\nvar SafeArea = Object.freeze({\n Provider: import_safe_area_context.SafeAreaProvider,\n View: import_safe_area_context.SafeAreaView,\n initialMetrics: import_safe_area_context.initialWindowMetrics,\n useFrame: import_safe_area_context.useSafeAreaFrame,\n useInsets: import_safe_area_context.useSafeAreaInsets\n});\nvar UI = Object.freeze({\n ...import_platform.UI,\n Fonts: import_platform.Fonts,\n SafeArea,\n TextInput: import_platform.TextInput,\n useFonts: import_platform.useFonts,\n useNativeState: import_platform.useNativeState,\n useSizeClass: import_platform.useSizeClass,\n getSizeClass: import_platform.getSizeClass,\n useHinge: import_platform.useHinge,\n getHinge: import_platform.getHinge,\n onHingeChange: import_platform.onHingeChange,\n ReservedRegions: import_platform.ReservedRegions\n});\nvar One = Object.freeze({\n get platform() {\n return currentPlatform();\n },\n AppInfo: import_platform.AppInfo,\n Database: import_platform.Database,\n iOS,\n Android,\n UI,\n Notifications: import_platform.Notifications,\n Clipboard: import_platform.Clipboard,\n Haptics: import_platform.Haptics,\n Network: import_platform.Network,\n Browser: import_platform.Browser,\n ImagePicker: import_platform.ImagePicker,\n DocumentPicker: import_platform.DocumentPicker,\n SecureStore: import_platform.SecureStore,\n useNetworkState: import_platform.useNetworkState\n});\n//# sourceMappingURL=one.js.map\n"],"mappings":";;;AACA,IAAI,YAAY,OAAO;AACvB,IAAI,mBAAmB,OAAO;AAC9B,IAAI,oBAAoB,OAAO;AAC/B,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,YAAY,QAAQ,QAAQ;CAC9B,KAAK,IAAI,QAAQ,KACf,UAAU,QAAQ,MAAM;EAAE,KAAK,IAAI;EAAO,YAAY;CAAK,CAAC;AAChE;AACA,IAAI,eAAe,IAAI,MAAM,QAAQ,SAAS;CAC5C,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY;EAClE,KAAK,IAAI,OAAO,kBAAkB,IAAI,GACpC,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,QAAQ,QACzC,UAAU,IAAI,KAAK;GAAE,WAAW,KAAK;GAAM,YAAY,EAAE,OAAO,iBAAiB,MAAM,GAAG,MAAM,KAAK;EAAW,CAAC;CACvH;CACA,OAAO;AACT;AACA,IAAI,gBAAgB,QAAQ,YAAY,UAAU,CAAC,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC,GAAG,GAAG;AACzF,IAAI,cAAc,CAAC;AACnB,SAAS,aAAa,EACpB,WAAW,IACb,CAAC;AACD,OAAO,UAAU,aAAa,WAAW;AACzC,IAAI,kBAAkB,QAAQ,4BAAY;AAC1C,IAAI,2BAA2B,QAAQ,qCAAqB;AAC5D,SAAS,kBAAkB;CACzB,IAAI;CACJ,IAAI,WAAW,eAAe,QAAQ,IAAI,YAAY,kBAAkB,OAAO,QAAQ,iBAAiB,KAAK,IAAI,eAAe,OAAO,YAAY,cAAc,QAAQ,IAAI,eAAe,KAAK;CACjM,OAAO,YAAY,SAAS,YAAY,aAAa,YAAY,QAAQ,UAAU;AACrF;AACA,IAAI,MAAM,OAAO,OAAO;CACtB,GAAG,gBAAgB;CACnB,SAAS,gBAAgB;CACzB,gBAAgB,gBAAgB;CAChC,UAAU,gBAAgB;CAC1B,OAAO,gBAAgB,MAAM;CAC7B,YAAY,gBAAgB;CAC5B,WAAW,gBAAgB;CAC3B,aAAa,gBAAgB;CAC7B,eAAe,gBAAgB;CAC/B,qCAAqC,gBAAgB;CACrD,uBAAuB,gBAAgB;CACvC,sBAAsB,gBAAgB;AACxC,CAAC;AACD,IAAI,UAAU,OAAO,OAAO;CAC1B,GAAG,gBAAgB;CACnB,OAAO,gBAAgB,MAAM;CAC7B,MAAM,gBAAgB;CACtB,aAAa,gBAAgB;AAC/B,CAAC;AACD,IAAI,WAAW,OAAO,OAAO;CAC3B,UAAU,yBAAyB;CACnC,MAAM,yBAAyB;CAC/B,gBAAgB,yBAAyB;CACzC,UAAU,yBAAyB;CACnC,WAAW,yBAAyB;AACtC,CAAC;AACD,IAAI,KAAK,OAAO,OAAO;CACrB,GAAG,gBAAgB;CACnB,OAAO,gBAAgB;CACvB;CACA,WAAW,gBAAgB;CAC3B,UAAU,gBAAgB;CAC1B,gBAAgB,gBAAgB;CAChC,cAAc,gBAAgB;CAC9B,cAAc,gBAAgB;CAC9B,UAAU,gBAAgB;CAC1B,UAAU,gBAAgB;CAC1B,eAAe,gBAAgB;CAC/B,iBAAiB,gBAAgB;AACnC,CAAC;AACD,IAAI,MAAM,OAAO,OAAO;CACtB,IAAI,WAAW;EACb,OAAO,gBAAgB;CACzB;CACA,SAAS,gBAAgB;CACzB,UAAU,gBAAgB;CAC1B;CACA;CACA;CACA,eAAe,gBAAgB;CAC/B,WAAW,gBAAgB;CAC3B,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,SAAS,gBAAgB;CACzB,aAAa,gBAAgB;CAC7B,gBAAgB,gBAAgB;CAChC,aAAa,gBAAgB;CAC7B,iBAAiB,gBAAgB;AACnC,CAAC"}