@amazon-devices/react-native-safe-area-context 2.0.1758683737 → 8.0.9000000000

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 (258) hide show
  1. package/README.md +6 -302
  2. package/SystemBundles/3e1c492419a85957481898df760cf9cf3bd38d3e26ef2e78822fb256fdee0153.bundle +7373 -0
  3. package/SystemBundles/3e1c492419a85957481898df760cf9cf3bd38d3e26ef2e78822fb256fdee0153.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 -4
  66. package/lib/commonjs/CompatNativeSafeAreaProvider.js +7 -8
  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 -125
  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 +56 -36
  83. package/lib/commonjs/SafeAreaContext.js.map +1 -1
  84. package/lib/commonjs/SafeAreaView.js +40 -73
  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/package.json +1 -1
  172. package/react-native-safe-area-context.podspec +26 -4
  173. package/react-native.config.js +8 -0
  174. package/src/CompatNativeSafeAreaProvider.tsx +2 -3
  175. package/src/InitialWindow.kepler.ts +1 -1
  176. package/src/InitialWindow.native.ts +5 -11
  177. package/src/InitialWindow.ts +1 -1
  178. package/src/NativeSafeAreaProvider.kepler.tsx +1 -3
  179. package/src/NativeSafeAreaProvider.tsx +2 -128
  180. package/src/NativeSafeAreaProvider.web.tsx +127 -0
  181. package/src/NativeSafeAreaProvider.windows.tsx +1 -3
  182. package/src/SafeArea.types.ts +15 -11
  183. package/src/SafeAreaContext.tsx +66 -43
  184. package/src/SafeAreaView.tsx +47 -82
  185. package/src/SafeAreaView.web.tsx +123 -0
  186. package/src/SafeAreaView.windows.tsx +2 -1
  187. package/src/index.tsx +2 -0
  188. package/src/specs/NativeSafeAreaContext.ts +23 -0
  189. package/src/specs/NativeSafeAreaProvider.ts +29 -0
  190. package/src/specs/NativeSafeAreaView.ts +17 -0
  191. package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.bundle +0 -11031
  192. package/SystemBundles/e3c0cdeab56b8b622d4f0fd5a80812eafe199fa2287d0e3a09c5e573a1035350.map +0 -1
  193. package/SystemModules/amzn__react-native-safe-area-context-2.modules.txt +0 -55
  194. package/SystemModules/amzn__react-native-safe-area-context-2.private.modules.txt +0 -91
  195. package/THIRD_PARTY_NOTICES.txt +0 -24
  196. package/android/src/main/java/com/th3rdwave/safeareacontext/EdgeInsets.java +0 -22
  197. package/android/src/main/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.java +0 -33
  198. package/android/src/main/java/com/th3rdwave/safeareacontext/Rect.java +0 -22
  199. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.java +0 -31
  200. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProvider.java +0 -66
  201. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.java +0 -94
  202. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java +0 -82
  203. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.java +0 -159
  204. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.java +0 -8
  205. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewLocalData.java +0 -27
  206. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.java +0 -72
  207. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.java +0 -6
  208. package/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.java +0 -201
  209. package/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.java +0 -52
  210. package/ios/SafeAreaView/RCTView+SafeAreaCompat.h +0 -16
  211. package/ios/SafeAreaView/RCTView+SafeAreaCompat.m +0 -57
  212. package/ios/SafeAreaView/RNCSafeAreaProvider.m +0 -65
  213. package/ios/SafeAreaView/RNCSafeAreaProviderManager.m +0 -61
  214. package/ios/SafeAreaView/RNCSafeAreaView.m +0 -118
  215. package/ios/SafeAreaView/RNCSafeAreaViewEdges.h +0 -9
  216. package/ios/SafeAreaView/RNCSafeAreaViewEdges.m +0 -13
  217. package/ios/SafeAreaView/RNCSafeAreaViewMode.m +0 -11
  218. package/lib/commonjs/NativeSafeAreaProvider.macos.js +0 -9
  219. package/lib/commonjs/NativeSafeAreaProvider.macos.js.map +0 -1
  220. package/lib/commonjs/NativeSafeAreaProvider.native.js +0 -9
  221. package/lib/commonjs/NativeSafeAreaProvider.native.js.map +0 -1
  222. package/lib/commonjs/SafeAreaView.macos.js +0 -9
  223. package/lib/commonjs/SafeAreaView.macos.js.map +0 -1
  224. package/lib/commonjs/SafeAreaView.native.js +0 -9
  225. package/lib/commonjs/SafeAreaView.native.js.map +0 -1
  226. package/lib/commonjs/useWindowDimensions.js +0 -32
  227. package/lib/commonjs/useWindowDimensions.js.map +0 -1
  228. package/lib/module/NativeSafeAreaProvider.macos.js +0 -3
  229. package/lib/module/NativeSafeAreaProvider.macos.js.map +0 -1
  230. package/lib/module/NativeSafeAreaProvider.native.js +0 -3
  231. package/lib/module/NativeSafeAreaProvider.native.js.map +0 -1
  232. package/lib/module/SafeAreaView.macos.js +0 -3
  233. package/lib/module/SafeAreaView.macos.js.map +0 -1
  234. package/lib/module/SafeAreaView.native.js +0 -3
  235. package/lib/module/SafeAreaView.native.js.map +0 -1
  236. package/lib/module/useWindowDimensions.js +0 -26
  237. package/lib/module/useWindowDimensions.js.map +0 -1
  238. package/lib/typescript/src/CompatNativeSafeAreaProvider.d.ts +0 -2
  239. package/lib/typescript/src/NativeSafeAreaProvider.d.ts +0 -2
  240. package/lib/typescript/src/NativeSafeAreaProvider.kepler.d.ts +0 -2
  241. package/lib/typescript/src/NativeSafeAreaProvider.macos.d.ts +0 -2
  242. package/lib/typescript/src/NativeSafeAreaProvider.native.d.ts +0 -3
  243. package/lib/typescript/src/NativeSafeAreaProvider.windows.d.ts +0 -2
  244. package/lib/typescript/src/SafeArea.types.d.ts +0 -31
  245. package/lib/typescript/src/SafeAreaView.d.ts +0 -2
  246. package/lib/typescript/src/SafeAreaView.macos.d.ts +0 -2
  247. package/lib/typescript/src/SafeAreaView.native.d.ts +0 -2
  248. package/lib/typescript/src/SafeAreaView.windows.d.ts +0 -2
  249. package/lib/typescript/src/useWindowDimensions.d.ts +0 -8
  250. package/src/NativeSafeAreaProvider.macos.tsx +0 -3
  251. package/src/NativeSafeAreaProvider.native.tsx +0 -6
  252. package/src/SafeAreaView.macos.tsx +0 -3
  253. package/src/SafeAreaView.native.tsx +0 -6
  254. package/src/useWindowDimensions.tsx +0 -35
  255. /package/ios/{SafeAreaView/RNCSafeAreaProviderManager.h → RNCSafeAreaProviderManager.h} +0 -0
  256. /package/ios/{SafeAreaView/RNCSafeAreaShadowView.h → RNCSafeAreaShadowView.h} +0 -0
  257. /package/ios/{SafeAreaView/RNCSafeAreaViewManager.h → RNCSafeAreaViewManager.h} +0 -0
  258. /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.28.6/helpers/interopRequireDefault.js:1658e9d806cecc7d513f
2
+ node_modules/@babel/runtime_7.28.6/helpers/slicedToArray.js:b5c3a0dfb06038f36d1a
3
+ node_modules/@babel/runtime_7.28.6/helpers/arrayWithHoles.js:3e4d5f17df2fc26aca06
4
+ node_modules/@babel/runtime_7.28.6/helpers/iterableToArrayLimit.js:7c9be9833a5bd1bcfc84
5
+ node_modules/@babel/runtime_7.28.6/helpers/unsupportedIterableToArray.js:41618dd1a0cab1d4d4b6
6
+ node_modules/@babel/runtime_7.28.6/helpers/arrayLikeToArray.js:b23f086000fa770c51b1
7
+ node_modules/@babel/runtime_7.28.6/helpers/nonIterableRest.js:7fc60d42dbf0dbb04c4b
8
+ node_modules/@babel/runtime_7.28.6/helpers/classCallCheck.js:058f50a76315fc88ad5c
9
+ node_modules/@babel/runtime_7.28.6/helpers/createClass.js:0d1487bbdd0385fe6673
10
+ node_modules/@babel/runtime_7.28.6/helpers/toPropertyKey.js:48405da1a82590964a03
11
+ node_modules/@babel/runtime_7.28.6/helpers/toPrimitive.js:0f8abf3c8b18480a6d47
12
+ node_modules/@babel/runtime_7.28.6/helpers/typeof.js:13ae0d75f4934933ecaf
13
+ node_modules/@babel/runtime_7.28.6/helpers/possibleConstructorReturn.js:4aa94a74d7bb7221b923
14
+ node_modules/@babel/runtime_7.28.6/helpers/assertThisInitialized.js:25fb38428dda46d6800f
15
+ node_modules/@babel/runtime_7.28.6/helpers/getPrototypeOf.js:d2ca1962320a7fc595a6
16
+ node_modules/@babel/runtime_7.28.6/helpers/get.js:d8dcd13dae0a344bbc4a
17
+ node_modules/@babel/runtime_7.28.6/helpers/superPropBase.js:1f15365ae02704dfefe4
18
+ node_modules/@babel/runtime_7.28.6/helpers/inherits.js:c3969dfc5dcf704d89df
19
+ node_modules/@babel/runtime_7.28.6/helpers/setPrototypeOf.js:8b411d7eeb55832922af
20
+ node_modules/@babel/runtime_7.28.6/helpers/classPrivateFieldLooseBase.js:84b970236b4776e847c4
21
+ node_modules/@babel/runtime_7.28.6/helpers/classPrivateFieldLooseKey.js:c408e8c609dabd10913e
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.28.6/helpers/objectWithoutProperties.js:c4820e134611e601fe3c
25
+ node_modules/@babel/runtime_7.28.6/helpers/objectWithoutPropertiesLoose.js:2819355eb1660a78a270
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.28.6/helpers/wrapNativeSuper.js:583997f8f86d03f2b30d
30
+ node_modules/@babel/runtime_7.28.6/helpers/isNativeFunction.js:251a25cb216e38430b20
31
+ node_modules/@babel/runtime_7.28.6/helpers/construct.js:594614f416b5f1160b89
32
+ node_modules/@babel/runtime_7.28.6/helpers/isNativeReflectConstruct.js:f3459bbdfb4afe15ce21
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.28.6/helpers/readOnlyError.js:09c040dc0dcec28a54ae
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.28.6/helpers/asyncToGenerator.js:949e187ecf57bddc8118
@@ -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
+ }