one 2.6.17 → 2.6.19

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 (294) hide show
  1. package/One.podspec +2 -0
  2. package/android/src/main/java/com/margelo/nitro/one/HybridOneDevice.kt +124 -0
  3. package/android/src/main/java/com/margelo/nitro/one/HybridOneHaptics.kt +31 -0
  4. package/android/src/main/java/com/margelo/nitro/one/HybridOneImageManipulator.kt +25 -5
  5. package/android/src/main/java/com/margelo/nitro/one/HybridOneKeepAwake.kt +34 -9
  6. package/android/src/main/java/com/margelo/nitro/one/HybridOneSecureStore.kt +269 -78
  7. package/dist/cjs/index.cjs +3 -0
  8. package/dist/cjs/index.native.cjs +3 -0
  9. package/dist/cjs/index.native.js +3 -0
  10. package/dist/cjs/index.native.js.map +1 -1
  11. package/dist/cjs/one.cjs +1 -0
  12. package/dist/cjs/one.native.cjs +1 -0
  13. package/dist/cjs/one.native.js +1 -0
  14. package/dist/cjs/one.native.js.map +1 -1
  15. package/dist/cjs/platform/extras.cjs +4 -0
  16. package/dist/cjs/platform/extras.native.cjs +4 -0
  17. package/dist/cjs/platform/extras.native.js +4 -0
  18. package/dist/cjs/platform/extras.native.js.map +1 -1
  19. package/dist/cjs/platform/haptics/index.cjs +3 -0
  20. package/dist/cjs/platform/haptics/index.native.cjs +4 -0
  21. package/dist/cjs/platform/haptics/index.native.js +4 -0
  22. package/dist/cjs/platform/haptics/index.native.js.map +1 -1
  23. package/dist/cjs/platform/haptics/validation.cjs +28 -0
  24. package/dist/cjs/platform/haptics/validation.native.cjs +28 -0
  25. package/dist/cjs/platform/haptics/validation.native.js +28 -0
  26. package/dist/cjs/platform/haptics/validation.native.js.map +1 -1
  27. package/dist/cjs/platform/image-manipulator/index.cjs +10 -3
  28. package/dist/cjs/platform/image-manipulator/index.native.cjs +1 -0
  29. package/dist/cjs/platform/image-manipulator/index.native.js +1 -0
  30. package/dist/cjs/platform/image-manipulator/index.native.js.map +1 -1
  31. package/dist/cjs/platform/index.cjs +1 -0
  32. package/dist/cjs/platform/index.native.cjs +1 -0
  33. package/dist/cjs/platform/index.native.js +1 -0
  34. package/dist/cjs/platform/index.native.js.map +1 -1
  35. package/dist/cjs/platform/keep-awake/index.cjs +53 -14
  36. package/dist/cjs/platform/keep-awake/index.native.cjs +29 -2
  37. package/dist/cjs/platform/keep-awake/index.native.js +29 -2
  38. package/dist/cjs/platform/keep-awake/index.native.js.map +1 -1
  39. package/dist/cjs/platform/keep-awake/unavailable.cjs +11 -1
  40. package/dist/cjs/platform/keep-awake/unavailable.native.cjs +11 -1
  41. package/dist/cjs/platform/keep-awake/unavailable.native.js +11 -1
  42. package/dist/cjs/platform/keep-awake/unavailable.native.js.map +1 -1
  43. package/dist/cjs/platform/keep-awake/validate.cjs +15 -1
  44. package/dist/cjs/platform/keep-awake/validate.native.cjs +15 -1
  45. package/dist/cjs/platform/keep-awake/validate.native.js +15 -1
  46. package/dist/cjs/platform/keep-awake/validate.native.js.map +1 -1
  47. package/dist/cjs/platform/localization/index.cjs +100 -0
  48. package/dist/cjs/platform/localization/index.native.cjs +71 -0
  49. package/dist/cjs/platform/localization/index.native.js +73 -0
  50. package/dist/cjs/platform/localization/index.native.js.map +1 -0
  51. package/dist/cjs/platform/localization/map.cjs +86 -0
  52. package/dist/cjs/platform/localization/map.native.cjs +90 -0
  53. package/dist/cjs/platform/localization/map.native.js +92 -0
  54. package/dist/cjs/platform/localization/map.native.js.map +1 -0
  55. package/dist/cjs/platform/localization/types.cjs +16 -0
  56. package/dist/cjs/platform/localization/types.native.cjs +18 -0
  57. package/dist/cjs/platform/localization/types.native.js +20 -0
  58. package/dist/cjs/platform/localization/types.native.js.map +1 -0
  59. package/dist/cjs/platform/secure-store/index.cjs +12 -6
  60. package/dist/cjs/platform/secure-store/index.native.cjs +18 -12
  61. package/dist/cjs/platform/secure-store/index.native.js +18 -12
  62. package/dist/cjs/platform/secure-store/index.native.js.map +1 -1
  63. package/dist/cjs/platform/secure-store/types.cjs +16 -0
  64. package/dist/cjs/platform/secure-store/types.native.cjs +18 -0
  65. package/dist/cjs/platform/secure-store/types.native.js +20 -0
  66. package/dist/cjs/platform/secure-store/types.native.js.map +1 -0
  67. package/dist/cjs/platform/secure-store/validate.cjs +34 -0
  68. package/dist/cjs/platform/secure-store/validate.native.cjs +34 -0
  69. package/dist/cjs/platform/secure-store/validate.native.js +34 -0
  70. package/dist/cjs/platform/secure-store/validate.native.js.map +1 -1
  71. package/dist/esm/index.js +2 -2
  72. package/dist/esm/index.mjs +2 -2
  73. package/dist/esm/index.native.js +2 -2
  74. package/dist/esm/one.mjs +2 -1
  75. package/dist/esm/one.mjs.map +1 -1
  76. package/dist/esm/one.native.js +2 -1
  77. package/dist/esm/one.native.js.map +1 -1
  78. package/dist/esm/platform/extras.mjs +2 -1
  79. package/dist/esm/platform/extras.native.js +2 -1
  80. package/dist/esm/platform/haptics/index.mjs +4 -1
  81. package/dist/esm/platform/haptics/index.mjs.map +1 -1
  82. package/dist/esm/platform/haptics/index.native.js +5 -1
  83. package/dist/esm/platform/haptics/index.native.js.map +1 -1
  84. package/dist/esm/platform/haptics/validation.mjs +27 -1
  85. package/dist/esm/platform/haptics/validation.mjs.map +1 -1
  86. package/dist/esm/platform/haptics/validation.native.js +27 -1
  87. package/dist/esm/platform/haptics/validation.native.js.map +1 -1
  88. package/dist/esm/platform/image-manipulator/index.mjs +10 -3
  89. package/dist/esm/platform/image-manipulator/index.mjs.map +1 -1
  90. package/dist/esm/platform/image-manipulator/index.native.js +1 -0
  91. package/dist/esm/platform/image-manipulator/index.native.js.map +1 -1
  92. package/dist/esm/platform/index.mjs +2 -2
  93. package/dist/esm/platform/index.mjs.map +1 -1
  94. package/dist/esm/platform/index.native.js +2 -2
  95. package/dist/esm/platform/index.native.js.map +1 -1
  96. package/dist/esm/platform/keep-awake/index.mjs +51 -15
  97. package/dist/esm/platform/keep-awake/index.mjs.map +1 -1
  98. package/dist/esm/platform/keep-awake/index.native.js +27 -3
  99. package/dist/esm/platform/keep-awake/index.native.js.map +1 -1
  100. package/dist/esm/platform/keep-awake/unavailable.mjs +12 -2
  101. package/dist/esm/platform/keep-awake/unavailable.mjs.map +1 -1
  102. package/dist/esm/platform/keep-awake/unavailable.native.js +12 -2
  103. package/dist/esm/platform/keep-awake/unavailable.native.js.map +1 -1
  104. package/dist/esm/platform/keep-awake/validate.mjs +10 -1
  105. package/dist/esm/platform/keep-awake/validate.mjs.map +1 -1
  106. package/dist/esm/platform/keep-awake/validate.native.js +10 -1
  107. package/dist/esm/platform/keep-awake/validate.native.js.map +1 -1
  108. package/dist/esm/platform/localization/index.mjs +77 -0
  109. package/dist/esm/platform/localization/index.mjs.map +1 -0
  110. package/dist/esm/platform/localization/index.native.js +46 -0
  111. package/dist/esm/platform/localization/index.native.js.map +1 -0
  112. package/dist/esm/platform/localization/map.mjs +59 -0
  113. package/dist/esm/platform/localization/map.mjs.map +1 -0
  114. package/dist/esm/platform/localization/map.native.js +61 -0
  115. package/dist/esm/platform/localization/map.native.js.map +1 -0
  116. package/dist/esm/platform/localization/types.mjs +0 -0
  117. package/dist/esm/platform/localization/types.native.js +0 -0
  118. package/dist/esm/platform/secure-store/index.mjs +13 -7
  119. package/dist/esm/platform/secure-store/index.mjs.map +1 -1
  120. package/dist/esm/platform/secure-store/index.native.js +19 -13
  121. package/dist/esm/platform/secure-store/index.native.js.map +1 -1
  122. package/dist/esm/platform/secure-store/types.mjs +0 -0
  123. package/dist/esm/platform/secure-store/types.native.js +0 -0
  124. package/dist/esm/platform/secure-store/validate.mjs +33 -1
  125. package/dist/esm/platform/secure-store/validate.mjs.map +1 -1
  126. package/dist/esm/platform/secure-store/validate.native.js +33 -1
  127. package/dist/esm/platform/secure-store/validate.native.js.map +1 -1
  128. package/ios/Nitro/HybridOneDevice.swift +117 -0
  129. package/ios/Nitro/HybridOneHaptics.swift +4 -0
  130. package/ios/Nitro/HybridOneImageManipulator.swift +25 -8
  131. package/ios/Nitro/HybridOneKeepAwake.swift +34 -2
  132. package/ios/Nitro/HybridOneSecureStore.swift +112 -46
  133. package/ios/Tests/ImageManipulator/Package.swift +12 -0
  134. package/ios/Tests/ImageManipulator/README.md +21 -0
  135. package/ios/Tests/ImageManipulator/Sources/NitroModules/Promise.swift +33 -0
  136. package/ios/Tests/ImageManipulator/Sources/OneImageManipulatorCore/Types.swift +41 -0
  137. package/ios/Tests/ImageManipulator/Sources/SDWebImageWebPCoder/SDImageWebPCoder.swift +23 -0
  138. package/nitrogen/generated/android/c++/JAndroidHaptic.hpp +109 -0
  139. package/nitrogen/generated/android/c++/JCalendarInfo.hpp +70 -0
  140. package/nitrogen/generated/android/c++/JHapticImpact.hpp +3 -3
  141. package/nitrogen/generated/android/c++/JHybridOneDeviceSpec.cpp +52 -0
  142. package/nitrogen/generated/android/c++/JHybridOneDeviceSpec.hpp +3 -0
  143. package/nitrogen/generated/android/c++/JHybridOneHapticsSpec.cpp +8 -0
  144. package/nitrogen/generated/android/c++/JHybridOneHapticsSpec.hpp +1 -0
  145. package/nitrogen/generated/android/c++/JHybridOneImageManipulatorSpec.cpp +5 -1
  146. package/nitrogen/generated/android/c++/JHybridOneKeepAwakeSpec.cpp +31 -0
  147. package/nitrogen/generated/android/c++/JHybridOneKeepAwakeSpec.hpp +2 -0
  148. package/nitrogen/generated/android/c++/JHybridOneSecureStoreSpec.cpp +26 -19
  149. package/nitrogen/generated/android/c++/JHybridOneSecureStoreSpec.hpp +6 -6
  150. package/nitrogen/generated/android/c++/JImageTransformOptions.hpp +7 -1
  151. package/nitrogen/generated/android/c++/JLocaleInfo.hpp +110 -0
  152. package/nitrogen/generated/android/c++/JOneImageFlip.hpp +58 -0
  153. package/nitrogen/generated/android/c++/JOneImageFormat.hpp +3 -0
  154. package/nitrogen/generated/android/c++/JSecureStoreAccessibility.hpp +73 -0
  155. package/nitrogen/generated/android/c++/JSecureStoreOptions.hpp +76 -0
  156. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/AndroidHaptic.kt +40 -0
  157. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/CalendarInfo.kt +66 -0
  158. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HapticImpact.kt +2 -2
  159. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneDeviceSpec.kt +17 -0
  160. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneHapticsSpec.kt +4 -0
  161. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneKeepAwakeSpec.kt +8 -0
  162. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/HybridOneSecureStoreSpec.kt +6 -6
  163. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/ImageTransformOptions.kt +7 -2
  164. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/LocaleInfo.kt +116 -0
  165. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/OneImageFlip.kt +23 -0
  166. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/OneImageFormat.kt +2 -1
  167. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SecureStoreAccessibility.kt +28 -0
  168. package/nitrogen/generated/android/kotlin/com/margelo/nitro/one/SecureStoreOptions.kt +71 -0
  169. package/nitrogen/generated/ios/One-Swift-Cxx-Bridge.hpp +133 -51
  170. package/nitrogen/generated/ios/One-Swift-Cxx-Umbrella.hpp +19 -1
  171. package/nitrogen/generated/ios/c++/HybridOneDeviceSpecSwift.hpp +31 -0
  172. package/nitrogen/generated/ios/c++/HybridOneHapticsSpecSwift.hpp +9 -0
  173. package/nitrogen/generated/ios/c++/HybridOneImageManipulatorSpecSwift.hpp +4 -1
  174. package/nitrogen/generated/ios/c++/HybridOneKeepAwakeSpecSwift.hpp +18 -1
  175. package/nitrogen/generated/ios/c++/HybridOneSecureStoreSpecSwift.hpp +18 -13
  176. package/nitrogen/generated/ios/swift/AndroidHaptic.swift +108 -0
  177. package/nitrogen/generated/ios/swift/CalendarInfo.swift +96 -0
  178. package/nitrogen/generated/ios/swift/HapticImpact.swift +4 -4
  179. package/nitrogen/generated/ios/swift/HybridOneDeviceSpec.swift +3 -0
  180. package/nitrogen/generated/ios/swift/HybridOneDeviceSpec_cxx.swift +56 -0
  181. package/nitrogen/generated/ios/swift/HybridOneHapticsSpec.swift +1 -0
  182. package/nitrogen/generated/ios/swift/HybridOneHapticsSpec_cxx.swift +11 -0
  183. package/nitrogen/generated/ios/swift/HybridOneKeepAwakeSpec.swift +3 -1
  184. package/nitrogen/generated/ios/swift/HybridOneKeepAwakeSpec_cxx.swift +41 -3
  185. package/nitrogen/generated/ios/swift/HybridOneSecureStoreSpec.swift +6 -6
  186. package/nitrogen/generated/ios/swift/HybridOneSecureStoreSpec_cxx.swift +12 -12
  187. package/nitrogen/generated/ios/swift/ImageTransformOptions.swift +16 -5
  188. package/nitrogen/generated/ios/swift/LocaleInfo.swift +250 -0
  189. package/nitrogen/generated/ios/swift/OneImageFlip.swift +40 -0
  190. package/nitrogen/generated/ios/swift/OneImageFormat.swift +4 -0
  191. package/nitrogen/generated/ios/swift/SecureStoreAccessibility.swift +60 -0
  192. package/nitrogen/generated/ios/swift/SecureStoreOptions.swift +107 -0
  193. package/nitrogen/generated/shared/c++/AndroidHaptic.hpp +144 -0
  194. package/nitrogen/generated/shared/c++/CalendarInfo.hpp +96 -0
  195. package/nitrogen/generated/shared/c++/HapticImpact.hpp +5 -5
  196. package/nitrogen/generated/shared/c++/HybridOneDeviceSpec.cpp +3 -0
  197. package/nitrogen/generated/shared/c++/HybridOneDeviceSpec.hpp +11 -0
  198. package/nitrogen/generated/shared/c++/HybridOneHapticsSpec.cpp +1 -0
  199. package/nitrogen/generated/shared/c++/HybridOneHapticsSpec.hpp +4 -0
  200. package/nitrogen/generated/shared/c++/HybridOneKeepAwakeSpec.cpp +2 -0
  201. package/nitrogen/generated/shared/c++/HybridOneKeepAwakeSpec.hpp +4 -1
  202. package/nitrogen/generated/shared/c++/HybridOneSecureStoreSpec.hpp +9 -7
  203. package/nitrogen/generated/shared/c++/ImageTransformOptions.hpp +8 -1
  204. package/nitrogen/generated/shared/c++/LocaleInfo.hpp +136 -0
  205. package/nitrogen/generated/shared/c++/OneImageFlip.hpp +76 -0
  206. package/nitrogen/generated/shared/c++/OneImageFormat.hpp +4 -0
  207. package/nitrogen/generated/shared/c++/SecureStoreAccessibility.hpp +96 -0
  208. package/nitrogen/generated/shared/c++/SecureStoreOptions.hpp +102 -0
  209. package/package.json +15 -15
  210. package/src/index.ts +3 -0
  211. package/src/one.test.ts +2 -0
  212. package/src/one.ts +3 -0
  213. package/src/platform/extras.ts +3 -0
  214. package/src/platform/haptics/index.native.ts +13 -3
  215. package/src/platform/haptics/index.ts +12 -3
  216. package/src/platform/haptics/types.ts +25 -0
  217. package/src/platform/haptics/validation.ts +31 -1
  218. package/src/platform/image-manipulator/index.native.ts +3 -0
  219. package/src/platform/image-manipulator/index.ts +10 -3
  220. package/src/platform/index.native.ts +3 -2
  221. package/src/platform/index.ts +3 -2
  222. package/src/platform/keep-awake/index.native.ts +31 -2
  223. package/src/platform/keep-awake/index.ts +66 -17
  224. package/src/platform/keep-awake/unavailable.ts +12 -2
  225. package/src/platform/keep-awake/validate.ts +16 -0
  226. package/src/platform/localization/index.native.ts +47 -0
  227. package/src/platform/localization/index.ts +90 -0
  228. package/src/platform/localization/map.ts +77 -0
  229. package/src/platform/localization/types.ts +36 -0
  230. package/src/platform/secure-store/index.native.ts +26 -13
  231. package/src/platform/secure-store/index.ts +20 -7
  232. package/src/platform/secure-store/types.ts +33 -0
  233. package/src/platform/secure-store/validate.ts +48 -0
  234. package/src/platform/specs/OneDevice.nitro.ts +34 -0
  235. package/src/platform/specs/OneHaptics.nitro.ts +4 -1
  236. package/src/platform/specs/OneImageManipulator.nitro.ts +4 -1
  237. package/src/platform/specs/OneKeepAwake.nitro.ts +2 -0
  238. package/src/platform/specs/OneSecureStore.nitro.ts +12 -8
  239. package/types/index.d.ts +1 -1
  240. package/types/index.d.ts.map +1 -1
  241. package/types/one.d.ts +2 -1
  242. package/types/one.d.ts.map +1 -1
  243. package/types/platform/extras.d.ts +3 -0
  244. package/types/platform/extras.d.ts.map +1 -1
  245. package/types/platform/haptics/index.d.ts +2 -2
  246. package/types/platform/haptics/index.d.ts.map +1 -1
  247. package/types/platform/haptics/index.native.d.ts +2 -2
  248. package/types/platform/haptics/index.native.d.ts.map +1 -1
  249. package/types/platform/haptics/types.d.ts +3 -0
  250. package/types/platform/haptics/types.d.ts.map +1 -1
  251. package/types/platform/haptics/validation.d.ts +3 -1
  252. package/types/platform/haptics/validation.d.ts.map +1 -1
  253. package/types/platform/image-manipulator/index.d.ts +1 -1
  254. package/types/platform/image-manipulator/index.d.ts.map +1 -1
  255. package/types/platform/image-manipulator/index.native.d.ts +1 -1
  256. package/types/platform/image-manipulator/index.native.d.ts.map +1 -1
  257. package/types/platform/index.d.ts +3 -3
  258. package/types/platform/index.d.ts.map +1 -1
  259. package/types/platform/index.native.d.ts +3 -3
  260. package/types/platform/index.native.d.ts.map +1 -1
  261. package/types/platform/keep-awake/index.d.ts +3 -0
  262. package/types/platform/keep-awake/index.d.ts.map +1 -1
  263. package/types/platform/keep-awake/index.native.d.ts +5 -0
  264. package/types/platform/keep-awake/index.native.d.ts.map +1 -1
  265. package/types/platform/keep-awake/unavailable.d.ts +4 -0
  266. package/types/platform/keep-awake/unavailable.d.ts.map +1 -1
  267. package/types/platform/keep-awake/validate.d.ts +3 -0
  268. package/types/platform/keep-awake/validate.d.ts.map +1 -1
  269. package/types/platform/localization/index.d.ts +7 -0
  270. package/types/platform/localization/index.d.ts.map +1 -0
  271. package/types/platform/localization/index.native.d.ts +7 -0
  272. package/types/platform/localization/index.native.d.ts.map +1 -0
  273. package/types/platform/localization/map.d.ts +9 -0
  274. package/types/platform/localization/map.d.ts.map +1 -0
  275. package/types/platform/localization/types.d.ts +31 -0
  276. package/types/platform/localization/types.d.ts.map +1 -0
  277. package/types/platform/secure-store/index.d.ts +8 -7
  278. package/types/platform/secure-store/index.d.ts.map +1 -1
  279. package/types/platform/secure-store/index.native.d.ts +8 -7
  280. package/types/platform/secure-store/index.native.d.ts.map +1 -1
  281. package/types/platform/secure-store/types.d.ts +24 -0
  282. package/types/platform/secure-store/types.d.ts.map +1 -0
  283. package/types/platform/secure-store/validate.d.ts +3 -0
  284. package/types/platform/secure-store/validate.d.ts.map +1 -1
  285. package/types/platform/specs/OneDevice.nitro.d.ts +25 -0
  286. package/types/platform/specs/OneDevice.nitro.d.ts.map +1 -1
  287. package/types/platform/specs/OneHaptics.nitro.d.ts +2 -1
  288. package/types/platform/specs/OneHaptics.nitro.d.ts.map +1 -1
  289. package/types/platform/specs/OneImageManipulator.nitro.d.ts +3 -1
  290. package/types/platform/specs/OneImageManipulator.nitro.d.ts.map +1 -1
  291. package/types/platform/specs/OneKeepAwake.nitro.d.ts +2 -0
  292. package/types/platform/specs/OneKeepAwake.nitro.d.ts.map +1 -1
  293. package/types/platform/specs/OneSecureStore.nitro.d.ts +8 -6
  294. package/types/platform/specs/OneSecureStore.nitro.d.ts.map +1 -1
package/One.podspec CHANGED
@@ -47,6 +47,8 @@ Pod::Spec.new do |s|
47
47
  s.prefix_header_contents = "#ifdef __OBJC__\n#import <React/RCTView.h>\n#import <UserNotifications/UserNotifications.h>\n#import <Social/Social.h>\n#endif\n#ifdef __cplusplus\n#include \"One-Swift-Cxx-Bridge.hpp\"\n#endif"
48
48
 
49
49
  s.dependency 'RNWorklets'
50
+ # webp encoding has no system encoder on ios; expo-image-manipulator uses the same coder.
51
+ s.dependency 'SDWebImageWebPCoder'
50
52
 
51
53
  install_modules_dependencies(s)
52
54
  end
@@ -1,16 +1,23 @@
1
1
  package com.margelo.nitro.one
2
2
 
3
3
  import android.app.UiModeManager
4
+ import android.content.BroadcastReceiver
4
5
  import android.content.Context
6
+ import android.content.Intent
7
+ import android.content.IntentFilter
5
8
  import android.content.res.Configuration
6
9
  import android.os.Build
7
10
  import android.os.LocaleList
8
11
  import android.provider.Settings
12
+ import android.text.TextUtils
13
+ import android.text.format.DateFormat
14
+ import android.view.View
9
15
  import com.margelo.nitro.NitroModules
10
16
  import com.margelo.nitro.core.Promise
11
17
  import java.util.Calendar
12
18
  import java.util.Currency
13
19
  import java.util.Locale
20
+ import java.text.DecimalFormatSymbols
14
21
  import java.util.TimeZone
15
22
 
16
23
  // device snapshot matching the ios shape: model, system, idiom,
@@ -58,6 +65,117 @@ class HybridOneDevice : HybridOneDeviceSpec() {
58
65
  )
59
66
  }
60
67
 
68
+ private val listeners = mutableMapOf<Int, () -> Unit>()
69
+ private var nextListenerId = 0
70
+ private var receiver: BroadcastReceiver? = null
71
+
72
+ override fun getLocales(): Array<LocaleInfo> =
73
+ preferredLocales().map { localeInfo(it) }.toTypedArray()
74
+
75
+ override fun getCalendars(): Array<CalendarInfo> {
76
+ val locale = Locale.getDefault()
77
+ val calendar = Calendar.getInstance(locale)
78
+ return arrayOf(
79
+ CalendarInfo(
80
+ calendar = unicodeCalendar(locale),
81
+ timeZone = TimeZone.getDefault().id,
82
+ uses24hourClock = DateFormat.is24HourFormat(context()),
83
+ firstWeekday = calendar.firstDayOfWeek.toDouble()
84
+ )
85
+ )
86
+ }
87
+
88
+ // the first listener registers the receiver and the last removal
89
+ // unregisters it, so a locale change can never race the subscription.
90
+ @Synchronized
91
+ override fun addLocalizationListener(listener: () -> Unit): () -> Unit {
92
+ val id = nextListenerId++
93
+ listeners[id] = listener
94
+ if (receiver == null) {
95
+ val next = object : BroadcastReceiver() {
96
+ override fun onReceive(context: Context?, intent: Intent?) = emit()
97
+ }
98
+ val filter = IntentFilter().apply {
99
+ addAction(Intent.ACTION_LOCALE_CHANGED)
100
+ addAction(Intent.ACTION_TIMEZONE_CHANGED)
101
+ }
102
+ // both actions are protected system broadcasts, so no exported
103
+ // flag is needed and no other app can send them.
104
+ context().registerReceiver(next, filter)
105
+ receiver = next
106
+ }
107
+ return { removeListener(id) }
108
+ }
109
+
110
+ private fun emit() {
111
+ val current = synchronized(this) { listeners.values.toList() }
112
+ current.forEach { it() }
113
+ }
114
+
115
+ @Synchronized
116
+ private fun removeListener(id: Int) {
117
+ listeners.remove(id)
118
+ if (listeners.isEmpty()) {
119
+ receiver?.let { context().unregisterReceiver(it) }
120
+ receiver = null
121
+ }
122
+ }
123
+
124
+ private fun preferredLocales(): List<Locale> {
125
+ if (Build.VERSION.SDK_INT >= 24) {
126
+ val list = LocaleList.getDefault()
127
+ if (!list.isEmpty) return (0 until list.size()).map { list[it] }
128
+ }
129
+ return listOf(Locale.getDefault())
130
+ }
131
+
132
+ private fun localeInfo(locale: Locale): LocaleInfo {
133
+ val symbols = DecimalFormatSymbols(locale)
134
+ val currency = try {
135
+ Currency.getInstance(locale)
136
+ } catch (_: Exception) {
137
+ null
138
+ }
139
+ val region = locale.country.takeIf { it.isNotEmpty() }
140
+ return LocaleInfo(
141
+ languageTag = locale.toLanguageTag(),
142
+ languageCode = locale.language.takeIf { it.isNotEmpty() },
143
+ languageScriptCode = locale.script.takeIf { it.isNotEmpty() },
144
+ regionCode = region,
145
+ languageRegionCode = region,
146
+ currencyCode = currency?.currencyCode,
147
+ currencySymbol = currency?.getSymbol(locale),
148
+ languageCurrencyCode = currency?.currencyCode,
149
+ languageCurrencySymbol = currency?.getSymbol(locale),
150
+ decimalSeparator = symbols.decimalSeparator.toString(),
151
+ digitGroupingSeparator = symbols.groupingSeparator.toString(),
152
+ textDirection =
153
+ if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
154
+ "rtl"
155
+ } else {
156
+ "ltr"
157
+ },
158
+ measurementSystem = when (region) {
159
+ "US" -> "us"
160
+ "GB" -> "uk"
161
+ null -> null
162
+ else -> "metric"
163
+ },
164
+ temperatureUnit = when (region) {
165
+ null -> null
166
+ in FAHRENHEIT_REGIONS -> "fahrenheit"
167
+ else -> "celsius"
168
+ }
169
+ )
170
+ }
171
+
172
+ // java calendar type to the unicode calendar type expo reports.
173
+ private fun unicodeCalendar(locale: Locale): String =
174
+ when (val type = calendarType(locale)) {
175
+ "gregorian" -> "gregory"
176
+ else -> type
177
+ }
178
+
61
179
  private fun idiom(context: Context): String {
62
180
  val uiMode = context.getSystemService(Context.UI_MODE_SERVICE) as? UiModeManager
63
181
  if (uiMode?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) return "tv"
@@ -103,3 +221,9 @@ class HybridOneDevice : HybridOneDeviceSpec() {
103
221
  hardware in setOf("goldfish", "ranchu", "vbox86")
104
222
  }
105
223
  }
224
+
225
+ // regions that read temperature in fahrenheit. android has no temperature
226
+ // preference, so the region decides, as in expo-localization.
227
+ private val FAHRENHEIT_REGIONS = setOf(
228
+ "US", "BS", "BZ", "KY", "LR", "GU", "MH", "FM", "PW", "VI", "MP", "AS", "UM"
229
+ )
@@ -54,6 +54,37 @@ class HybridOneHaptics : HybridOneHapticsSpec() {
54
54
  )
55
55
  }
56
56
 
57
+ // expo-haptics performAndroidHapticsAsync: the HapticFeedbackConstants
58
+ // value itself. constants added after the device's api level are a no-op
59
+ // rather than a substitute feel the caller did not ask for. no-haptics
60
+ // (-1) is android's own "play nothing" constant.
61
+ override fun performAndroidHaptics(type: AndroidHaptic) {
62
+ val sdk = Build.VERSION.SDK_INT
63
+ val constant = when (type) {
64
+ AndroidHaptic.CLOCK_TICK -> HapticFeedbackConstants.CLOCK_TICK
65
+ AndroidHaptic.CONFIRM -> if (sdk >= 30) HapticFeedbackConstants.CONFIRM else return
66
+ AndroidHaptic.CONTEXT_CLICK -> HapticFeedbackConstants.CONTEXT_CLICK
67
+ AndroidHaptic.DRAG_START -> if (sdk >= 34) HapticFeedbackConstants.DRAG_START else return
68
+ AndroidHaptic.GESTURE_END -> if (sdk >= 30) HapticFeedbackConstants.GESTURE_END else return
69
+ AndroidHaptic.GESTURE_START -> if (sdk >= 30) HapticFeedbackConstants.GESTURE_START else return
70
+ AndroidHaptic.KEYBOARD_PRESS -> HapticFeedbackConstants.KEYBOARD_PRESS
71
+ AndroidHaptic.KEYBOARD_RELEASE -> HapticFeedbackConstants.KEYBOARD_RELEASE
72
+ AndroidHaptic.KEYBOARD_TAP -> HapticFeedbackConstants.KEYBOARD_TAP
73
+ AndroidHaptic.LONG_PRESS -> HapticFeedbackConstants.LONG_PRESS
74
+ AndroidHaptic.NO_HAPTICS -> -1
75
+ AndroidHaptic.REJECT -> if (sdk >= 30) HapticFeedbackConstants.REJECT else return
76
+ AndroidHaptic.SEGMENT_FREQUENT_TICK ->
77
+ if (sdk >= 34) HapticFeedbackConstants.SEGMENT_FREQUENT_TICK else return
78
+ AndroidHaptic.SEGMENT_TICK -> if (sdk >= 34) HapticFeedbackConstants.SEGMENT_TICK else return
79
+ AndroidHaptic.TEXT_HANDLE_MOVE -> HapticFeedbackConstants.TEXT_HANDLE_MOVE
80
+ AndroidHaptic.TOGGLE_OFF -> if (sdk >= 34) HapticFeedbackConstants.TOGGLE_OFF else return
81
+ AndroidHaptic.TOGGLE_ON -> if (sdk >= 34) HapticFeedbackConstants.TOGGLE_ON else return
82
+ AndroidHaptic.VIRTUAL_KEY -> HapticFeedbackConstants.VIRTUAL_KEY
83
+ AndroidHaptic.VIRTUAL_KEY_RELEASE -> HapticFeedbackConstants.VIRTUAL_KEY_RELEASE
84
+ }
85
+ perform(constant)
86
+ }
87
+
57
88
  override fun notification(type: HapticNotification) {
58
89
  perform(
59
90
  when (type) {
@@ -5,6 +5,7 @@ import android.graphics.BitmapFactory
5
5
  import android.graphics.Matrix
6
6
  import android.media.ExifInterface
7
7
  import android.net.Uri
8
+ import android.os.Build
8
9
  import com.margelo.nitro.NitroModules
9
10
  import com.margelo.nitro.core.Promise
10
11
  import java.io.File
@@ -40,10 +41,10 @@ class HybridOneImageManipulator : HybridOneImageManipulatorSpec() {
40
41
  if (!source.isFile) throw problem("FILE", "file does not exist")
41
42
  val quality = options.quality ?: 0.9
42
43
  if (options.format == OneImageFormat.PNG && options.quality != null) {
43
- throw problem("INPUT", "quality applies only to JPEG")
44
+ throw problem("INPUT", "quality applies only to JPEG or WebP")
44
45
  }
45
46
  if (!quality.isFinite() || quality < 0 || quality > 1) {
46
- throw problem("INPUT", "JPEG quality must be between 0 and 1")
47
+ throw problem("INPUT", "quality must be between 0 and 1")
47
48
  }
48
49
  var image = BitmapFactory.decodeFile(source.path) ?: throw problem("DECODE", "source is not a supported image")
49
50
  fun replace(next: Bitmap) {
@@ -90,14 +91,33 @@ class HybridOneImageManipulator : HybridOneImageManipulatorSpec() {
90
91
  replace(Bitmap.createBitmap(image, 0, 0, image.width, image.height, rotation, true))
91
92
  }
92
93
  }
94
+ options.flip?.let { flip ->
95
+ val mirror = Matrix()
96
+ when (flip) {
97
+ OneImageFlip.HORIZONTAL -> mirror.preScale(-1f, 1f)
98
+ OneImageFlip.VERTICAL -> mirror.preScale(1f, -1f)
99
+ }
100
+ replace(Bitmap.createBitmap(image, 0, 0, image.width, image.height, mirror, true))
101
+ }
93
102
  checkOutputSize(image.width, image.height)
94
103
  val folder = File(context.cacheDir, "OneImageManipulator")
95
104
  if (!folder.isDirectory && !folder.mkdirs()) throw problem("ENCODE", "cannot create output directory")
96
- val png = options.format == OneImageFormat.PNG
97
- val output = File(folder, "${UUID.randomUUID()}.${if (png) "png" else "jpg"}")
105
+ val compressFormat = when (options.format) {
106
+ OneImageFormat.PNG -> Bitmap.CompressFormat.PNG
107
+ OneImageFormat.JPEG -> Bitmap.CompressFormat.JPEG
108
+ OneImageFormat.WEBP ->
109
+ if (Build.VERSION.SDK_INT >= 30) Bitmap.CompressFormat.WEBP_LOSSY
110
+ else @Suppress("DEPRECATION") Bitmap.CompressFormat.WEBP
111
+ }
112
+ val ext = when (options.format) {
113
+ OneImageFormat.PNG -> "png"
114
+ OneImageFormat.JPEG -> "jpg"
115
+ OneImageFormat.WEBP -> "webp"
116
+ }
117
+ val output = File(folder, "${UUID.randomUUID()}.$ext")
98
118
  try {
99
119
  output.outputStream().use { stream ->
100
- if (!image.compress(if (png) Bitmap.CompressFormat.PNG else Bitmap.CompressFormat.JPEG,
120
+ if (!image.compress(compressFormat,
101
121
  (quality * 100).roundToInt(), stream)) throw problem("ENCODE", "encoding failed")
102
122
  }
103
123
  } catch (error: Exception) { output.delete(); throw error }
@@ -7,12 +7,13 @@ import com.facebook.react.bridge.LifecycleEventListener
7
7
  import com.margelo.nitro.NitroModules
8
8
  import com.margelo.nitro.core.Promise
9
9
 
10
- // screen-on lock matching the ios global: the desired state is held in
11
- // memory, readable and writable with no activity present, applied to the
12
- // current window when one exists, and re-applied on resume so activity
13
- // recreation never silently drops it. no rejection path.
10
+ // screen-on locks keyed by expo activation tags: the screen stays awake
11
+ // while any tag is active. the desired state is held in memory, readable
12
+ // and writable with no activity present, applied to the current window when
13
+ // one exists, and re-applied on resume so activity recreation never
14
+ // silently drops it. no rejection path.
14
15
  class HybridOneKeepAwake : HybridOneKeepAwakeSpec(), LifecycleEventListener {
15
- @Volatile private var desired = false
16
+ private val tags = mutableSetOf<String>()
16
17
  private val mainHandler = Handler(Looper.getMainLooper())
17
18
 
18
19
  init {
@@ -26,22 +27,42 @@ class HybridOneKeepAwake : HybridOneKeepAwakeSpec(), LifecycleEventListener {
26
27
 
27
28
  override fun isEnabled(): Promise<Boolean> {
28
29
  val promise = Promise<Boolean>()
29
- mainHandler.post { promise.resolve(desired) }
30
+ mainHandler.post { promise.resolve(tags.isNotEmpty()) }
30
31
  return promise
31
32
  }
32
33
 
33
34
  override fun setEnabled(enabled: Boolean): Promise<Unit> {
34
35
  val promise = Promise<Unit>()
35
36
  mainHandler.post {
36
- desired = enabled
37
- apply(desired)
37
+ if (enabled) tags.add(DEFAULT_TAG) else tags.remove(DEFAULT_TAG)
38
+ apply(tags.isNotEmpty())
39
+ promise.resolve(Unit)
40
+ }
41
+ return promise
42
+ }
43
+
44
+ override fun activate(tag: String): Promise<Unit> {
45
+ val promise = Promise<Unit>()
46
+ mainHandler.post {
47
+ tags.add(tag)
48
+ apply(true)
49
+ promise.resolve(Unit)
50
+ }
51
+ return promise
52
+ }
53
+
54
+ override fun deactivate(tag: String): Promise<Unit> {
55
+ val promise = Promise<Unit>()
56
+ mainHandler.post {
57
+ tags.remove(tag)
58
+ apply(tags.isNotEmpty())
38
59
  promise.resolve(Unit)
39
60
  }
40
61
  return promise
41
62
  }
42
63
 
43
64
  override fun onHostResume() {
44
- apply(desired)
65
+ apply(tags.isNotEmpty())
45
66
  }
46
67
 
47
68
  override fun onHostPause() {}
@@ -56,4 +77,8 @@ class HybridOneKeepAwake : HybridOneKeepAwakeSpec(), LifecycleEventListener {
56
77
  window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
57
78
  }
58
79
  }
80
+
81
+ companion object {
82
+ private const val DEFAULT_TAG = "ExpoKeepAwakeDefaultTag"
83
+ }
59
84
  }