@amazon-devices/react-native-safe-area-context 2.0.9000000000 → 8.0.9000000000-rn-83

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 (259) hide show
  1. package/README.md +6 -302
  2. package/SystemBundles/{85c8d24b7f717b77a2deb00e32cc2aaa293a5a16c46eecebca21e95bda425730.bundle → 920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.bundle} +6447 -9418
  3. package/SystemBundles/920f0b3a0c43cc93db1621b4c3a47e06a0d4ed32175c793e9934ad9c764fbc25.map +2780 -0
  4. package/SystemModules/amzn__react-native-safe-area-context-8.modules.txt +7 -0
  5. package/SystemModules/amzn__react-native-safe-area-context-8.private.modules.txt +61 -0
  6. package/SystemModules/keplerscript-system-bundle-config.json +3 -3
  7. package/android/build.gradle +103 -25
  8. package/android/gradle.properties +1 -0
  9. package/android/spotless.gradle +24 -0
  10. package/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +25 -0
  11. package/android/src/fabric/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +14 -0
  12. package/android/src/main/AndroidManifest.xml +1 -2
  13. package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.kt +3 -0
  14. package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.kt +3 -0
  15. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextModule.kt +32 -0
  16. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt +41 -0
  17. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.kt +47 -0
  18. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt +41 -0
  19. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt +102 -0
  20. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt +155 -0
  21. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt +16 -0
  22. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.kt +7 -0
  23. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt +73 -0
  24. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt +6 -0
  25. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt +170 -0
  26. package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt +39 -0
  27. package/android/src/main/jni/CMakeLists.txt +87 -0
  28. package/android/src/main/jni/safeareacontext.h +17 -0
  29. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +31 -0
  30. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +16 -0
  31. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +41 -0
  32. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
  33. package/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +29 -0
  34. package/android/src/paper/java/com/th3rdwave/safeareacontext/NativeSafeAreaContextSpec.java +56 -0
  35. package/android/src/paper/java/com/th3rdwave/safeareacontext/UIManagerHelperCompat.kt +20 -0
  36. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h +25 -0
  37. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.cpp +131 -0
  38. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.h +36 -0
  39. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.cpp +23 -0
  40. package/common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.h +56 -0
  41. package/ios/Fabric/RNCSafeAreaProviderComponentView.h +13 -0
  42. package/ios/Fabric/RNCSafeAreaProviderComponentView.mm +129 -0
  43. package/ios/Fabric/RNCSafeAreaViewComponentView.h +11 -0
  44. package/ios/Fabric/RNCSafeAreaViewComponentView.mm +153 -0
  45. package/ios/RNCSafeAreaContext.h +9 -0
  46. package/ios/RNCSafeAreaContext.mm +85 -0
  47. package/ios/{SafeAreaView/RNCSafeAreaProvider.h → RNCSafeAreaProvider.h} +4 -0
  48. package/ios/RNCSafeAreaProvider.m +102 -0
  49. package/ios/RNCSafeAreaProviderManager.m +20 -0
  50. package/ios/{SafeAreaView/RNCSafeAreaShadowView.m → RNCSafeAreaShadowView.m} +50 -36
  51. package/ios/RNCSafeAreaUtils.h +22 -0
  52. package/ios/RNCSafeAreaUtils.m +41 -0
  53. package/ios/{SafeAreaView/RNCSafeAreaView.h → RNCSafeAreaView.h} +8 -4
  54. package/ios/RNCSafeAreaView.m +168 -0
  55. package/ios/RNCSafeAreaViewEdgeMode.h +12 -0
  56. package/ios/RNCSafeAreaViewEdgeMode.m +16 -0
  57. package/ios/RNCSafeAreaViewEdges.h +15 -0
  58. package/ios/RNCSafeAreaViewEdges.m +36 -0
  59. package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.h → RNCSafeAreaViewLocalData.h} +12 -1
  60. package/ios/{SafeAreaView/RNCSafeAreaViewLocalData.m → RNCSafeAreaViewLocalData.m} +4 -0
  61. package/ios/{SafeAreaView/RNCSafeAreaViewManager.m → RNCSafeAreaViewManager.m} +5 -1
  62. package/ios/RNCSafeAreaViewMode.m +15 -0
  63. package/ios/{SafeAreaView.xcodeproj → RNSafeAreaContext.xcodeproj}/project.pbxproj +70 -56
  64. package/jest/mock.tsx +59 -0
  65. package/kepler-compatibility.json +2 -2
  66. package/lib/commonjs/CompatNativeSafeAreaProvider.js +6 -6
  67. package/lib/commonjs/CompatNativeSafeAreaProvider.js.map +1 -1
  68. package/lib/commonjs/InitialWindow.js.map +1 -1
  69. package/lib/commonjs/InitialWindow.kepler.js +1 -1
  70. package/lib/commonjs/InitialWindow.kepler.js.map +1 -1
  71. package/lib/commonjs/InitialWindow.native.js +4 -4
  72. package/lib/commonjs/InitialWindow.native.js.map +1 -1
  73. package/lib/commonjs/NativeSafeAreaProvider.js +7 -124
  74. package/lib/commonjs/NativeSafeAreaProvider.js.map +1 -1
  75. package/lib/commonjs/NativeSafeAreaProvider.kepler.js +6 -2
  76. package/lib/commonjs/NativeSafeAreaProvider.kepler.js.map +1 -1
  77. package/lib/commonjs/NativeSafeAreaProvider.web.js +135 -0
  78. package/lib/commonjs/NativeSafeAreaProvider.web.js.map +1 -0
  79. package/lib/commonjs/NativeSafeAreaProvider.windows.js +6 -2
  80. package/lib/commonjs/NativeSafeAreaProvider.windows.js.map +1 -1
  81. package/lib/commonjs/SafeArea.types.js.map +1 -1
  82. package/lib/commonjs/SafeAreaContext.js +55 -34
  83. package/lib/commonjs/SafeAreaContext.js.map +1 -1
  84. package/lib/commonjs/SafeAreaView.js +39 -71
  85. package/lib/commonjs/SafeAreaView.js.map +1 -1
  86. package/lib/commonjs/SafeAreaView.kepler.js.map +1 -1
  87. package/lib/commonjs/SafeAreaView.web.js +91 -0
  88. package/lib/commonjs/SafeAreaView.web.js.map +1 -0
  89. package/lib/commonjs/SafeAreaView.windows.js.map +1 -1
  90. package/lib/commonjs/index.js +1 -0
  91. package/lib/commonjs/index.js.map +1 -1
  92. package/lib/commonjs/package.json +1 -0
  93. package/lib/commonjs/specs/NativeSafeAreaContext.js +9 -0
  94. package/lib/commonjs/specs/NativeSafeAreaContext.js.map +1 -0
  95. package/lib/commonjs/specs/NativeSafeAreaProvider.js +10 -0
  96. package/lib/commonjs/specs/NativeSafeAreaProvider.js.map +1 -0
  97. package/lib/commonjs/specs/NativeSafeAreaView.js +12 -0
  98. package/lib/commonjs/specs/NativeSafeAreaView.js.map +1 -0
  99. package/lib/module/CompatNativeSafeAreaProvider.js +8 -5
  100. package/lib/module/CompatNativeSafeAreaProvider.js.map +1 -1
  101. package/lib/module/InitialWindow.js +2 -0
  102. package/lib/module/InitialWindow.js.map +1 -1
  103. package/lib/module/InitialWindow.kepler.js +3 -1
  104. package/lib/module/InitialWindow.kepler.js.map +1 -1
  105. package/lib/module/InitialWindow.native.js +5 -4
  106. package/lib/module/InitialWindow.native.js.map +1 -1
  107. package/lib/module/NativeSafeAreaProvider.js +3 -122
  108. package/lib/module/NativeSafeAreaProvider.js.map +1 -1
  109. package/lib/module/NativeSafeAreaProvider.kepler.js +3 -2
  110. package/lib/module/NativeSafeAreaProvider.kepler.js.map +1 -1
  111. package/lib/module/NativeSafeAreaProvider.web.js +130 -0
  112. package/lib/module/NativeSafeAreaProvider.web.js.map +1 -0
  113. package/lib/module/NativeSafeAreaProvider.windows.js +3 -2
  114. package/lib/module/NativeSafeAreaProvider.windows.js.map +1 -1
  115. package/lib/module/SafeArea.types.js +2 -0
  116. package/lib/module/SafeArea.types.js.map +1 -1
  117. package/lib/module/SafeAreaContext.js +57 -33
  118. package/lib/module/SafeAreaContext.js.map +1 -1
  119. package/lib/module/SafeAreaView.js +38 -69
  120. package/lib/module/SafeAreaView.js.map +1 -1
  121. package/lib/module/SafeAreaView.kepler.js +2 -0
  122. package/lib/module/SafeAreaView.kepler.js.map +1 -1
  123. package/lib/module/SafeAreaView.web.js +86 -0
  124. package/lib/module/SafeAreaView.web.js.map +1 -0
  125. package/lib/module/SafeAreaView.windows.js +2 -0
  126. package/lib/module/SafeAreaView.windows.js.map +1 -1
  127. package/lib/module/index.js +3 -0
  128. package/lib/module/index.js.map +1 -1
  129. package/lib/module/specs/NativeSafeAreaContext.js +5 -0
  130. package/lib/module/specs/NativeSafeAreaContext.js.map +1 -0
  131. package/lib/module/specs/NativeSafeAreaProvider.js +5 -0
  132. package/lib/module/specs/NativeSafeAreaProvider.js.map +1 -0
  133. package/lib/module/specs/NativeSafeAreaView.js +7 -0
  134. package/lib/module/specs/NativeSafeAreaView.js.map +1 -0
  135. package/lib/typescript/CompatNativeSafeAreaProvider.d.ts +4 -0
  136. package/lib/typescript/CompatNativeSafeAreaProvider.d.ts.map +1 -0
  137. package/lib/typescript/{src/InitialWindow.d.ts → InitialWindow.d.ts} +2 -1
  138. package/lib/typescript/InitialWindow.d.ts.map +1 -0
  139. package/lib/typescript/{src/InitialWindow.kepler.d.ts → InitialWindow.kepler.d.ts} +1 -0
  140. package/lib/typescript/InitialWindow.kepler.d.ts.map +1 -0
  141. package/lib/typescript/{src/InitialWindow.native.d.ts → InitialWindow.native.d.ts} +2 -1
  142. package/lib/typescript/InitialWindow.native.d.ts.map +1 -0
  143. package/lib/typescript/NativeSafeAreaProvider.d.ts +3 -0
  144. package/lib/typescript/NativeSafeAreaProvider.d.ts.map +1 -0
  145. package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts +2 -0
  146. package/lib/typescript/NativeSafeAreaProvider.kepler.d.ts.map +1 -0
  147. package/lib/typescript/NativeSafeAreaProvider.web.d.ts +4 -0
  148. package/lib/typescript/NativeSafeAreaProvider.web.d.ts.map +1 -0
  149. package/lib/typescript/NativeSafeAreaProvider.windows.d.ts +2 -0
  150. package/lib/typescript/NativeSafeAreaProvider.windows.d.ts.map +1 -0
  151. package/lib/typescript/SafeArea.types.d.ts +36 -0
  152. package/lib/typescript/SafeArea.types.d.ts.map +1 -0
  153. package/lib/typescript/{src/SafeAreaContext.d.ts → SafeAreaContext.d.ts} +9 -6
  154. package/lib/typescript/SafeAreaContext.d.ts.map +1 -0
  155. package/lib/typescript/SafeAreaView.d.ts +5 -0
  156. package/lib/typescript/SafeAreaView.d.ts.map +1 -0
  157. package/lib/typescript/{src/SafeAreaView.kepler.d.ts → SafeAreaView.kepler.d.ts} +1 -0
  158. package/lib/typescript/SafeAreaView.kepler.d.ts.map +1 -0
  159. package/lib/typescript/SafeAreaView.web.d.ts +4 -0
  160. package/lib/typescript/SafeAreaView.web.d.ts.map +1 -0
  161. package/lib/typescript/SafeAreaView.windows.d.ts +3 -0
  162. package/lib/typescript/SafeAreaView.windows.d.ts.map +1 -0
  163. package/lib/typescript/{src/index.d.ts → index.d.ts} +1 -0
  164. package/lib/typescript/index.d.ts.map +1 -0
  165. package/lib/typescript/specs/NativeSafeAreaContext.d.ts +23 -0
  166. package/lib/typescript/specs/NativeSafeAreaContext.d.ts.map +1 -0
  167. package/lib/typescript/specs/NativeSafeAreaProvider.d.ts +22 -0
  168. package/lib/typescript/specs/NativeSafeAreaProvider.d.ts.map +1 -0
  169. package/lib/typescript/specs/NativeSafeAreaView.d.ts +14 -0
  170. package/lib/typescript/specs/NativeSafeAreaView.d.ts.map +1 -0
  171. package/oss-attribution/attribution.txt +0 -0
  172. package/oss-attribution/licenseInfos.json +1 -0
  173. package/package.json +137 -1
  174. package/react-native-safe-area-context.podspec +26 -4
  175. package/react-native.config.js +8 -0
  176. package/src/CompatNativeSafeAreaProvider.tsx +2 -3
  177. package/src/InitialWindow.kepler.ts +1 -1
  178. package/src/InitialWindow.native.ts +5 -11
  179. package/src/InitialWindow.ts +1 -1
  180. package/src/NativeSafeAreaProvider.kepler.tsx +1 -3
  181. package/src/NativeSafeAreaProvider.tsx +2 -128
  182. package/src/NativeSafeAreaProvider.web.tsx +127 -0
  183. package/src/NativeSafeAreaProvider.windows.tsx +1 -3
  184. package/src/SafeArea.types.ts +15 -11
  185. package/src/SafeAreaContext.tsx +66 -43
  186. package/src/SafeAreaView.tsx +47 -82
  187. package/src/SafeAreaView.web.tsx +123 -0
  188. package/src/SafeAreaView.windows.tsx +2 -1
  189. package/src/index.tsx +2 -0
  190. package/src/specs/NativeSafeAreaContext.ts +23 -0
  191. package/src/specs/NativeSafeAreaProvider.ts +29 -0
  192. package/src/specs/NativeSafeAreaView.ts +17 -0
  193. package/SystemBundles/85c8d24b7f717b77a2deb00e32cc2aaa293a5a16c46eecebca21e95bda425730.map +0 -4335
  194. package/SystemModules/amzn__react-native-safe-area-context-2.modules.txt +0 -55
  195. package/SystemModules/amzn__react-native-safe-area-context-2.private.modules.txt +0 -90
  196. package/THIRD_PARTY_NOTICES.txt +0 -24
  197. package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.java +0 -22
  198. package/android/src/main/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.java +0 -33
  199. package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.java +0 -22
  200. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.java +0 -31
  201. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.java +0 -66
  202. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.java +0 -94
  203. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java +0 -82
  204. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.java +0 -159
  205. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.java +0 -8
  206. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.java +0 -27
  207. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.java +0 -72
  208. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.java +0 -6
  209. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.java +0 -201
  210. package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.java +0 -52
  211. package/ios/SafeAreaView/RCTView+SafeAreaCompat.h +0 -16
  212. package/ios/SafeAreaView/RCTView+SafeAreaCompat.m +0 -57
  213. package/ios/SafeAreaView/RNCSafeAreaProvider.m +0 -65
  214. package/ios/SafeAreaView/RNCSafeAreaProviderManager.m +0 -61
  215. package/ios/SafeAreaView/RNCSafeAreaView.m +0 -118
  216. package/ios/SafeAreaView/RNCSafeAreaViewEdges.h +0 -9
  217. package/ios/SafeAreaView/RNCSafeAreaViewEdges.m +0 -13
  218. package/ios/SafeAreaView/RNCSafeAreaViewMode.m +0 -11
  219. package/lib/commonjs/NativeSafeAreaProvider.macos.js +0 -9
  220. package/lib/commonjs/NativeSafeAreaProvider.macos.js.map +0 -1
  221. package/lib/commonjs/NativeSafeAreaProvider.native.js +0 -9
  222. package/lib/commonjs/NativeSafeAreaProvider.native.js.map +0 -1
  223. package/lib/commonjs/SafeAreaView.macos.js +0 -9
  224. package/lib/commonjs/SafeAreaView.macos.js.map +0 -1
  225. package/lib/commonjs/SafeAreaView.native.js +0 -9
  226. package/lib/commonjs/SafeAreaView.native.js.map +0 -1
  227. package/lib/commonjs/useWindowDimensions.js +0 -32
  228. package/lib/commonjs/useWindowDimensions.js.map +0 -1
  229. package/lib/module/NativeSafeAreaProvider.macos.js +0 -3
  230. package/lib/module/NativeSafeAreaProvider.macos.js.map +0 -1
  231. package/lib/module/NativeSafeAreaProvider.native.js +0 -3
  232. package/lib/module/NativeSafeAreaProvider.native.js.map +0 -1
  233. package/lib/module/SafeAreaView.macos.js +0 -3
  234. package/lib/module/SafeAreaView.macos.js.map +0 -1
  235. package/lib/module/SafeAreaView.native.js +0 -3
  236. package/lib/module/SafeAreaView.native.js.map +0 -1
  237. package/lib/module/useWindowDimensions.js +0 -26
  238. package/lib/module/useWindowDimensions.js.map +0 -1
  239. package/lib/typescript/src/CompatNativeSafeAreaProvider.d.ts +0 -2
  240. package/lib/typescript/src/NativeSafeAreaProvider.d.ts +0 -2
  241. package/lib/typescript/src/NativeSafeAreaProvider.kepler.d.ts +0 -2
  242. package/lib/typescript/src/NativeSafeAreaProvider.macos.d.ts +0 -2
  243. package/lib/typescript/src/NativeSafeAreaProvider.native.d.ts +0 -3
  244. package/lib/typescript/src/NativeSafeAreaProvider.windows.d.ts +0 -2
  245. package/lib/typescript/src/SafeArea.types.d.ts +0 -31
  246. package/lib/typescript/src/SafeAreaView.d.ts +0 -2
  247. package/lib/typescript/src/SafeAreaView.macos.d.ts +0 -2
  248. package/lib/typescript/src/SafeAreaView.native.d.ts +0 -2
  249. package/lib/typescript/src/SafeAreaView.windows.d.ts +0 -2
  250. package/lib/typescript/src/useWindowDimensions.d.ts +0 -8
  251. package/src/NativeSafeAreaProvider.macos.tsx +0 -3
  252. package/src/NativeSafeAreaProvider.native.tsx +0 -6
  253. package/src/SafeAreaView.macos.tsx +0 -3
  254. package/src/SafeAreaView.native.tsx +0 -6
  255. package/src/useWindowDimensions.tsx +0 -35
  256. /package/ios/{SafeAreaView/RNCSafeAreaProviderManager.h → RNCSafeAreaProviderManager.h} +0 -0
  257. /package/ios/{SafeAreaView/RNCSafeAreaShadowView.h → RNCSafeAreaShadowView.h} +0 -0
  258. /package/ios/{SafeAreaView/RNCSafeAreaViewManager.h → RNCSafeAreaViewManager.h} +0 -0
  259. /package/ios/{SafeAreaView/RNCSafeAreaViewMode.h → RNCSafeAreaViewMode.h} +0 -0
@@ -0,0 +1,7 @@
1
+ node_modules/@amzn/react-native-safe-area-context_8/src/index.tsx:c25a27cb01192a3d04d2
2
+ node_modules/@amzn/react-native-safe-area-context_8/src/SafeAreaContext.tsx:bcc69f32eace8df4d1e5
3
+ node_modules/@amzn/react-native-safe-area-context_8/src/NativeSafeAreaProvider.kepler.tsx:df333727bf7ff8d266ce
4
+ node_modules/@amzn/react-native-safe-area-context_8/src/CompatNativeSafeAreaProvider.tsx:52180f6235afa9c87b22
5
+ node_modules/@amzn/react-native-safe-area-context_8/src/SafeAreaView.kepler.tsx:222e31d785e6b1e5f59d
6
+ node_modules/@amzn/react-native-safe-area-context_8/src/InitialWindow.kepler.ts:429ddd8db312982259d0
7
+ node_modules/@amzn/react-native-safe-area-context_8/src/SafeArea.types.ts:0ebabeac96a28372b0cb
@@ -0,0 +1,61 @@
1
+ node_modules/@babel/runtime_7.29.2/helpers/interopRequireDefault.js:d3b57c8ff490ba8c7c47
2
+ node_modules/@babel/runtime_7.29.2/helpers/slicedToArray.js:8972a767e9133b0e3a28
3
+ node_modules/@babel/runtime_7.29.2/helpers/arrayWithHoles.js:ee99881fa9643e7bd96f
4
+ node_modules/@babel/runtime_7.29.2/helpers/iterableToArrayLimit.js:1847ec9d510321afd855
5
+ node_modules/@babel/runtime_7.29.2/helpers/unsupportedIterableToArray.js:0c30490eff100ca51d7c
6
+ node_modules/@babel/runtime_7.29.2/helpers/arrayLikeToArray.js:93f664c5afc3b3c0ffb9
7
+ node_modules/@babel/runtime_7.29.2/helpers/nonIterableRest.js:9ef80b625777ecb8d705
8
+ node_modules/@babel/runtime_7.29.2/helpers/classCallCheck.js:2bfb5e99807ec81b822f
9
+ node_modules/@babel/runtime_7.29.2/helpers/createClass.js:cc42269051bc9ff17a63
10
+ node_modules/@babel/runtime_7.29.2/helpers/toPropertyKey.js:7519d1b9ea0de500d604
11
+ node_modules/@babel/runtime_7.29.2/helpers/toPrimitive.js:6c47e04d255cdfb1533c
12
+ node_modules/@babel/runtime_7.29.2/helpers/typeof.js:7b6247ce00695d888c36
13
+ node_modules/@babel/runtime_7.29.2/helpers/possibleConstructorReturn.js:80a4a0ee188e065108c9
14
+ node_modules/@babel/runtime_7.29.2/helpers/assertThisInitialized.js:7a9699b26019ae7270f5
15
+ node_modules/@babel/runtime_7.29.2/helpers/getPrototypeOf.js:9c829ff5032996ffdc8e
16
+ node_modules/@babel/runtime_7.29.2/helpers/get.js:659b028086c2c6f074a3
17
+ node_modules/@babel/runtime_7.29.2/helpers/superPropBase.js:263943b885b53437e9e0
18
+ node_modules/@babel/runtime_7.29.2/helpers/inherits.js:3ebfecb28bc5857801a2
19
+ node_modules/@babel/runtime_7.29.2/helpers/setPrototypeOf.js:ea37d1dec222e5845b2b
20
+ node_modules/@babel/runtime_7.29.2/helpers/classPrivateFieldLooseBase.js:8e4a72d63eec1bceb909
21
+ node_modules/@babel/runtime_7.29.2/helpers/classPrivateFieldLooseKey.js:3998b40f87a7681fa397
22
+ node_modules/invariant_2.2.4/browser.js:fd099686726b2dfb6f66
23
+ node_modules/@react-native/normalize-colors_0.83.0/index.js:e8e087936fed8afe0814
24
+ node_modules/@babel/runtime_7.29.2/helpers/objectWithoutProperties.js:54be67f13f7547a51521
25
+ node_modules/@babel/runtime_7.29.2/helpers/objectWithoutPropertiesLoose.js:ae112a2672a8a53f82e5
26
+ node_modules/nullthrows_1.1.1/nullthrows.js:afd4874b36ccd4e13961
27
+ node_modules/@react-native/assets-registry_0.83.0/registry.js:5ff9e23a9ba5a1a1e0ac
28
+ node_modules/@react-native/assets-registry_0.83.0/path-support.js:fb4eb45d6b2fc494317c
29
+ node_modules/@babel/runtime_7.29.2/helpers/wrapNativeSuper.js:b510ad86a9e18c7a79b6
30
+ node_modules/@babel/runtime_7.29.2/helpers/isNativeFunction.js:74c2adc9de6e582a35f1
31
+ node_modules/@babel/runtime_7.29.2/helpers/construct.js:d66ad0c399283f558869
32
+ node_modules/@babel/runtime_7.29.2/helpers/isNativeReflectConstruct.js:22840e4117f5dbcb3b06
33
+ node_modules/promise_8.3.0/setimmediate/es6-extensions.js:a7846fdeffeb1ebf6241
34
+ node_modules/promise_8.3.0/setimmediate/core.js:890f60fa94d3f6854a19
35
+ node_modules/promise_8.3.0/setimmediate/finally.js:15bc4ccb25fc2d0c4428
36
+ node_modules/stacktrace-parser_0.1.11/dist/stack-trace-parser.cjs.js:aa725aa4c0b37e1add33
37
+ node_modules/regenerator-runtime_0.13.11/runtime.js:af823d9710c534173a4d
38
+ node_modules/base64-js_1.5.1/index.js:71af70f51435e3e1b37b
39
+ node_modules/whatwg-fetch_3.6.20/dist/fetch.umd.js:ca4b0363146267ef3e77
40
+ node_modules/abort-controller_3.0.0/dist/abort-controller.js:ea8fcbd647aab1cfcdaa
41
+ node_modules/event-target-shim_5.0.1/dist/event-target-shim.js:2bd3f165b1ed6b916de7
42
+ node_modules/scheduler_0.27.0/index.native.js:ec9ec59f48073ee6e9f5
43
+ node_modules/scheduler_0.27.0/cjs/scheduler.native.production.js:d8f1930d0c79328207a3
44
+ node_modules/@babel/runtime_7.29.2/helpers/readOnlyError.js:b769be1a7481ccdab905
45
+ node_modules/@react-native/virtualized-lists_0.83.0/index.js:a7726730afdc356adbe4
46
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizeUtils.js:d0ff6d3d1f2c9580ab13
47
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizedList.js:8d139349672eea405ffb
48
+ node_modules/@react-native/virtualized-lists_0.83.0/Utilities/clamp.js:a78a6606e498a2fdbf2d
49
+ node_modules/@react-native/virtualized-lists_0.83.0/Utilities/infoLog.js:017b2813127d2e7f4d70
50
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/ChildListCollection.js:9c3630060e6e634bfb8b
51
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/FillRateHelper.js:c1e83141f045b25e26fc
52
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/ListMetricsAggregator.js:480fcd792bed2eb457f3
53
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/StateSafePureComponent.js:fd4823cbe6aa108a7d62
54
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/ViewabilityHelper.js:a44a41089be71f9f7b1e
55
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizedListCellRenderer.js:8aa7cf31c704a4a85db2
56
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizedListContext.js:4b89f56515b0628d3446
57
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizedListProps.js:516cf3cf4ecb4e256407
58
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/CellRenderMask.js:95aa36c0870d6d5cfdb1
59
+ node_modules/@react-native/virtualized-lists_0.83.0/Lists/VirtualizedSectionList.js:cb8631f113fda0d4a92c
60
+ node_modules/memoize-one_5.2.1/dist/memoize-one.cjs.js:d381691ed29bec5a2050
61
+ node_modules/@babel/runtime_7.29.2/helpers/asyncToGenerator.js:37d2d0df8e62891cc30d
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "@amzn/react-native-safe-area-context": {
3
- "nameOnDevice": "index.amzn__react-native-safe-area-context-2.hermes.bundle",
4
- "modulesPath": "amzn__react-native-safe-area-context-2.modules.txt",
5
- "privateModulesPath": "amzn__react-native-safe-area-context-2.private.modules.txt"
3
+ "nameOnDevice": "index.amzn__react-native-safe-area-context-8.hermes.bundle",
4
+ "modulesPath": "amzn__react-native-safe-area-context-8.modules.txt",
5
+ "privateModulesPath": "amzn__react-native-safe-area-context-8.private.modules.txt"
6
6
  }
7
7
  }
@@ -1,34 +1,110 @@
1
+ buildscript {
2
+ def kotlin_version = rootProject.ext.has('kotlinVersion') ? rootProject.ext.get('kotlinVersion') : project.properties['RNSAC_kotlinVersion']
3
+
4
+ repositories {
5
+ mavenCentral()
6
+ google()
7
+ }
8
+
9
+ dependencies {
10
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
11
+ classpath("com.android.tools.build:gradle:7.3.1")
12
+ classpath("com.diffplug.spotless:spotless-plugin-gradle:6.11.0")
13
+ }
14
+ }
15
+
16
+ if (project == rootProject) {
17
+ apply from: "spotless.gradle"
18
+ return
19
+ }
20
+
21
+
1
22
  def getExtOrDefault(name, defaultValue) {
2
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
23
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : defaultValue
3
24
  }
4
25
 
5
- buildscript {
6
- // The Android Gradle plugin is only required when opening the android folder stand-alone.
7
- // This avoids unnecessary downloads and potential conflicts when the library is included as a
8
- // module dependency in an application project.
9
- if (project == rootProject) {
10
- repositories {
11
- google()
12
- jcenter()
13
- }
14
- dependencies {
15
- classpath 'com.android.tools.build:gradle:4.1.2'
16
- }
17
- }
26
+ def isNewArchitectureEnabled() {
27
+ // To opt-in for the New Architecture, you can either:
28
+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
29
+ // - Invoke gradle with `-newArchEnabled=true`
30
+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
31
+ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
18
32
  }
19
33
 
20
34
  apply plugin: 'com.android.library'
35
+ apply plugin: 'kotlin-android'
36
+
37
+ if (isNewArchitectureEnabled()) {
38
+ apply plugin: "com.facebook.react"
39
+ }
21
40
 
22
41
  android {
23
- compileSdkVersion getExtOrDefault('compileSdkVersion', 28)
42
+ def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
43
+ if (agpVersion.tokenize('.')[0].toInteger() >= 7) {
44
+ namespace "com.th3rdwave.safeareacontext"
45
+ buildFeatures {
46
+ buildConfig true
47
+ }
48
+ }
49
+
50
+ compileSdkVersion getExtOrDefault('compileSdkVersion', 30)
51
+
52
+ // Used to override the NDK path/version on internal CI or by allowing
53
+ // users to customize the NDK path/version from their root project (e.g. for M1 support)
54
+ if (rootProject.hasProperty("ndkPath")) {
55
+ ndkPath rootProject.ext.ndkPath
56
+ }
57
+ if (rootProject.hasProperty("ndkVersion")) {
58
+ ndkVersion rootProject.ext.ndkVersion
59
+ }
60
+
61
+ defaultConfig {
62
+ minSdkVersion getExtOrDefault('minSdkVersion', 16)
63
+ targetSdkVersion getExtOrDefault('targetSdkVersion', 28)
64
+ versionCode 1
65
+ versionName "1.0"
66
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
67
+
68
+ ndk {
69
+ abiFilters (*reactNativeArchitectures())
70
+ }
71
+ }
24
72
 
25
- defaultConfig {
26
- minSdkVersion getExtOrDefault('minSdkVersion', 16)
27
- targetSdkVersion getExtOrDefault('targetSdkVersion', 28)
28
- }
29
- lintOptions{
30
- abortOnError false
31
- }
73
+ lintOptions{
74
+ abortOnError false
75
+ }
76
+
77
+ packagingOptions {
78
+ // For some reason gradle only complains about the duplicated version of libreact_render libraries
79
+ // while there are more libraries copied in intermediates folder of the lib build directory, we exclude
80
+ // only the ones that make the build fail (ideally we should only include libsafeareacontext_modules but we
81
+ // are only allowed to specify exclude patterns)
82
+ exclude "**/libreact_render*.so"
83
+ }
84
+ sourceSets.main {
85
+ java {
86
+ if (isNewArchitectureEnabled()) {
87
+ srcDirs += [
88
+ "src/fabric/java",
89
+ "${project.buildDir}/generated/source/codegen/java"
90
+ ]
91
+ } else {
92
+ srcDirs += [
93
+ "src/paper/java"
94
+ ]
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ def reactNativeArchitectures() {
101
+ def value = project.getProperties().get("reactNativeArchitectures")
102
+ return value ? value.split(",") : [
103
+ "armeabi-v7a",
104
+ "x86",
105
+ "x86_64",
106
+ "arm64-v8a"
107
+ ]
32
108
  }
33
109
 
34
110
  repositories {
@@ -37,10 +113,12 @@ repositories {
37
113
  // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
38
114
  url "$rootDir/../node_modules/react-native/android"
39
115
  }
40
- jcenter()
116
+ mavenCentral()
41
117
  }
42
118
 
119
+ def kotlin_version = getExtOrDefault('kotlinVersion', project.properties['RNSAC_kotlinVersion'])
120
+
43
121
  dependencies {
44
- //noinspection GradleDynamicVersion
45
- implementation 'com.facebook.react:react-native:+'
122
+ implementation 'com.facebook.react:react-native:+'
123
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
46
124
  }
@@ -0,0 +1 @@
1
+ RNSAC_kotlinVersion=1.6.20
@@ -0,0 +1,24 @@
1
+ apply plugin: 'com.diffplug.spotless'
2
+
3
+ allprojects {
4
+ repositories {
5
+ google()
6
+ mavenCentral()
7
+ }
8
+ }
9
+
10
+ spotless {
11
+ java {
12
+ target 'src/**/*.java'
13
+ googleJavaFormat()
14
+ }
15
+ kotlin {
16
+ target 'src/**/*.kt'
17
+ ktfmt()
18
+ }
19
+ groovyGradle {
20
+ target '*.gradle'
21
+ greclipse()
22
+ indentWithSpaces(4)
23
+ }
24
+ }
@@ -0,0 +1,25 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ internal class InsetsChangeEvent(
8
+ surfaceId: Int,
9
+ viewTag: Int,
10
+ private val mInsets: EdgeInsets,
11
+ private val mFrame: Rect
12
+ ) : Event<InsetsChangeEvent>(surfaceId, viewTag) {
13
+ override fun getEventName() = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap? {
16
+ val event = Arguments.createMap()
17
+ event.putMap("insets", edgeInsetsToJsMap(mInsets))
18
+ event.putMap("frame", rectToJsMap(mFrame))
19
+ return event
20
+ }
21
+
22
+ companion object {
23
+ const val EVENT_NAME = "topInsetsChange"
24
+ }
25
+ }
@@ -0,0 +1,14 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import android.content.Context
4
+ import android.view.View
5
+ import com.facebook.react.bridge.ReactContext
6
+ import com.facebook.react.uimanager.UIManagerHelper
7
+
8
+ fun getReactContext(view: View): ReactContext {
9
+ return UIManagerHelper.getReactContext(view)
10
+ }
11
+
12
+ fun getSurfaceId(context: Context): Int {
13
+ return UIManagerHelper.getSurfaceId(context)
14
+ }
@@ -1,6 +1,5 @@
1
1
 
2
2
  <manifest
3
3
  xmlns:android="http://schemas.android.com/apk/res/android"
4
- package="com.th3rdwave.safeareacontext">
5
-
4
+ package="com.th3rdwave.safeareacontext">
6
5
  </manifest>
@@ -0,0 +1,3 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ data class EdgeInsets(val top: Float, val right: Float, val bottom: Float, val left: Float)
@@ -0,0 +1,3 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ data class Rect(val x: Float, val y: Float, val width: Float, val height: Float)
@@ -0,0 +1,32 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.annotations.ReactModule
7
+
8
+ @ReactModule(name = SafeAreaContextModule.NAME)
9
+ class SafeAreaContextModule(reactContext: ReactApplicationContext?) :
10
+ NativeSafeAreaContextSpec(reactContext) {
11
+ override fun getName(): String {
12
+ return NAME
13
+ }
14
+
15
+ public override fun getTypedExportedConstants(): Map<String, Any?> {
16
+ return mapOf("initialWindowMetrics" to getInitialWindowMetrics())
17
+ }
18
+
19
+ private fun getInitialWindowMetrics(): Map<String, Any>? {
20
+ val decorView = reactApplicationContext.currentActivity?.window?.decorView as ViewGroup?
21
+ val contentView = decorView?.findViewById<View>(android.R.id.content) ?: return null
22
+ val insets = getSafeAreaInsets(decorView)
23
+ val frame = getFrame(decorView, contentView)
24
+ return if (insets == null || frame == null) {
25
+ null
26
+ } else mapOf("insets" to edgeInsetsToJavaMap(insets), "frame" to rectToJavaMap(frame))
27
+ }
28
+
29
+ companion object {
30
+ const val NAME = "RNCSafeAreaContext"
31
+ }
32
+ }
@@ -0,0 +1,41 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import com.facebook.react.BaseReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.annotations.ReactModule
7
+ import com.facebook.react.module.model.ReactModuleInfo
8
+ import com.facebook.react.module.model.ReactModuleInfoProvider
9
+ import com.facebook.react.uimanager.ViewManager
10
+
11
+ // Fool autolinking for older versions that do not support BaseReactPackage.
12
+ // public class SafeAreaContextPackage implements ReactPackage {
13
+ class SafeAreaContextPackage : BaseReactPackage() {
14
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
15
+ return when (name) {
16
+ SafeAreaContextModule.NAME -> SafeAreaContextModule(reactContext)
17
+ else -> null
18
+ }
19
+ }
20
+
21
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
22
+ val moduleList: Array<Class<out NativeModule?>> = arrayOf(SafeAreaContextModule::class.java)
23
+ val reactModuleInfoMap: MutableMap<String, ReactModuleInfo> = HashMap()
24
+ for (moduleClass in moduleList) {
25
+ val reactModule = moduleClass.getAnnotation(ReactModule::class.java) ?: continue
26
+ reactModuleInfoMap[reactModule.name] =
27
+ ReactModuleInfo(
28
+ reactModule.name,
29
+ moduleClass.name,
30
+ true,
31
+ reactModule.needsEagerInit,
32
+ reactModule.isCxxModule,
33
+ BuildConfig.IS_NEW_ARCHITECTURE_ENABLED)
34
+ }
35
+ return ReactModuleInfoProvider { reactModuleInfoMap }
36
+ }
37
+
38
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
39
+ return listOf<ViewManager<*, *>>(SafeAreaProviderManager(), SafeAreaViewManager())
40
+ }
41
+ }
@@ -0,0 +1,47 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import android.content.Context
4
+ import android.view.ViewGroup
5
+ import android.view.ViewTreeObserver
6
+ import com.facebook.react.views.view.ReactViewGroup
7
+
8
+ typealias OnInsetsChangeHandler = (view: SafeAreaProvider, insets: EdgeInsets, frame: Rect) -> Unit
9
+
10
+ class SafeAreaProvider(context: Context?) :
11
+ ReactViewGroup(context), ViewTreeObserver.OnPreDrawListener {
12
+ private var mInsetsChangeHandler: OnInsetsChangeHandler? = null
13
+ private var mLastInsets: EdgeInsets? = null
14
+ private var mLastFrame: Rect? = null
15
+
16
+ private fun maybeUpdateInsets() {
17
+ val insetsChangeHandler = mInsetsChangeHandler ?: return
18
+ val edgeInsets = getSafeAreaInsets(this) ?: return
19
+ val frame = getFrame(rootView as ViewGroup, this) ?: return
20
+ if (mLastInsets != edgeInsets || mLastFrame != frame) {
21
+ insetsChangeHandler(this, edgeInsets, frame)
22
+ mLastInsets = edgeInsets
23
+ mLastFrame = frame
24
+ }
25
+ }
26
+
27
+ override fun onAttachedToWindow() {
28
+ super.onAttachedToWindow()
29
+ viewTreeObserver.addOnPreDrawListener(this)
30
+ maybeUpdateInsets()
31
+ }
32
+
33
+ override fun onDetachedFromWindow() {
34
+ super.onDetachedFromWindow()
35
+ viewTreeObserver.removeOnPreDrawListener(this)
36
+ }
37
+
38
+ override fun onPreDraw(): Boolean {
39
+ maybeUpdateInsets()
40
+ return true
41
+ }
42
+
43
+ fun setOnInsetsChangeHandler(handler: OnInsetsChangeHandler?) {
44
+ mInsetsChangeHandler = handler
45
+ maybeUpdateInsets()
46
+ }
47
+ }
@@ -0,0 +1,41 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import com.facebook.react.bridge.ReactContext
4
+ import com.facebook.react.module.annotations.ReactModule
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.uimanager.UIManagerHelper
7
+ import com.facebook.react.uimanager.ViewGroupManager
8
+ import com.facebook.react.viewmanagers.RNCSafeAreaProviderManagerDelegate
9
+ import com.facebook.react.viewmanagers.RNCSafeAreaProviderManagerInterface
10
+
11
+ @ReactModule(name = SafeAreaProviderManager.REACT_CLASS)
12
+ class SafeAreaProviderManager :
13
+ ViewGroupManager<SafeAreaProvider>(), RNCSafeAreaProviderManagerInterface<SafeAreaProvider> {
14
+ private val mDelegate = RNCSafeAreaProviderManagerDelegate(this)
15
+
16
+ override fun getDelegate() = mDelegate
17
+
18
+ override fun getName() = REACT_CLASS
19
+
20
+ public override fun createViewInstance(context: ThemedReactContext) = SafeAreaProvider(context)
21
+
22
+ override fun getExportedCustomDirectEventTypeConstants() =
23
+ mutableMapOf(
24
+ InsetsChangeEvent.EVENT_NAME to mutableMapOf("registrationName" to "onInsetsChange"))
25
+
26
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: SafeAreaProvider) {
27
+ super.addEventEmitters(reactContext, view)
28
+ view.setOnInsetsChangeHandler(::handleOnInsetsChange)
29
+ }
30
+
31
+ companion object {
32
+ const val REACT_CLASS = "RNCSafeAreaProvider"
33
+ }
34
+ }
35
+
36
+ private fun handleOnInsetsChange(view: SafeAreaProvider, insets: EdgeInsets, frame: Rect) {
37
+ val reactContext = view.context as ReactContext
38
+ val reactTag = view.id
39
+ UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag)
40
+ ?.dispatchEvent(InsetsChangeEvent(getSurfaceId(reactContext), reactTag, insets, frame))
41
+ }
@@ -0,0 +1,102 @@
1
+ package com.th3rdwave.safeareacontext
2
+
3
+ import android.os.Build
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import android.view.WindowInsets
7
+ import androidx.annotation.RequiresApi
8
+ import java.lang.IllegalArgumentException
9
+ import kotlin.math.max
10
+ import kotlin.math.min
11
+
12
+ @RequiresApi(Build.VERSION_CODES.R)
13
+ private fun getRootWindowInsetsCompatR(rootView: View): EdgeInsets? {
14
+ val insets =
15
+ rootView.rootWindowInsets?.getInsets(
16
+ WindowInsets.Type.statusBars() or
17
+ WindowInsets.Type.displayCutout() or
18
+ WindowInsets.Type.navigationBars() or
19
+ WindowInsets.Type.captionBar())
20
+ ?: return null
21
+ return EdgeInsets(
22
+ top = insets.top.toFloat(),
23
+ right = insets.right.toFloat(),
24
+ bottom = insets.bottom.toFloat(),
25
+ left = insets.left.toFloat())
26
+ }
27
+
28
+ @RequiresApi(Build.VERSION_CODES.M)
29
+ @Suppress("DEPRECATION")
30
+ private fun getRootWindowInsetsCompatM(rootView: View): EdgeInsets? {
31
+ val insets = rootView.rootWindowInsets ?: return null
32
+ return EdgeInsets(
33
+ top = insets.systemWindowInsetTop.toFloat(),
34
+ right = insets.systemWindowInsetRight.toFloat(),
35
+ // System insets are more reliable to account for notches but the
36
+ // system inset for bottom includes the soft keyboard which we don't
37
+ // want to be consistent with iOS. Using the min value makes sure we
38
+ // never get the keyboard offset while still working with devices that
39
+ // hide the navigation bar.
40
+ bottom = min(insets.systemWindowInsetBottom, insets.stableInsetBottom).toFloat(),
41
+ left = insets.systemWindowInsetLeft.toFloat())
42
+ }
43
+
44
+ private fun getRootWindowInsetsCompatBase(rootView: View): EdgeInsets? {
45
+ val visibleRect = android.graphics.Rect()
46
+ rootView.getWindowVisibleDisplayFrame(visibleRect)
47
+ return EdgeInsets(
48
+ top = visibleRect.top.toFloat(),
49
+ right = (rootView.width - visibleRect.right).toFloat(),
50
+ bottom = (rootView.height - visibleRect.bottom).toFloat(),
51
+ left = visibleRect.left.toFloat())
52
+ }
53
+
54
+ private fun getRootWindowInsetsCompat(rootView: View): EdgeInsets? {
55
+ return when {
56
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> getRootWindowInsetsCompatR(rootView)
57
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> getRootWindowInsetsCompatM(rootView)
58
+ else -> getRootWindowInsetsCompatBase(rootView)
59
+ }
60
+ }
61
+
62
+ fun getSafeAreaInsets(view: View): EdgeInsets? {
63
+ // The view has not been layout yet.
64
+ if (view.height == 0) {
65
+ return null
66
+ }
67
+ val rootView = view.rootView
68
+ val windowInsets = getRootWindowInsetsCompat(rootView) ?: return null
69
+
70
+ // Calculate the part of the view that overlaps with window insets.
71
+ val windowWidth = rootView.width.toFloat()
72
+ val windowHeight = rootView.height.toFloat()
73
+ val visibleRect = android.graphics.Rect()
74
+ view.getGlobalVisibleRect(visibleRect)
75
+ return EdgeInsets(
76
+ top = max(windowInsets.top - visibleRect.top, 0f),
77
+ right = max(min(visibleRect.left + view.width - windowWidth, 0f) + windowInsets.right, 0f),
78
+ bottom = max(min(visibleRect.top + view.height - windowHeight, 0f) + windowInsets.bottom, 0f),
79
+ left = max(windowInsets.left - visibleRect.left, 0f))
80
+ }
81
+
82
+ fun getFrame(rootView: ViewGroup, view: View): Rect? {
83
+ // This can happen while the view gets unmounted.
84
+ if (view.parent == null) {
85
+ return null
86
+ }
87
+ val offset = android.graphics.Rect()
88
+ view.getDrawingRect(offset)
89
+ try {
90
+ rootView.offsetDescendantRectToMyCoords(view, offset)
91
+ } catch (ex: IllegalArgumentException) {
92
+ // This can throw if the view is not a descendant of rootView. This should not
93
+ // happen but avoid potential crashes.
94
+ ex.printStackTrace()
95
+ return null
96
+ }
97
+ return Rect(
98
+ x = offset.left.toFloat(),
99
+ y = offset.top.toFloat(),
100
+ width = view.width.toFloat(),
101
+ height = view.height.toFloat())
102
+ }