@rafaelaugusto/jolt 0.1.0-beta.9 → 0.1.0-rc.2

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 (576) hide show
  1. package/README.md +167 -21
  2. package/dist/animate.d.ts +25 -4
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +67 -26
  5. package/dist/animate.js.map +1 -1
  6. package/dist/blur/index.d.ts +6 -0
  7. package/dist/blur/index.d.ts.map +1 -0
  8. package/dist/blur/index.js +196 -0
  9. package/dist/blur/index.js.map +1 -0
  10. package/dist/blur/native.d.ts +17 -0
  11. package/dist/blur/native.d.ts.map +1 -0
  12. package/dist/blur/native.js +44 -0
  13. package/dist/blur/native.js.map +1 -0
  14. package/dist/blur/types.d.ts +32 -0
  15. package/dist/blur/types.d.ts.map +1 -0
  16. package/dist/blur/types.js +2 -0
  17. package/dist/blur/types.js.map +1 -0
  18. package/dist/bottom-sheet/geometry.d.ts +18 -0
  19. package/dist/bottom-sheet/geometry.d.ts.map +1 -0
  20. package/dist/bottom-sheet/geometry.js +51 -0
  21. package/dist/bottom-sheet/geometry.js.map +1 -0
  22. package/dist/bottom-sheet/index.d.ts +56 -0
  23. package/dist/bottom-sheet/index.d.ts.map +1 -0
  24. package/dist/bottom-sheet/index.js +462 -0
  25. package/dist/bottom-sheet/index.js.map +1 -0
  26. package/dist/bottom-sheet/native.d.ts +11 -0
  27. package/dist/bottom-sheet/native.d.ts.map +1 -0
  28. package/dist/bottom-sheet/native.js +173 -0
  29. package/dist/bottom-sheet/native.js.map +1 -0
  30. package/dist/config.d.ts +9 -0
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +40 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/decay.d.ts +1 -0
  35. package/dist/decay.d.ts.map +1 -1
  36. package/dist/decay.js +7 -0
  37. package/dist/decay.js.map +1 -1
  38. package/dist/drag-physics.d.ts +6 -1
  39. package/dist/drag-physics.d.ts.map +1 -1
  40. package/dist/drag.d.ts +17 -3
  41. package/dist/drag.d.ts.map +1 -1
  42. package/dist/drag.js +34 -11
  43. package/dist/drag.js.map +1 -1
  44. package/dist/driver/android-gradient.d.ts +5 -0
  45. package/dist/driver/android-gradient.d.ts.map +1 -0
  46. package/dist/driver/android-gradient.js +99 -0
  47. package/dist/driver/android-gradient.js.map +1 -0
  48. package/dist/driver/android-particles.d.ts +6 -0
  49. package/dist/driver/android-particles.d.ts.map +1 -0
  50. package/dist/driver/android-particles.js +93 -0
  51. package/dist/driver/android-particles.js.map +1 -0
  52. package/dist/driver/android.d.ts.map +1 -1
  53. package/dist/driver/android.js +27 -1
  54. package/dist/driver/android.js.map +1 -1
  55. package/dist/driver/frame.d.ts +3 -0
  56. package/dist/driver/frame.d.ts.map +1 -0
  57. package/dist/driver/frame.js +7 -0
  58. package/dist/driver/frame.js.map +1 -0
  59. package/dist/driver/index.d.ts +4 -0
  60. package/dist/driver/index.d.ts.map +1 -1
  61. package/dist/driver/index.js.map +1 -1
  62. package/dist/driver/ios-gradient.d.ts +5 -0
  63. package/dist/driver/ios-gradient.d.ts.map +1 -0
  64. package/dist/driver/ios-gradient.js +131 -0
  65. package/dist/driver/ios-gradient.js.map +1 -0
  66. package/dist/driver/ios-scroll-delegate.d.ts +4 -0
  67. package/dist/driver/ios-scroll-delegate.d.ts.map +1 -0
  68. package/dist/driver/ios-scroll-delegate.js +26 -0
  69. package/dist/driver/ios-scroll-delegate.js.map +1 -0
  70. package/dist/driver/ios.d.ts.map +1 -1
  71. package/dist/driver/ios.js +9 -0
  72. package/dist/driver/ios.js.map +1 -1
  73. package/dist/easing.d.ts +3 -1
  74. package/dist/easing.d.ts.map +1 -1
  75. package/dist/easing.js +18 -1
  76. package/dist/easing.js.map +1 -1
  77. package/dist/engine.d.ts +31 -2
  78. package/dist/engine.d.ts.map +1 -1
  79. package/dist/engine.js +194 -42
  80. package/dist/engine.js.map +1 -1
  81. package/dist/gesture-native.d.ts +28 -0
  82. package/dist/gesture-native.d.ts.map +1 -0
  83. package/dist/gesture-native.js +61 -0
  84. package/dist/gesture-native.js.map +1 -0
  85. package/dist/gestures/index.d.ts +69 -0
  86. package/dist/gestures/index.d.ts.map +1 -0
  87. package/dist/gestures/index.js +262 -0
  88. package/dist/gestures/index.js.map +1 -0
  89. package/dist/glass/index.d.ts +55 -0
  90. package/dist/glass/index.d.ts.map +1 -0
  91. package/dist/glass/index.js +205 -0
  92. package/dist/glass/index.js.map +1 -0
  93. package/dist/gradient-binding.d.ts +38 -0
  94. package/dist/gradient-binding.d.ts.map +1 -0
  95. package/dist/gradient-binding.js +128 -0
  96. package/dist/gradient-binding.js.map +1 -0
  97. package/dist/gradient.d.ts +105 -0
  98. package/dist/gradient.d.ts.map +1 -0
  99. package/dist/gradient.js +514 -0
  100. package/dist/gradient.js.map +1 -0
  101. package/dist/gravity.d.ts +13 -0
  102. package/dist/gravity.d.ts.map +1 -0
  103. package/dist/gravity.js +84 -0
  104. package/dist/gravity.js.map +1 -0
  105. package/dist/haptics.d.ts.map +1 -1
  106. package/dist/haptics.js +101 -28
  107. package/dist/haptics.js.map +1 -1
  108. package/dist/image-effect.d.ts +1 -0
  109. package/dist/image-effect.d.ts.map +1 -1
  110. package/dist/image-effect.js +10 -2
  111. package/dist/image-effect.js.map +1 -1
  112. package/dist/index.d.ts +19 -7
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +10 -4
  115. package/dist/index.js.map +1 -1
  116. package/dist/inspector/index.d.ts +86 -0
  117. package/dist/inspector/index.d.ts.map +1 -0
  118. package/dist/inspector/index.js +419 -0
  119. package/dist/inspector/index.js.map +1 -0
  120. package/dist/inspector/plot.d.ts +4 -0
  121. package/dist/inspector/plot.d.ts.map +1 -0
  122. package/dist/inspector/plot.js +23 -0
  123. package/dist/inspector/plot.js.map +1 -0
  124. package/dist/inspector/probe.d.ts +19 -0
  125. package/dist/inspector/probe.d.ts.map +1 -0
  126. package/dist/inspector/probe.js +37 -0
  127. package/dist/inspector/probe.js.map +1 -0
  128. package/dist/inspector/tuning.d.ts +19 -0
  129. package/dist/inspector/tuning.d.ts.map +1 -0
  130. package/dist/inspector/tuning.js +37 -0
  131. package/dist/inspector/tuning.js.map +1 -0
  132. package/dist/interactive-navigation/index.d.ts +44 -0
  133. package/dist/interactive-navigation/index.d.ts.map +1 -0
  134. package/dist/interactive-navigation/index.js +350 -0
  135. package/dist/interactive-navigation/index.js.map +1 -0
  136. package/dist/keyboard.d.ts +24 -0
  137. package/dist/keyboard.d.ts.map +1 -1
  138. package/dist/keyboard.js +199 -6
  139. package/dist/keyboard.js.map +1 -1
  140. package/dist/live-spring-driver.d.ts +52 -0
  141. package/dist/live-spring-driver.d.ts.map +1 -0
  142. package/dist/live-spring-driver.js +104 -0
  143. package/dist/live-spring-driver.js.map +1 -0
  144. package/dist/mixer.d.ts +55 -0
  145. package/dist/mixer.d.ts.map +1 -0
  146. package/dist/mixer.js +286 -0
  147. package/dist/mixer.js.map +1 -0
  148. package/dist/motion-scope.d.ts +8 -2
  149. package/dist/motion-scope.d.ts.map +1 -1
  150. package/dist/motion-scope.js +24 -3
  151. package/dist/motion-scope.js.map +1 -1
  152. package/dist/motion-states.d.ts +19 -7
  153. package/dist/motion-states.d.ts.map +1 -1
  154. package/dist/motion-states.js +116 -26
  155. package/dist/motion-states.js.map +1 -1
  156. package/dist/motion-value.d.ts +227 -0
  157. package/dist/motion-value.d.ts.map +1 -0
  158. package/dist/motion-value.js +1074 -0
  159. package/dist/motion-value.js.map +1 -0
  160. package/dist/native/index.d.ts +10 -0
  161. package/dist/native/index.d.ts.map +1 -0
  162. package/dist/native/index.js +6 -0
  163. package/dist/native/index.js.map +1 -0
  164. package/dist/native-properties.d.ts +28 -0
  165. package/dist/native-properties.d.ts.map +1 -0
  166. package/dist/native-properties.js +154 -0
  167. package/dist/native-properties.js.map +1 -0
  168. package/dist/native-property-driver.d.ts +19 -0
  169. package/dist/native-property-driver.d.ts.map +1 -0
  170. package/dist/native-property-driver.js +69 -0
  171. package/dist/native-property-driver.js.map +1 -0
  172. package/dist/native-property.d.ts +37 -0
  173. package/dist/native-property.d.ts.map +1 -0
  174. package/dist/native-property.js +285 -0
  175. package/dist/native-property.js.map +1 -0
  176. package/dist/particles.d.ts +5 -2
  177. package/dist/particles.d.ts.map +1 -1
  178. package/dist/particles.js +16 -10
  179. package/dist/particles.js.map +1 -1
  180. package/dist/path.d.ts.map +1 -1
  181. package/dist/path.js +2 -2
  182. package/dist/path.js.map +1 -1
  183. package/dist/physics/index.d.ts +139 -0
  184. package/dist/physics/index.d.ts.map +1 -0
  185. package/dist/physics/index.js +316 -0
  186. package/dist/physics/index.js.map +1 -0
  187. package/dist/physics/native.d.ts +54 -0
  188. package/dist/physics/native.d.ts.map +1 -0
  189. package/dist/physics/native.js +64 -0
  190. package/dist/physics/native.js.map +1 -0
  191. package/dist/playback-group.d.ts.map +1 -1
  192. package/dist/playback-group.js +17 -1
  193. package/dist/playback-group.js.map +1 -1
  194. package/dist/playback.d.ts +15 -0
  195. package/dist/playback.d.ts.map +1 -1
  196. package/dist/playback.js +23 -0
  197. package/dist/playback.js.map +1 -1
  198. package/dist/predictive-back/index.d.ts +45 -0
  199. package/dist/predictive-back/index.d.ts.map +1 -0
  200. package/dist/predictive-back/index.js +220 -0
  201. package/dist/predictive-back/index.js.map +1 -0
  202. package/dist/predictive-back/presentation.d.ts +4 -0
  203. package/dist/predictive-back/presentation.d.ts.map +1 -0
  204. package/dist/predictive-back/presentation.js +3 -0
  205. package/dist/predictive-back/presentation.js.map +1 -0
  206. package/dist/press.d.ts.map +1 -1
  207. package/dist/press.js +11 -2
  208. package/dist/press.js.map +1 -1
  209. package/dist/reorder/handle.d.ts +6 -0
  210. package/dist/reorder/handle.d.ts.map +1 -0
  211. package/dist/reorder/handle.js +10 -0
  212. package/dist/reorder/handle.js.map +1 -0
  213. package/dist/reorder/index.d.ts +10 -0
  214. package/dist/reorder/index.d.ts.map +1 -0
  215. package/dist/reorder/index.js +233 -0
  216. package/dist/reorder/index.js.map +1 -0
  217. package/dist/reorder/list-view.d.ts +5 -0
  218. package/dist/reorder/list-view.d.ts.map +1 -0
  219. package/dist/reorder/list-view.js +238 -0
  220. package/dist/reorder/list-view.js.map +1 -0
  221. package/dist/reorder/model.d.ts +6 -0
  222. package/dist/reorder/model.d.ts.map +1 -0
  223. package/dist/reorder/model.js +30 -0
  224. package/dist/reorder/model.js.map +1 -0
  225. package/dist/reorder/surface.d.ts +6 -0
  226. package/dist/reorder/surface.d.ts.map +1 -0
  227. package/dist/reorder/surface.js +10 -0
  228. package/dist/reorder/surface.js.map +1 -0
  229. package/dist/reorder/types.d.ts +92 -0
  230. package/dist/reorder/types.d.ts.map +1 -0
  231. package/dist/reorder/types.js +2 -0
  232. package/dist/reorder/types.js.map +1 -0
  233. package/dist/sampling.d.ts +35 -0
  234. package/dist/sampling.d.ts.map +1 -0
  235. package/dist/sampling.js +123 -0
  236. package/dist/sampling.js.map +1 -0
  237. package/dist/scene-appearance.d.ts +14 -0
  238. package/dist/scene-appearance.d.ts.map +1 -0
  239. package/dist/scene-appearance.js +68 -0
  240. package/dist/scene-appearance.js.map +1 -0
  241. package/dist/scene-camera.d.ts +5 -0
  242. package/dist/scene-camera.d.ts.map +1 -0
  243. package/dist/scene-camera.js +23 -0
  244. package/dist/scene-camera.js.map +1 -0
  245. package/dist/scene-shader.d.ts +18 -0
  246. package/dist/scene-shader.d.ts.map +1 -0
  247. package/dist/scene-shader.js +76 -0
  248. package/dist/scene-shader.js.map +1 -0
  249. package/dist/scroll-header/geometry.d.ts +18 -0
  250. package/dist/scroll-header/geometry.d.ts.map +1 -0
  251. package/dist/scroll-header/geometry.js +46 -0
  252. package/dist/scroll-header/geometry.js.map +1 -0
  253. package/dist/scroll-header/index.d.ts +48 -0
  254. package/dist/scroll-header/index.d.ts.map +1 -0
  255. package/dist/scroll-header/index.js +399 -0
  256. package/dist/scroll-header/index.js.map +1 -0
  257. package/dist/scroll-header/native.d.ts +28 -0
  258. package/dist/scroll-header/native.d.ts.map +1 -0
  259. package/dist/scroll-header/native.js +43 -0
  260. package/dist/scroll-header/native.js.map +1 -0
  261. package/dist/sensors/index.d.ts +69 -0
  262. package/dist/sensors/index.d.ts.map +1 -0
  263. package/dist/sensors/index.js +149 -0
  264. package/dist/sensors/index.js.map +1 -0
  265. package/dist/sensors/native.d.ts +20 -0
  266. package/dist/sensors/native.d.ts.map +1 -0
  267. package/dist/sensors/native.js +48 -0
  268. package/dist/sensors/native.js.map +1 -0
  269. package/dist/sequence.d.ts +24 -0
  270. package/dist/sequence.d.ts.map +1 -1
  271. package/dist/sequence.js +181 -19
  272. package/dist/sequence.js.map +1 -1
  273. package/dist/shapes/android.d.ts +3 -0
  274. package/dist/shapes/android.d.ts.map +1 -0
  275. package/dist/shapes/android.js +51 -0
  276. package/dist/shapes/android.js.map +1 -0
  277. package/dist/shapes/index.d.ts +6 -0
  278. package/dist/shapes/index.d.ts.map +1 -0
  279. package/dist/shapes/index.js +238 -0
  280. package/dist/shapes/index.js.map +1 -0
  281. package/dist/shapes/ios.d.ts +3 -0
  282. package/dist/shapes/ios.d.ts.map +1 -0
  283. package/dist/shapes/ios.js +164 -0
  284. package/dist/shapes/ios.js.map +1 -0
  285. package/dist/shapes/native.d.ts +18 -0
  286. package/dist/shapes/native.d.ts.map +1 -0
  287. package/dist/shapes/native.js +10 -0
  288. package/dist/shapes/native.js.map +1 -0
  289. package/dist/shapes/path.d.ts +10 -0
  290. package/dist/shapes/path.d.ts.map +1 -0
  291. package/dist/shapes/path.js +106 -0
  292. package/dist/shapes/path.js.map +1 -0
  293. package/dist/shapes/types.d.ts +55 -0
  294. package/dist/shapes/types.d.ts.map +1 -0
  295. package/dist/shapes/types.js +11 -0
  296. package/dist/shapes/types.js.map +1 -0
  297. package/dist/shared-layout/index.d.ts +40 -0
  298. package/dist/shared-layout/index.d.ts.map +1 -0
  299. package/dist/shared-layout/index.js +267 -0
  300. package/dist/shared-layout/index.js.map +1 -0
  301. package/dist/shared-layout/native.d.ts +15 -0
  302. package/dist/shared-layout/native.d.ts.map +1 -0
  303. package/dist/shared-layout/native.js +79 -0
  304. package/dist/shared-layout/native.js.map +1 -0
  305. package/dist/shared-layout/timing.d.ts +9 -0
  306. package/dist/shared-layout/timing.d.ts.map +1 -0
  307. package/dist/shared-layout/timing.js +68 -0
  308. package/dist/shared-layout/timing.js.map +1 -0
  309. package/dist/shared-navigation/entry.d.ts +51 -0
  310. package/dist/shared-navigation/entry.d.ts.map +1 -0
  311. package/dist/shared-navigation/entry.js +619 -0
  312. package/dist/shared-navigation/entry.js.map +1 -0
  313. package/dist/shared-navigation/index.d.ts +58 -0
  314. package/dist/shared-navigation/index.d.ts.map +1 -0
  315. package/dist/shared-navigation/index.js +318 -0
  316. package/dist/shared-navigation/index.js.map +1 -0
  317. package/dist/shared-navigation/return-signal.d.ts +16 -0
  318. package/dist/shared-navigation/return-signal.d.ts.map +1 -0
  319. package/dist/shared-navigation/return-signal.js +35 -0
  320. package/dist/shared-navigation/return-signal.js.map +1 -0
  321. package/dist/shared-navigation/return-target.d.ts +32 -0
  322. package/dist/shared-navigation/return-target.d.ts.map +1 -0
  323. package/dist/shared-navigation/return-target.js +168 -0
  324. package/dist/shared-navigation/return-target.js.map +1 -0
  325. package/dist/shared-navigation/scope.d.ts +4 -0
  326. package/dist/shared-navigation/scope.d.ts.map +1 -0
  327. package/dist/shared-navigation/scope.js +2 -0
  328. package/dist/shared-navigation/scope.js.map +1 -0
  329. package/dist/shared-navigation/targets.d.ts +6 -0
  330. package/dist/shared-navigation/targets.d.ts.map +1 -0
  331. package/dist/shared-navigation/targets.js +36 -0
  332. package/dist/shared-navigation/targets.js.map +1 -0
  333. package/dist/size-layout.d.ts +19 -0
  334. package/dist/size-layout.d.ts.map +1 -0
  335. package/dist/size-layout.js +216 -0
  336. package/dist/size-layout.js.map +1 -0
  337. package/dist/size.d.ts +19 -0
  338. package/dist/size.d.ts.map +1 -0
  339. package/dist/size.js +251 -0
  340. package/dist/size.js.map +1 -0
  341. package/dist/spring.d.ts +2 -0
  342. package/dist/spring.d.ts.map +1 -1
  343. package/dist/spring.js +11 -0
  344. package/dist/spring.js.map +1 -1
  345. package/dist/svg-path.d.ts +18 -0
  346. package/dist/svg-path.d.ts.map +1 -1
  347. package/dist/svg-path.js +3 -2
  348. package/dist/svg-path.js.map +1 -1
  349. package/dist/testing/clock.d.ts +40 -0
  350. package/dist/testing/clock.d.ts.map +1 -0
  351. package/dist/testing/clock.js +116 -0
  352. package/dist/testing/clock.js.map +1 -0
  353. package/dist/testing/handoff-recorder.d.ts +8 -0
  354. package/dist/testing/handoff-recorder.d.ts.map +1 -0
  355. package/dist/testing/handoff-recorder.js +77 -0
  356. package/dist/testing/handoff-recorder.js.map +1 -0
  357. package/dist/testing/index.d.ts +5 -0
  358. package/dist/testing/index.d.ts.map +1 -0
  359. package/dist/testing/index.js +5 -0
  360. package/dist/testing/index.js.map +1 -0
  361. package/dist/testing/native.d.ts +46 -0
  362. package/dist/testing/native.d.ts.map +1 -0
  363. package/dist/testing/native.js +313 -0
  364. package/dist/testing/native.js.map +1 -0
  365. package/dist/testing/presentation.d.ts +11 -0
  366. package/dist/testing/presentation.d.ts.map +1 -0
  367. package/dist/testing/presentation.js +45 -0
  368. package/dist/testing/presentation.js.map +1 -0
  369. package/dist/testing/replay.d.ts +39 -0
  370. package/dist/testing/replay.d.ts.map +1 -0
  371. package/dist/testing/replay.js +99 -0
  372. package/dist/testing/replay.js.map +1 -0
  373. package/dist/testing/scroll-handoff-native.d.ts +10 -0
  374. package/dist/testing/scroll-handoff-native.d.ts.map +1 -0
  375. package/dist/testing/scroll-handoff-native.js +151 -0
  376. package/dist/testing/scroll-handoff-native.js.map +1 -0
  377. package/dist/testing/scroll-handoff.d.ts +25 -0
  378. package/dist/testing/scroll-handoff.d.ts.map +1 -0
  379. package/dist/testing/scroll-handoff.js +127 -0
  380. package/dist/testing/scroll-handoff.js.map +1 -0
  381. package/dist/testing/sensors.d.ts +13 -0
  382. package/dist/testing/sensors.d.ts.map +1 -0
  383. package/dist/testing/sensors.js +26 -0
  384. package/dist/testing/sensors.js.map +1 -0
  385. package/dist/testing/trace.d.ts +101 -0
  386. package/dist/testing/trace.d.ts.map +1 -0
  387. package/dist/testing/trace.js +263 -0
  388. package/dist/testing/trace.js.map +1 -0
  389. package/dist/timed-animation.d.ts +38 -0
  390. package/dist/timed-animation.d.ts.map +1 -0
  391. package/dist/timed-animation.js +177 -0
  392. package/dist/timed-animation.js.map +1 -0
  393. package/dist/track.d.ts +3 -0
  394. package/dist/track.d.ts.map +1 -1
  395. package/dist/track.js +281 -40
  396. package/dist/track.js.map +1 -1
  397. package/dist/transition.d.ts +54 -2
  398. package/dist/transition.d.ts.map +1 -1
  399. package/dist/transition.js +128 -8
  400. package/dist/transition.js.map +1 -1
  401. package/dist/types.d.ts +10 -1
  402. package/dist/types.d.ts.map +1 -1
  403. package/dist/value-observers.d.ts +22 -0
  404. package/dist/value-observers.d.ts.map +1 -0
  405. package/dist/value-observers.js +122 -0
  406. package/dist/value-observers.js.map +1 -0
  407. package/dist/value-track.d.ts +13 -0
  408. package/dist/value-track.d.ts.map +1 -0
  409. package/dist/value-track.js +59 -0
  410. package/dist/value-track.js.map +1 -0
  411. package/dist/vue/index.d.ts +33 -3
  412. package/dist/vue/index.d.ts.map +1 -1
  413. package/dist/vue/index.js +118 -3
  414. package/dist/vue/index.js.map +1 -1
  415. package/dist/zoomable.d.ts +1 -1
  416. package/dist/zoomable.d.ts.map +1 -1
  417. package/package.json +68 -3
  418. package/platforms/android/include.gradle +10 -0
  419. package/platforms/android/java/org/rafaelaugusto/jolt/BlurEffect.java +89 -0
  420. package/platforms/android/java/org/rafaelaugusto/jolt/CircleMath.java +158 -0
  421. package/platforms/android/java/org/rafaelaugusto/jolt/CircleWorld.java +221 -0
  422. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSession.java +227 -0
  423. package/platforms/android/java/org/rafaelaugusto/jolt/GestureSurface.java +54 -0
  424. package/platforms/android/java/org/rafaelaugusto/jolt/GradientLayer.java +224 -0
  425. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrame.java +53 -0
  426. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardFrameFollower.java +57 -0
  427. package/platforms/android/java/org/rafaelaugusto/jolt/KeyboardObserver.java +97 -0
  428. package/platforms/android/java/org/rafaelaugusto/jolt/LiveSpring.java +277 -0
  429. package/platforms/android/java/org/rafaelaugusto/jolt/MotionProbe.java +70 -0
  430. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleEmitter.java +192 -0
  431. package/platforms/android/java/org/rafaelaugusto/jolt/ParticleSimulation.java +114 -0
  432. package/platforms/android/java/org/rafaelaugusto/jolt/PredictiveBackSession.java +212 -0
  433. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderHandle.java +25 -0
  434. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSession.java +213 -0
  435. package/platforms/android/java/org/rafaelaugusto/jolt/ReorderSurface.java +27 -0
  436. package/platforms/android/java/org/rafaelaugusto/jolt/ScrollHeader.java +84 -0
  437. package/platforms/android/java/org/rafaelaugusto/jolt/SensorMath.java +28 -0
  438. package/platforms/android/java/org/rafaelaugusto/jolt/SensorSource.java +217 -0
  439. package/platforms/android/java/org/rafaelaugusto/jolt/ShapeLayer.java +120 -0
  440. package/platforms/android/java/org/rafaelaugusto/jolt/SharedLayoutFlight.java +287 -0
  441. package/platforms/android/java/org/rafaelaugusto/jolt/SharedNavigationScene.java +115 -0
  442. package/platforms/android/java/org/rafaelaugusto/jolt/SpringState.java +39 -0
  443. package/platforms/android/proguard-rules.pro +20 -0
  444. package/platforms/ios/build.xcconfig +1 -1
  445. package/platforms/ios/src/JoltBlur.h +14 -0
  446. package/platforms/ios/src/JoltBlur.m +86 -0
  447. package/platforms/ios/src/JoltCircleMath.h +191 -0
  448. package/platforms/ios/src/JoltCircleWorld.h +18 -0
  449. package/platforms/ios/src/JoltCircleWorld.m +218 -0
  450. package/platforms/ios/src/JoltGestureSession.h +23 -0
  451. package/platforms/ios/src/JoltGestureSession.m +251 -0
  452. package/platforms/ios/src/JoltInteractiveNavigation.h +23 -0
  453. package/platforms/ios/src/JoltInteractiveNavigation.m +255 -0
  454. package/platforms/ios/src/JoltLiveSpring.h +29 -0
  455. package/platforms/ios/src/JoltLiveSpring.m +243 -0
  456. package/platforms/ios/src/JoltMotionProbe.h +9 -0
  457. package/platforms/ios/src/JoltMotionProbe.m +72 -0
  458. package/platforms/ios/src/JoltReorderSession.h +15 -0
  459. package/platforms/ios/src/JoltReorderSession.m +205 -0
  460. package/platforms/ios/src/JoltScrollHeader.h +13 -0
  461. package/platforms/ios/src/JoltScrollHeader.m +101 -0
  462. package/platforms/ios/src/JoltSensorMath.h +39 -0
  463. package/platforms/ios/src/JoltSensorSource.h +13 -0
  464. package/platforms/ios/src/JoltSensorSource.m +201 -0
  465. package/platforms/ios/src/JoltSharedLayoutFlight.h +19 -0
  466. package/platforms/ios/src/JoltSharedLayoutFlight.m +250 -0
  467. package/platforms/ios/src/JoltSpringState.h +35 -0
  468. package/platforms/ios/src/module.modulemap +10 -0
  469. package/src/android-plugin.d.ts +464 -0
  470. package/src/animate.ts +129 -15
  471. package/src/blur/index.ts +195 -0
  472. package/src/blur/native.ts +70 -0
  473. package/src/blur/types.ts +32 -0
  474. package/src/bottom-sheet/geometry.ts +84 -0
  475. package/src/bottom-sheet/index.ts +536 -0
  476. package/src/bottom-sheet/native.ts +214 -0
  477. package/src/config.ts +39 -1
  478. package/src/decay.ts +9 -0
  479. package/src/drag.ts +67 -21
  480. package/src/driver/android-gradient.ts +116 -0
  481. package/src/driver/android-particles.ts +118 -0
  482. package/src/driver/android.ts +31 -1
  483. package/src/driver/frame.ts +10 -0
  484. package/src/driver/index.ts +4 -0
  485. package/src/driver/ios-gradient.ts +136 -0
  486. package/src/driver/ios-scroll-delegate.ts +23 -0
  487. package/src/driver/ios.ts +10 -0
  488. package/src/easing.ts +21 -1
  489. package/src/engine.ts +209 -60
  490. package/src/gesture-native.ts +139 -0
  491. package/src/gestures/index.ts +365 -0
  492. package/src/glass/index.ts +218 -0
  493. package/src/gradient-binding.ts +158 -0
  494. package/src/gradient.ts +663 -0
  495. package/src/gravity.ts +107 -0
  496. package/src/haptics.ts +106 -28
  497. package/src/image-effect.ts +10 -2
  498. package/src/index.ts +56 -7
  499. package/src/inspector/index.ts +523 -0
  500. package/src/inspector/plot.ts +27 -0
  501. package/src/inspector/probe.ts +50 -0
  502. package/src/inspector/tuning.ts +51 -0
  503. package/src/interactive-navigation/index.ts +427 -0
  504. package/src/ios-plugin.d.ts +280 -0
  505. package/src/keyboard.ts +231 -7
  506. package/src/live-spring-driver.ts +181 -0
  507. package/src/mixer.ts +312 -0
  508. package/src/motion-scope.ts +39 -6
  509. package/src/motion-states.ts +149 -42
  510. package/src/motion-value.ts +1289 -0
  511. package/src/native/index.ts +30 -0
  512. package/src/native-properties.ts +188 -0
  513. package/src/native-property-driver.ts +123 -0
  514. package/src/native-property.ts +366 -0
  515. package/src/particles.ts +18 -17
  516. package/src/path.ts +2 -1
  517. package/src/physics/index.ts +476 -0
  518. package/src/physics/native.ts +121 -0
  519. package/src/playback-group.ts +17 -1
  520. package/src/playback.ts +41 -0
  521. package/src/predictive-back/index.ts +280 -0
  522. package/src/predictive-back/presentation.ts +6 -0
  523. package/src/press.ts +10 -2
  524. package/src/reorder/handle.ts +9 -0
  525. package/src/reorder/index.ts +243 -0
  526. package/src/reorder/list-view.ts +262 -0
  527. package/src/reorder/model.ts +47 -0
  528. package/src/reorder/surface.ts +10 -0
  529. package/src/reorder/types.ts +87 -0
  530. package/src/sampling.ts +173 -0
  531. package/src/scene-appearance.ts +92 -0
  532. package/src/scene-camera.ts +30 -0
  533. package/src/scene-shader.ts +139 -0
  534. package/src/scroll-header/geometry.ts +88 -0
  535. package/src/scroll-header/index.ts +530 -0
  536. package/src/scroll-header/native.ts +89 -0
  537. package/src/sensors/index.ts +246 -0
  538. package/src/sensors/native.ts +72 -0
  539. package/src/sequence.ts +209 -20
  540. package/src/shapes/android.ts +63 -0
  541. package/src/shapes/index.ts +267 -0
  542. package/src/shapes/ios.ts +194 -0
  543. package/src/shapes/native.ts +27 -0
  544. package/src/shapes/path.ts +127 -0
  545. package/src/shapes/types.ts +63 -0
  546. package/src/shared-layout/index.ts +343 -0
  547. package/src/shared-layout/native.ts +138 -0
  548. package/src/shared-layout/timing.ts +87 -0
  549. package/src/shared-navigation/entry.ts +695 -0
  550. package/src/shared-navigation/index.ts +414 -0
  551. package/src/shared-navigation/return-signal.ts +41 -0
  552. package/src/shared-navigation/return-target.ts +197 -0
  553. package/src/shared-navigation/scope.ts +3 -0
  554. package/src/shared-navigation/targets.ts +38 -0
  555. package/src/size-layout.ts +237 -0
  556. package/src/size.ts +302 -0
  557. package/src/spring.ts +18 -0
  558. package/src/svg-path.ts +8 -3
  559. package/src/testing/clock.ts +128 -0
  560. package/src/testing/handoff-recorder.ts +98 -0
  561. package/src/testing/index.ts +4 -0
  562. package/src/testing/native.ts +386 -0
  563. package/src/testing/presentation.ts +46 -0
  564. package/src/testing/replay.ts +149 -0
  565. package/src/testing/scroll-handoff-native.ts +201 -0
  566. package/src/testing/scroll-handoff.ts +140 -0
  567. package/src/testing/sensors.ts +41 -0
  568. package/src/testing/trace.ts +340 -0
  569. package/src/timed-animation.ts +192 -0
  570. package/src/track.ts +334 -38
  571. package/src/transition.ts +197 -9
  572. package/src/types.ts +11 -1
  573. package/src/value-observers.ts +147 -0
  574. package/src/value-track.ts +71 -0
  575. package/src/vue/index.ts +147 -1
  576. package/src/zoomable.ts +1 -1
@@ -0,0 +1,212 @@
1
+ package org.rafaelaugusto.jolt;
2
+
3
+ import android.os.Build;
4
+ import android.os.SystemClock;
5
+ import android.view.Choreographer;
6
+ import android.view.View;
7
+ import androidx.activity.BackEventCompat;
8
+ import androidx.activity.OnBackPressedCallback;
9
+ import androidx.activity.OnBackPressedDispatcherOwner;
10
+ import androidx.activity.ViewTreeOnBackPressedDispatcherOwner;
11
+ import androidx.lifecycle.Lifecycle;
12
+ import androidx.lifecycle.LifecycleEventObserver;
13
+ import androidx.lifecycle.LifecycleOwner;
14
+ import org.json.JSONArray;
15
+ import org.json.JSONObject;
16
+
17
+ /** AndroidX owns system input. Progress, presentation and spring settlement never cross JS. */
18
+ public final class PredictiveBackSession extends OnBackPressedCallback implements
19
+ Choreographer.FrameCallback, View.OnAttachStateChangeListener, View.OnLayoutChangeListener, LifecycleEventObserver {
20
+ public interface Listener { void onState(int state, double progress, double velocity, int edge); }
21
+ // idle=0, tracking=1, cancelling=2, finishing=3, awaiting commit=4, cancelled=5, completed=6, disposed=7.
22
+ private final View view;
23
+ private final OnBackPressedDispatcherOwner owner;
24
+ private Listener listener;
25
+ private SharedNavigationScene sharedScene;
26
+ public void setSharedScene(SharedNavigationScene scene) { if(captured || disposed)throw new IllegalStateException("Attach shared presentation before back begins."); sharedScene=scene; }
27
+ private final SpringState spring = new SpringState(0, 0);
28
+ private final double stiffness, damping, mass;
29
+ private final float density, dx, dy, sx, sy, opacity, rotation;
30
+ private final boolean mirror;
31
+ private float baseX, baseY, baseSX, baseSY, baseAlpha, baseRotation;
32
+ private int width, height, rootWidth, rootHeight, edge = -1, phase;
33
+ private boolean captured, connected, disposed, scheduled, reduced, inputEnabled = true, ignorePress;
34
+ private double target, speed = 1;
35
+ private long lastProgressAt, previousFrame, settleAt;
36
+ private static int callbacks, active, progressEvents;
37
+
38
+ public static PredictiveBackSession attach(View view, String options, Listener listener) {
39
+ if (Build.VERSION.SDK_INT < 34 || view == null || !view.isAttachedToWindow()) return null;
40
+ OnBackPressedDispatcherOwner owner = ViewTreeOnBackPressedDispatcherOwner.get(view);
41
+ if (owner == null || !owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) return null;
42
+ return new PredictiveBackSession(view, owner, options, listener);
43
+ }
44
+ private PredictiveBackSession(View view, OnBackPressedDispatcherOwner owner, String options, Listener listener) {
45
+ super(false);
46
+ this.view = view; this.owner = owner; this.listener = listener;
47
+ density = view.getResources().getDisplayMetrics().density;
48
+ try {
49
+ JSONObject config = new JSONObject(options), values = config.getJSONObject("values");
50
+ dx = end(values, "x", 0) * density; dy = end(values, "y", 0) * density;
51
+ sx = end(values, "scaleX", end(values, "scale", 1)); sy = end(values, "scaleY", end(values, "scale", 1));
52
+ opacity = end(values, "opacity", 1); rotation = end(values, "rotate", 0);
53
+ stiffness = config.getDouble("stiffness"); damping = config.getDouble("damping"); mass = config.getDouble("mass");
54
+ if (!Float.isFinite(dx) || !Float.isFinite(dy) || !Float.isFinite(sx) || !Float.isFinite(sy) || !Float.isFinite(opacity) || !Float.isFinite(rotation))
55
+ throw new IllegalArgumentException("Predictive back endpoints exceed native float bounds.");
56
+ mirror = config.getBoolean("mirrorX"); reduced = config.getBoolean("reduced"); speed = config.getDouble("timeScale");
57
+ inputEnabled = config.getBoolean("enabled");
58
+ } catch (Exception error) { throw new IllegalArgumentException(error); }
59
+ connected = true; callbacks++;
60
+ owner.getOnBackPressedDispatcher().addCallback(owner, this);
61
+ owner.getLifecycle().addObserver(this);
62
+ view.addOnAttachStateChangeListener(this); view.addOnLayoutChangeListener(this);
63
+ setEnabled(inputEnabled);
64
+ }
65
+ private static float end(JSONObject values, String key, float fallback) throws Exception {
66
+ JSONArray pair = values.optJSONArray(key);
67
+ return pair == null ? fallback : (float)pair.getDouble(1);
68
+ }
69
+ public static int callbackCount() { return callbacks; }
70
+ public static int activeCount() { return active; }
71
+ public static int progressEventCount() { return progressEvents; }
72
+ public double getProgress() { return spring.position; }
73
+ public void setMotion(boolean reduced, double timeScale) {
74
+ this.reduced = reduced; this.speed = timeScale;
75
+ if (reduced && captured) {
76
+ if (phase == 1 || phase == 2) { cancel(); finish(); }
77
+ else if (phase == 3) finish();
78
+ else if (phase == 4) apply();
79
+ }
80
+ }
81
+ public void setInputEnabled(boolean enabled) {
82
+ inputEnabled = enabled;
83
+ if (!enabled && (phase == 1 || phase == 2)) { cancel(); finish(); }
84
+ if (!disposed) setEnabled(enabled);
85
+ }
86
+ private void emit(int state) {
87
+ if (listener != null) listener.onState(state, spring.position, spring.velocity, edge);
88
+ }
89
+ private void capture() {
90
+ if (captured) return;
91
+ captured = true; active++;
92
+ if(sharedScene!=null && !reduced)sharedScene.begin();
93
+ baseX = view.getTranslationX(); baseY = view.getTranslationY();
94
+ baseSX = view.getScaleX(); baseSY = view.getScaleY(); baseAlpha = view.getAlpha(); baseRotation = view.getRotation();
95
+ width = view.getWidth(); height = view.getHeight();
96
+ rootWidth = view.getRootView().getWidth(); rootHeight = view.getRootView().getHeight();
97
+ }
98
+ private void restore() {
99
+ if (!captured) return;
100
+ view.setTranslationX(baseX); view.setTranslationY(baseY);
101
+ view.setScaleX(baseSX); view.setScaleY(baseSY); view.setAlpha(baseAlpha); view.setRotation(baseRotation);
102
+ if(sharedScene!=null)sharedScene.finish();
103
+ captured = false; active--;
104
+ }
105
+ @Override public void handleOnBackStarted(BackEventCompat event) {
106
+ if (disposed || !inputEnabled || phase == 3 || phase == 4) return;
107
+ if (phase == 2) { finish(); if (disposed || phase != 0) return; }
108
+ ignorePress = false;
109
+ capture(); phase = 1; edge = event.getSwipeEdge(); spring.position = 0; spring.velocity = 0;
110
+ lastProgressAt = SystemClock.uptimeMillis(); apply(); emit(1);
111
+ }
112
+ @Override public void handleOnBackProgressed(BackEventCompat event) {
113
+ if (disposed || phase != 1 || ignorePress) return;
114
+ progressEvents++;
115
+ long now = SystemClock.uptimeMillis();
116
+ double next = Math.max(0, Math.min(1, event.getProgress()));
117
+ spring.velocity = now > lastProgressAt ? (next - spring.position) * 1000 / (now - lastProgressAt) : spring.velocity;
118
+ lastProgressAt = now; spring.position = next;
119
+ if (!validGeometry()) { cancel(); return; }
120
+ apply();
121
+ }
122
+ @Override public void handleOnBackCancelled() {
123
+ if (disposed) return;
124
+ ignorePress = false;
125
+ if (phase == 1) settle(false);
126
+ }
127
+ @Override public void handleOnBackPressed() {
128
+ if (disposed || !inputEnabled || phase == 3 || phase == 4) return;
129
+ if (ignorePress) { ignorePress = false; return; }
130
+ if (phase == 2) { finish(); if (disposed || phase != 0) return; }
131
+ if (!captured) { capture(); edge = -1; spring.position = 0; spring.velocity = 0; }
132
+ settle(true);
133
+ }
134
+ private void settle(boolean commit) {
135
+ if (disposed || !captured || phase == 4) return;
136
+ if (SystemClock.uptimeMillis() - lastProgressAt > 100) spring.velocity = 0;
137
+ phase = commit ? 3 : 2; target = commit ? 1 : 0;
138
+ settleAt = SystemClock.uptimeMillis(); previousFrame = 0;
139
+ emit(phase);
140
+ if (disposed || !captured || (phase != 2 && phase != 3)) return;
141
+ if (reduced) finish(); else schedule();
142
+ }
143
+ private void apply() {
144
+ double p = reduced ? 0 : Math.max(0, Math.min(1, spring.position));
145
+ if(sharedScene!=null && sharedScene.isAnimating()){sharedScene.render(p);return;}
146
+ float direction = mirror && edge == BackEventCompat.EDGE_RIGHT ? -1 : 1;
147
+ view.setTranslationX(baseX + (float)p * dx * direction); view.setTranslationY(baseY + (float)p * dy);
148
+ view.setScaleX(baseSX * (float)(1 + (sx - 1) * p)); view.setScaleY(baseSY * (float)(1 + (sy - 1) * p));
149
+ view.setAlpha(baseAlpha * (float)(1 + (opacity - 1) * p)); view.setRotation(baseRotation + (float)p * rotation * direction);
150
+ }
151
+ private boolean validGeometry() {
152
+ return (sharedScene==null || sharedScene.validActive()) && view.isAttachedToWindow() && view.getWidth() == width && view.getHeight() == height &&
153
+ view.getRootView().getWidth() == rootWidth && view.getRootView().getHeight() == rootHeight;
154
+ }
155
+ private void schedule() {
156
+ if (scheduled || disposed || (phase != 2 && phase != 3)) return;
157
+ scheduled = true; Choreographer.getInstance().postFrameCallback(this);
158
+ }
159
+ private void unschedule() { Choreographer.getInstance().removeFrameCallback(this); scheduled = false; }
160
+ @Override public void doFrame(long nanos) {
161
+ scheduled = false;
162
+ if (disposed || (phase != 2 && phase != 3)) return;
163
+ if (!validGeometry()) { cancel(); finish(); return; }
164
+ double seconds = previousFrame == 0 ? 1.0 / 60 : Math.max(0, (nanos - previousFrame) / 1e9);
165
+ previousFrame = nanos;
166
+ spring.advance(target, stiffness * speed * speed, damping * speed, mass, seconds);
167
+ if (!Double.isFinite(spring.position) || !Double.isFinite(spring.velocity)) { finish(); return; }
168
+ apply();
169
+ if ((Math.abs(spring.position - target) < .0005 && Math.abs(spring.velocity) < .005) || SystemClock.uptimeMillis() - settleAt >= 1500) finish();
170
+ else schedule();
171
+ }
172
+ private void finish() {
173
+ if (disposed || (phase != 2 && phase != 3)) return;
174
+ unschedule(); boolean commit = phase == 3;
175
+ spring.position = commit ? 1 : 0; spring.velocity = 0; apply();
176
+ if (commit) { phase = 4; emit(4); }
177
+ else { restore(); phase = 0; emit(5); }
178
+ }
179
+ public void completeCommit(boolean accepted) {
180
+ if (disposed || phase != 4) return;
181
+ if (accepted) { restore(); emit(6); dispose(); }
182
+ else if (!view.isAttachedToWindow()) { restore(); emit(5); dispose(); }
183
+ else { phase = 1; settle(false); }
184
+ }
185
+ public void cancel() {
186
+ if (disposed || phase == 4 || phase == 3) return; // Once released, preserve Android's committed decision.
187
+ if (phase == 1) { ignorePress = true; spring.velocity = 0; settle(false); }
188
+ }
189
+ private void disconnect() {
190
+ if (!connected) return;
191
+ connected = false; callbacks--; remove(); owner.getLifecycle().removeObserver(this);
192
+ view.removeOnAttachStateChangeListener(this); view.removeOnLayoutChangeListener(this);
193
+ }
194
+ public void dispose() {
195
+ if (disposed) return;
196
+ disposed = true; unschedule(); restore(); disconnect(); phase = 0; emit(7); listener = null; sharedScene = null;
197
+ }
198
+ @Override public void onViewDetachedFromWindow(View v) {
199
+ if (phase == 4) { restore(); disconnect(); } else dispose();
200
+ }
201
+ @Override public void onViewAttachedToWindow(View v) { }
202
+ @Override public void onLayoutChange(View v, int l, int t, int r, int b, int ol, int ot, int or, int ob) {
203
+ if (captured && !validGeometry()) { cancel(); finish(); }
204
+ }
205
+ @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
206
+ if (event == Lifecycle.Event.ON_DESTROY) dispose();
207
+ else if (event == Lifecycle.Event.ON_STOP && captured && phase != 4) {
208
+ // Lifecycle callbacks unregister input until STARTED; keep the handle reusable on resume.
209
+ phase = 2; ignorePress = true; finish();
210
+ }
211
+ }
212
+ }
@@ -0,0 +1,25 @@
1
+ package org.rafaelaugusto.jolt;
2
+
3
+ import android.content.Context;
4
+ import android.view.KeyEvent;
5
+ import android.view.MotionEvent;
6
+ import android.widget.Button;
7
+
8
+ /** A focusable button with explicit keyboard move actions. */
9
+ public final class ReorderHandle extends Button {
10
+ public interface MoveListener { void move(int direction); }
11
+ private MoveListener move;
12
+ public ReorderHandle(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); }
13
+ public void setMoveListener(MoveListener value) { move = value; }
14
+ @Override public boolean onTouchEvent(MotionEvent event) {
15
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) requestFocus();
16
+ return super.onTouchEvent(event);
17
+ }
18
+ @Override public boolean onKeyDown(int code, KeyEvent event) {
19
+ if (event.isAltPressed() && move != null && (code == KeyEvent.KEYCODE_DPAD_UP || code == KeyEvent.KEYCODE_DPAD_DOWN)) {
20
+ if (event.getRepeatCount() == 0) move.move(code == KeyEvent.KEYCODE_DPAD_UP ? -1 : 1);
21
+ return true;
22
+ }
23
+ return super.onKeyDown(code, event);
24
+ }
25
+ }
@@ -0,0 +1,213 @@
1
+ package org.rafaelaugusto.jolt;
2
+
3
+ import android.animation.Animator;
4
+ import android.animation.AnimatorListenerAdapter;
5
+ import android.animation.ValueAnimator;
6
+ import android.graphics.Bitmap;
7
+ import android.graphics.Canvas;
8
+ import android.graphics.Rect;
9
+ import android.view.Choreographer;
10
+ import android.view.MotionEvent;
11
+ import android.view.View;
12
+ import android.view.ViewConfiguration;
13
+ import android.view.ViewGroup;
14
+ import android.widget.ImageView;
15
+ import android.widget.ListView;
16
+ import org.json.JSONObject;
17
+ import java.util.ArrayList;
18
+ import java.util.Collections;
19
+ import java.util.Set;
20
+ import java.util.WeakHashMap;
21
+
22
+ /** Core ListView input, snapshot, recycling and edge autoscroll stay on the UI thread. */
23
+ public final class ReorderSession implements View.OnTouchListener, Choreographer.FrameCallback, View.OnLayoutChangeListener, View.OnAttachStateChangeListener {
24
+ public interface Listener { void onState(int state, int index, int toIndex); }
25
+ private static final class Cell {
26
+ final float translation, alpha;
27
+ final int index;
28
+ final SpringState spring = new SpringState(0, 0);
29
+ Cell(View view, int index) { this.translation = view.getTranslationY(); this.alpha = view.getAlpha(); this.index = index; }
30
+ }
31
+ final ListView list;
32
+ private final ReorderSurface surface;
33
+ private final Listener listener;
34
+ private final WeakHashMap<View, Cell> cells = new WeakHashMap<>();
35
+ private final Set<View> handles = Collections.newSetFromMap(new WeakHashMap<View, Boolean>());
36
+ private final float density, edgeSize, edgeSpeed, slop;
37
+ private final long longPress;
38
+ private final boolean handlesOnly;
39
+ private final Runnable activate = () -> begin();
40
+ private boolean enabled = true, disposed, active, settling, pending, reduced;
41
+ private int from, target, count, generation, width, height;
42
+ private float downX, downY, pointerX, pointerY, grabOffset, rowHeight, remainder;
43
+ private long previousTime;
44
+ private ImageView overlay;
45
+ private Bitmap bitmap;
46
+ private ValueAnimator drop;
47
+
48
+ public ReorderSession(ReorderSurface surface, ListView list, String options, Listener listener) {
49
+ this.surface = surface; this.list = list; this.listener = listener;
50
+ density = list.getResources().getDisplayMetrics().density;
51
+ slop = ViewConfiguration.get(list.getContext()).getScaledTouchSlop();
52
+ try {
53
+ JSONObject config = new JSONObject(options);
54
+ longPress = config.getLong("longPress"); edgeSize = (float)config.getDouble("edgeSize") * density;
55
+ edgeSpeed = (float)config.getDouble("edgeSpeed") * density;
56
+ reduced = config.getBoolean("reducedMotion"); handlesOnly = config.getBoolean("handles");
57
+ } catch (Exception error) { throw new IllegalArgumentException(error); }
58
+ surface.setSession(this); list.addOnLayoutChangeListener(this); list.addOnAttachStateChangeListener(this);
59
+ }
60
+ public boolean isActive() { return active; }
61
+ public void registerHandle(View view) {
62
+ if (!disposed && view != null) {
63
+ handles.add(view);
64
+ }
65
+ }
66
+ private boolean inHandle(float x, float y) {
67
+ if (!handlesOnly) return true;
68
+ Rect rect = new Rect();
69
+ for (View handle : handles) {
70
+ if (handle == null || !handle.isShown()) continue;
71
+ android.view.ViewParent parent = handle.getParent();
72
+ while (parent != null && parent != list) parent = parent.getParent();
73
+ if (parent != list) continue;
74
+ handle.getDrawingRect(rect); list.offsetDescendantRectToMyCoords(handle, rect);
75
+ if (rect.contains((int)x, (int)y)) return true;
76
+ }
77
+ return false;
78
+ }
79
+ @Override public boolean onTouch(View view, MotionEvent event) {
80
+ if (disposed) return false;
81
+ int action = event.getActionMasked();
82
+ if (action == MotionEvent.ACTION_DOWN) {
83
+ cancel();
84
+ downX = pointerX = event.getX(); downY = pointerY = event.getY();
85
+ if (enabled && list.isEnabled() && inHandle(downX, downY) && list.pointToPosition((int)downX, (int)downY) >= 0) {
86
+ pending = true; list.postDelayed(activate, longPress);
87
+ }
88
+ }
89
+ if (event.getPointerCount() > 1) { boolean handled = active; cancel(); return handled; }
90
+ if (action == MotionEvent.ACTION_MOVE) {
91
+ pointerX = event.getX(); pointerY = event.getY();
92
+ if (pending && Math.hypot(pointerX - downX, pointerY - downY) > slop) clearPending();
93
+ if (active && !settling) update(0);
94
+ }
95
+ boolean owned = active;
96
+ if (action == MotionEvent.ACTION_UP) { clearPending(); if (active && !settling) drop(); }
97
+ else if (action == MotionEvent.ACTION_CANCEL) { clearPending(); if (active) finish(false, 0); }
98
+ if (owned) return true;
99
+ return false;
100
+ }
101
+ private void clearPending() { pending = false; list.removeCallbacks(activate); }
102
+ private void emit(int state, int detail) { if (!disposed && listener != null) listener.onState(state, from, detail); }
103
+ private void begin() {
104
+ if (!pending || disposed || !enabled || !list.isAttachedToWindow()) return;
105
+ clearPending();
106
+ int index = list.pointToPosition((int)pointerX, (int)pointerY);
107
+ View cell = list.getChildAt(index - list.getFirstVisiblePosition());
108
+ if (cell == null || index < 0 || cell.getWidth() <= 0 || cell.getHeight() <= 0 || (long)cell.getWidth() * cell.getHeight() > 8000000) return;
109
+ bitmap = Bitmap.createBitmap(cell.getWidth(), cell.getHeight(), Bitmap.Config.ARGB_8888);
110
+ cell.draw(new Canvas(bitmap));
111
+ overlay = new ImageView(list.getContext()); overlay.setImageBitmap(bitmap);
112
+ overlay.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
113
+ overlay.layout(cell.getLeft(), 0, cell.getRight(), cell.getHeight());
114
+ overlay.setTranslationY(cell.getTop()); overlay.setElevation(12 * density);
115
+ list.getOverlay().add(overlay);
116
+ rowHeight = cell.getHeight() + list.getDividerHeight(); grabOffset = pointerY - cell.getTop();
117
+ width = list.getWidth(); height = list.getHeight(); count = list.getCount();
118
+ from = target = index; active = true; settling = false; remainder = 0; generation++;
119
+ // Stop the ListView's pending click/scroll, retaining this pointer stream.
120
+ MotionEvent cancel = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, pointerX, pointerY, 0);
121
+ list.onTouchEvent(cancel); cancel.recycle();
122
+ if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(true);
123
+ previousTime = System.nanoTime();
124
+ emit(1, from);
125
+ if (!active || disposed) return;
126
+ update(0); Choreographer.getInstance().postFrameCallback(this);
127
+ }
128
+ @Override public void doFrame(long time) {
129
+ if (!active || settling || disposed) return;
130
+ if (!list.isAttachedToWindow() || count != list.getCount() || width != list.getWidth() || height != list.getHeight()) { finish(false, 1); return; }
131
+ double dt = Math.min(.04, Math.max(0, (time - previousTime) / 1e9)); previousTime = time;
132
+ float edge = Math.min(edgeSize, list.getHeight() / 3f), direction = 0;
133
+ if (pointerY < list.getPaddingTop() + edge) direction = -Math.min(1, (list.getPaddingTop() + edge - pointerY) / edge);
134
+ else if (pointerY > list.getHeight() - list.getPaddingBottom() - edge) direction = Math.min(1, (pointerY - list.getHeight() + list.getPaddingBottom() + edge) / edge);
135
+ float distance = (float)(direction * edgeSpeed * dt) + remainder;
136
+ int pixels = (int)distance; remainder = distance - pixels;
137
+ if (pixels != 0) list.scrollListBy(pixels);
138
+ update(dt);
139
+ if (active) Choreographer.getInstance().postFrameCallback(this);
140
+ }
141
+ private void restore(View view, Cell state) { view.setTranslationY(state.translation); view.setAlpha(state.alpha); }
142
+ private void update(double dt) {
143
+ if (!active || settling) return;
144
+ float top = pointerY - grabOffset;
145
+ overlay.setTranslationY(top);
146
+ int first = list.getFirstVisiblePosition(), visible = list.getChildCount(), destination = from;
147
+ for (int offset = 0; offset < visible; offset++) {
148
+ int index = first + offset; if (index == from) continue;
149
+ View view = list.getChildAt(offset);
150
+ float midpoint = view.getTop() + view.getHeight() / 2f - (index > from ? rowHeight : 0);
151
+ int insertion = index - (index > from ? 1 : 0);
152
+ destination = insertion;
153
+ if (top < midpoint) break;
154
+ destination = insertion + 1;
155
+ }
156
+ target = Math.max(0, Math.min(count - 1, destination));
157
+ for (View view : new ArrayList<>(cells.keySet())) {
158
+ int index = list.getPositionForView(view);
159
+ Cell state = cells.get(view);
160
+ if (index < first || index >= first + visible || index != state.index) { restore(view, state); cells.remove(view); }
161
+ }
162
+ for (int offset = 0; offset < visible; offset++) {
163
+ int index = first + offset; View view = list.getChildAt(offset);
164
+ Cell state = cells.get(view);
165
+ if (state == null) { state = new Cell(view, index); cells.put(view, state); }
166
+ float displacement = index > from && index <= target ? -rowHeight : index < from && index >= target ? rowHeight : 0;
167
+ if (reduced) { state.spring.position = displacement; state.spring.velocity = 0; }
168
+ else state.spring.advance(displacement, 360, 34, 1, dt);
169
+ view.setTranslationY(state.translation + (float)state.spring.position);
170
+ view.setAlpha(index == from ? 0 : state.alpha);
171
+ }
172
+ }
173
+ private void drop() {
174
+ if (!active || settling) return;
175
+ settling = true; Choreographer.getInstance().removeFrameCallback(this);
176
+ View destination = list.getChildAt(target - list.getFirstVisiblePosition());
177
+ float end = destination == null ? overlay.getTranslationY() : target > from ? destination.getBottom() - bitmap.getHeight() : destination.getTop();
178
+ if (reduced) { finish(true, 0); return; }
179
+ final int ticket = generation;
180
+ drop = ValueAnimator.ofFloat(overlay.getTranslationY(), end); drop.setDuration(180);
181
+ drop.addUpdateListener(animation -> { if (overlay != null) overlay.setTranslationY((float)animation.getAnimatedValue()); });
182
+ drop.addListener(new AnimatorListenerAdapter() {
183
+ @Override public void onAnimationEnd(Animator animation) { if (active && generation == ticket) finish(true, 0); }
184
+ });
185
+ drop.start();
186
+ }
187
+ private void finish(boolean commit, int detail) {
188
+ if (!active) return;
189
+ active = false; settling = false; generation++;
190
+ Choreographer.getInstance().removeFrameCallback(this);
191
+ if (drop != null) { ValueAnimator previous = drop; drop = null; previous.cancel(); }
192
+ if (overlay != null) { list.getOverlay().remove(overlay); overlay.setImageDrawable(null); overlay = null; }
193
+ if (bitmap != null) { bitmap.recycle(); bitmap = null; }
194
+ for (View view : new ArrayList<>(cells.keySet())) restore(view, cells.get(view));
195
+ cells.clear();
196
+ if (surface.getParent() != null) surface.getParent().requestDisallowInterceptTouchEvent(false);
197
+ emit(commit ? 2 : 3, commit ? target : detail);
198
+ }
199
+ public void cancel() { clearPending(); finish(false, 0); }
200
+ public void setEnabled(boolean value) { enabled = value; if (!value) cancel(); }
201
+ public void setReducedMotion(boolean value) { reduced = value; }
202
+ @Override public void onLayoutChange(View view, int l, int t, int r, int b, int ol, int ot, int or, int ob) {
203
+ if (active && (r - l != width || b - t != height)) finish(false, 1);
204
+ }
205
+ @Override public void onViewDetachedFromWindow(View view) { cancel(); }
206
+ @Override public void onViewAttachedToWindow(View view) {}
207
+ public void dispose() {
208
+ if (disposed) return;
209
+ cancel(); disposed = true; surface.setSession(null);
210
+ list.removeOnLayoutChangeListener(this); list.removeOnAttachStateChangeListener(this);
211
+ handles.clear();
212
+ }
213
+ }
@@ -0,0 +1,27 @@
1
+ package org.rafaelaugusto.jolt;
2
+
3
+ import android.content.Context;
4
+ import android.graphics.Rect;
5
+ import android.view.MotionEvent;
6
+
7
+ /** Capture input above recycled cells without replacing any Core touch listener. */
8
+ public final class ReorderSurface extends org.nativescript.widgets.GridLayout {
9
+ private ReorderSession session;
10
+ public ReorderSurface(Context context) { super(context); }
11
+ void setSession(ReorderSession value) { session = value; }
12
+ @Override public boolean dispatchTouchEvent(MotionEvent event) {
13
+ ReorderSession current = session;
14
+ if (current != null) {
15
+ Rect rect = new Rect(); current.list.getDrawingRect(rect);
16
+ offsetDescendantRectToMyCoords(current.list, rect);
17
+ MotionEvent local = MotionEvent.obtain(event); local.offsetLocation(-rect.left, -rect.top);
18
+ current.onTouch(current.list, local); local.recycle();
19
+ }
20
+ return super.dispatchTouchEvent(event) || current != null;
21
+ }
22
+ @Override public boolean onInterceptTouchEvent(MotionEvent event) {
23
+ return session != null && session.isActive() || super.onInterceptTouchEvent(event);
24
+ }
25
+ @Override public boolean onTouchEvent(MotionEvent event) { return session != null || super.onTouchEvent(event); }
26
+ @Override protected void onDetachedFromWindow() { if (session != null) session.cancel(); super.onDetachedFromWindow(); }
27
+ }
@@ -0,0 +1,84 @@
1
+ package org.rafaelaugusto.jolt;
2
+
3
+ import android.view.View;
4
+ import android.view.ViewTreeObserver;
5
+ import android.widget.ListView;
6
+ import android.widget.TextView;
7
+ import org.json.JSONObject;
8
+
9
+ /** Native ListView input; does not replace Core's adapter, item listener or scroll listener. */
10
+ public final class ScrollHeader implements ViewTreeObserver.OnScrollChangedListener, View.OnLayoutChangeListener {
11
+ public interface Listener { void changed(); }
12
+ private static int active;
13
+ public static int activeCount(){return active;}
14
+ private final ListView list;
15
+ private LiveSpring node;
16
+ private Listener listener;
17
+ private final View title, toolbarTitle, toolbar;
18
+ private final TextView diagnostic;
19
+ private final int titleAccessibility, toolbarAccessibility;
20
+ private final int toolbarVisibility;
21
+ private final float density;
22
+ private ViewTreeObserver observer;
23
+ private boolean enabled, disposed;
24
+ private double handoff, minimumOffset, maximumOffset, fadeStart, range, spacer, rowHeight, offset=Double.NaN;
25
+ private int phase=-1, updates, callbacks;
26
+ public ScrollHeader(ListView list, LiveSpring node, View title, View toolbarTitle, View toolbar, View diagnostic, String options, Listener listener) {
27
+ this.list=list;this.node=node;this.title=title;this.toolbarTitle=toolbarTitle;this.toolbar=toolbar;this.listener=listener;
28
+ this.diagnostic=diagnostic instanceof TextView?(TextView)diagnostic:null;
29
+ density=list.getResources().getDisplayMetrics().density;
30
+ titleAccessibility=title.getImportantForAccessibility();toolbarAccessibility=toolbarTitle.getImportantForAccessibility();toolbarVisibility=toolbar.getVisibility();
31
+ configure(options);setEnabled(true);
32
+ }
33
+ public void configure(String options) {
34
+ try {JSONObject c=new JSONObject(options);handoff=c.getDouble("handoff");range=c.getDouble("range");spacer=c.getDouble("spacer");rowHeight=c.getDouble("rowHeight");fadeStart=c.getJSONArray("toolbarFade").getDouble(0)*range;}
35
+ catch(Exception error){throw new IllegalArgumentException(error);}
36
+ if(enabled)update(true);
37
+ }
38
+ public void setEnabled(boolean value) {
39
+ if(disposed || enabled==value)return;
40
+ enabled=value;
41
+ if(value){observer=list.getViewTreeObserver();observer.addOnScrollChangedListener(this);list.addOnLayoutChangeListener(this);active++;update(true);}
42
+ else{if(observer!=null && observer.isAlive())observer.removeOnScrollChangedListener(this);observer=null;list.removeOnLayoutChangeListener(this);active--;}
43
+ }
44
+ @Override public void onScrollChanged(){update(false);}
45
+ @Override public void onLayoutChange(View view,int l,int t,int r,int b,int ol,int ot,int or,int ob){update(true);}
46
+ private double current() {
47
+ View child=list.getChildAt(0);if(child==null)return 0;
48
+ int first=list.getFirstVisiblePosition();double divider=list.getDividerHeight()/density;
49
+ return (first==0?0:spacer+divider+(first-1)*(rowHeight+divider))+(list.getPaddingTop()-child.getTop())/density;
50
+ }
51
+ private void update(boolean force) {
52
+ if(disposed)return;
53
+ double next=current();if(!force && Math.abs(next-offset)<.001)return;
54
+ offset=next;minimumOffset=Math.min(minimumOffset,offset);maximumOffset=Math.max(maximumOffset,offset);updates++;node.setTarget(offset);
55
+ boolean compact=offset>=range*handoff;
56
+ title.setImportantForAccessibility(compact?View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS:titleAccessibility);
57
+ toolbarTitle.setImportantForAccessibility(compact?toolbarAccessibility:View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
58
+ toolbar.setVisibility(offset > fadeStart ? toolbarVisibility : View.INVISIBLE);
59
+ int nextPhase=offset<=.5?0:offset>=range-.5?2:1;
60
+ if(nextPhase!=phase){phase=nextPhase;callbacks++;if(listener!=null)listener.changed();}
61
+ if(diagnostic!=null)diagnostic.setText(String.format(java.util.Locale.US,"y %.0f · range %.0f · native %d · JS %d",offset,range,updates,callbacks));
62
+ }
63
+ public String snapshot() {
64
+ try {return new JSONObject().put("minimumOffset",minimumOffset).put("maximumOffset",maximumOffset).put("offset",Double.isFinite(offset)?offset:0).put("phase",new String[]{"expanded","between","collapsed"}[Math.max(0,phase)])
65
+ .put("updates",updates).put("callbacks",callbacks).put("first",list.getFirstVisiblePosition()).put("visible",list.getChildCount()).put("total",list.getCount()).toString();}
66
+ catch(Exception error){throw new IllegalStateException(error);}
67
+ }
68
+ public void scroll(double target,boolean animated) {
69
+ if(disposed || !Double.isFinite(target))return;
70
+ target=Math.max(0,target);
71
+ if(animated){list.smoothScrollBy((int)Math.round((target-current())*density),300);return;}
72
+ double divider=list.getDividerHeight()/density, stride=rowHeight+divider;
73
+ int index=target<spacer+divider?0:1+(int)Math.floor((target-spacer-divider)/stride);
74
+ index=Math.max(0,Math.min(list.getCount()-1,index));
75
+ double start=index==0?0:spacer+divider+(index-1)*stride;
76
+ list.setSelectionFromTop(index,(int)Math.round((start-target)*density));
77
+ list.post(new Runnable(){public void run(){if(!disposed)update(true);}});
78
+ }
79
+ public void dispose() {
80
+ if(disposed)return;setEnabled(false);disposed=true;
81
+ title.setImportantForAccessibility(titleAccessibility);toolbarTitle.setImportantForAccessibility(toolbarAccessibility);toolbar.setVisibility(toolbarVisibility);
82
+ node=null;listener=null;
83
+ }
84
+ }
@@ -0,0 +1,28 @@
1
+ package org.rafaelaugusto.jolt;
2
+ /** Pure math shared by hardware and explicit test-input playback. Hamilton quaternions xyzw. */
3
+ public final class SensorMath {
4
+ private SensorMath() {}
5
+ public static boolean normalize(double[] q) {
6
+ double length=0;
7
+ for(double v:q) { if(!Double.isFinite(v)) return false; length+=v*v; }
8
+ length=Math.sqrt(length);
9
+ if(!Double.isFinite(length)||length<1e-8) return false;
10
+ for(int i=0;i<4;i++) q[i]/=length;
11
+ return true;
12
+ }
13
+ public static double[] multiply(double[] a,double[] b) {
14
+ return new double[]{a[3]*b[0]+a[0]*b[3]+a[1]*b[2]-a[2]*b[1], a[3]*b[1]-a[0]*b[2]+a[1]*b[3]+a[2]*b[0], a[3]*b[2]+a[0]*b[1]-a[1]*b[0]+a[2]*b[3], a[3]*b[3]-a[0]*b[0]-a[1]*b[1]-a[2]*b[2]};
15
+ }
16
+ public static double[] inverse(double[] q) {return new double[]{-q[0],-q[1],-q[2],q[3]};}
17
+ public static double[] vector(double[] v,double degrees) {
18
+ double a=degrees*Math.PI/180,c=Math.cos(a),s=Math.sin(a);
19
+ return new double[]{c*v[0]+s*v[1],-s*v[0]+c*v[1],v[2]};
20
+ }
21
+ public static double[] rotation(double[] q,double degrees,double[] previous) {
22
+ double[] v=vector(q,degrees), r={v[0],v[1],v[2],q[3]};
23
+ double dot=0;for(int i=0;i<4;i++)dot+=r[i]*previous[i];
24
+ if(dot<0)for(int i=0;i<4;i++)r[i]=-r[i];
25
+ double x=r[0],y=r[1],z=r[2],w=r[3];
26
+ return new double[]{Math.atan2(2*(w*x+y*z),1-2*(x*x+y*y)),Math.asin(Math.max(-1,Math.min(1,2*(w*y-z*x)))),Math.atan2(2*(w*z+x*y),1-2*(y*y+z*z)),x,y,z,w};
27
+ }
28
+ }