react-native-screens 5.0.0-alpha.3 → 5.0.0-alpha.4

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 (337) hide show
  1. package/README.md +0 -4
  2. package/android/build.gradle +1 -0
  3. package/android/consumer-rules.pro +3 -0
  4. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
  6. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
  7. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
  9. package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +9 -0
  11. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
  12. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +2 -2
  13. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetDimensionsCoordinator.kt +6 -6
  14. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetKeyboardCoordinator.kt +1 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -2
  16. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetAvailableHeightProvider.kt +1 -1
  17. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
  18. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +1 -1
  19. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialogManager.kt +26 -8
  20. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
  22. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +1 -1
  23. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
  24. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetDetents.kt +1 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +1 -1
  26. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetDimmingManager.kt +6 -18
  27. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetDismissalOrigin.kt +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentation.kt +10 -10
  29. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationManager.kt +1 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +1 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetStackRegistry.kt +1 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
  34. package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
  36. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +29 -2
  37. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
  38. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +13 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
  40. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
  43. package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
  44. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
  45. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
  47. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDismissEvent.kt +1 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
  56. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
  57. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +11 -11
  58. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +10 -10
  59. package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
  60. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
  61. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
  62. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +0 -52
  63. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +112 -59
  64. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +1 -1
  65. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
  66. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +4 -73
  67. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -2
  68. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +0 -6
  69. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +3 -7
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +57 -19
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +14 -5
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +33 -12
  79. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
  80. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +44 -3
  81. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
  82. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
  83. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +28 -13
  84. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
  85. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +12 -2
  86. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +41 -17
  87. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
  88. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
  89. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
  90. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
  91. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +14 -7
  92. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
  93. package/ios/RNSEnums.h +14 -1
  94. package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
  95. package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
  96. package/ios/legacy/RNSBarButtonItem.mm +15 -0
  97. package/ios/legacy/RNSConvert.h +6 -0
  98. package/ios/legacy/RNSConvert.mm +17 -0
  99. package/ios/legacy/RNSNavigationBar.h +31 -0
  100. package/ios/legacy/RNSNavigationBar.mm +15 -0
  101. package/ios/legacy/RNSScreen.mm +122 -12
  102. package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
  103. package/ios/legacy/RNSScreenStack.mm +202 -15
  104. package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
  105. package/ios/legacy/RNSScreenStackHeaderConfig.mm +70 -17
  106. package/ios/legacy/RNSScreenStackHeaderSubview.mm +33 -0
  107. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +1 -12
  108. package/ios/stack/conversion/RNSConversions-Stack.h +30 -0
  109. package/ios/stack/conversion/RNSConversions-Stack.mm +79 -0
  110. package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
  111. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +4 -0
  112. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +40 -6
  113. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +5 -0
  114. package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
  115. package/ios/stack/header/RNSStackHeaderItemComponentView.h +9 -2
  116. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +57 -3
  117. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +5 -0
  118. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
  119. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
  120. package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
  121. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
  122. package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
  123. package/ios/stack/screen/RNSStackScreenComponentView.mm +23 -0
  124. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +81 -8
  125. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +79 -16
  126. package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
  127. package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
  128. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
  129. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
  130. package/ios/tabs/conversion/RNSConversions-Tabs.h +22 -0
  131. package/ios/tabs/conversion/RNSConversions-Tabs.mm +97 -3
  132. package/ios/tabs/host/RNSTabBarController.h +16 -0
  133. package/ios/tabs/host/RNSTabBarController.mm +516 -107
  134. package/ios/tabs/host/RNSTabsHostComponentView.h +2 -0
  135. package/ios/tabs/host/RNSTabsHostComponentView.mm +32 -2
  136. package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
  137. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +54 -69
  138. package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
  139. package/ios/utils/RNSDefines.h +12 -7
  140. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +3 -2
  141. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  142. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +8 -3
  143. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  144. package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
  145. package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
  146. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  147. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  148. package/lib/commonjs/components/stack/host/StackHost.js +8 -1
  149. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  150. package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
  151. package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
  152. package/lib/commonjs/components/stack/index.js.map +1 -1
  153. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +2 -0
  154. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  155. package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
  156. package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
  157. package/lib/commonjs/components/tabs/index.js.map +1 -1
  158. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
  159. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
  160. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
  161. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  162. package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
  163. package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
  164. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
  165. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  166. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  167. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  168. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  169. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  170. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  171. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  172. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  173. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  174. package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
  175. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  176. package/lib/module/components/stack/header/StackHeaderConfig.android.js +4 -3
  177. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  178. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +9 -4
  179. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  180. package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
  181. package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
  182. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  183. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  184. package/lib/module/components/stack/host/StackHost.js +9 -2
  185. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  186. package/lib/module/components/stack/host/StackHost.web.js +0 -3
  187. package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
  188. package/lib/module/components/stack/index.js.map +1 -1
  189. package/lib/module/components/tabs/host/TabsHost.ios.js +2 -0
  190. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  191. package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
  192. package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
  193. package/lib/module/components/tabs/index.js.map +1 -1
  194. package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
  195. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
  196. package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
  197. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  198. package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
  199. package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
  200. package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
  201. package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  202. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  203. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  204. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  205. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  206. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  207. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  208. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  209. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  210. package/lib/module/legacy/components/ScreenStackItem.js +31 -11
  211. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  212. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
  213. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  214. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +4 -3
  215. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  216. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
  217. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
  218. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
  219. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  220. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +137 -2
  221. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  222. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +2 -0
  223. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
  224. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  225. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +5 -0
  226. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  227. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  228. package/lib/typescript/components/stack/host/StackHost.types.d.ts +24 -1
  229. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  230. package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
  231. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  232. package/lib/typescript/components/stack/index.d.ts +4 -3
  233. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  234. package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
  235. package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
  236. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  237. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +56 -0
  238. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  239. package/lib/typescript/components/tabs/index.d.ts +4 -6
  240. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  241. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
  242. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
  243. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
  244. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
  245. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
  246. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
  247. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
  248. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
  249. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
  250. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
  251. package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
  252. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
  253. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
  254. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  255. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
  256. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  257. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +4 -0
  258. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  259. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +6 -0
  260. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  261. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +3 -0
  262. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  263. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
  264. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  265. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
  266. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  267. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
  268. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  269. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
  270. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  271. package/lib/typescript/legacy/types.d.ts +30 -0
  272. package/lib/typescript/legacy/types.d.ts.map +1 -1
  273. package/package.json +4 -2
  274. package/src/components/stack/header/StackHeaderConfig.android.tsx +6 -20
  275. package/src/components/stack/header/StackHeaderConfig.android.types.ts +4 -3
  276. package/src/components/stack/header/StackHeaderConfig.ios.tsx +10 -16
  277. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +148 -2
  278. package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
  279. package/src/components/stack/header/StackHeaderConfig.types.ts +2 -0
  280. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
  281. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +5 -0
  282. package/src/components/stack/host/StackHost.tsx +10 -3
  283. package/src/components/stack/host/StackHost.types.ts +25 -1
  284. package/src/components/stack/host/StackHost.web.tsx +1 -4
  285. package/src/components/stack/index.ts +9 -1
  286. package/src/components/tabs/host/TabsHost.ios.tsx +2 -0
  287. package/src/components/tabs/host/TabsHost.ios.types.ts +60 -0
  288. package/src/components/tabs/host/TabsHost.tsx +7 -0
  289. package/src/components/tabs/index.ts +9 -0
  290. package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
  291. package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
  292. package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
  293. package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
  294. package/src/components/tabs/screen/TabsScreen.tsx +7 -0
  295. package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
  296. package/src/components/tabs/screen/index.ts +1 -0
  297. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
  298. package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
  299. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +11 -0
  300. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +11 -0
  301. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +7 -0
  302. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
  303. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
  304. package/src/legacy/components/ScreenStackItem.tsx +59 -12
  305. package/src/legacy/types.ts +31 -0
  306. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
  307. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
  308. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
  309. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
  310. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  311. package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
  312. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
  313. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
  314. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
  315. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
  316. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
  317. package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
  318. package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
  319. package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  320. package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
  321. package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
  322. package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
  323. package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
  324. package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
  325. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
  326. package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
  327. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
  328. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
  329. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
  330. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
  331. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
  332. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
  333. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
  334. package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
  335. package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
  336. package/src/components/tabs/host/TabsHost.d.ts +0 -12
  337. package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
package/README.md CHANGED
@@ -6,10 +6,6 @@
6
6
 
7
7
  This project aims to expose native navigation container components to React Native. It is not designed to be used as a standalone library but rather as a dependency of a [full-featured navigation library](https://github.com/react-navigation/react-navigation).
8
8
 
9
- ## Fabric
10
-
11
- To learn about how to use `react-native-screens` with Fabric architecture, head over to [Fabric README](README-Fabric.md). Instructions on how to run Fabric Example within this repo can be found in the [FabricExample README](FabricExample/README.md).
12
-
13
9
  ## Supported platforms
14
10
 
15
11
  - [x] iOS
@@ -141,6 +141,7 @@ android {
141
141
  versionCode 1
142
142
  versionName "1.0"
143
143
  buildConfigField "boolean", "RNS_DEBUG_LOGGING", areDebugLogsEnabled().toString()
144
+ consumerProguardFiles "consumer-rules.pro"
144
145
  ndk {
145
146
  abiFilters (*reactNativeArchitectures())
146
147
  }
@@ -0,0 +1,3 @@
1
+ # RNScreensFragmentFactory recognises library fragments by their package-name prefix when
2
+ # restoring saved state. Keep their names so R8 can't rename or repackage them.
3
+ -keepnames class com.swmansion.rnscreens.** extends androidx.fragment.app.Fragment
@@ -71,6 +71,8 @@ abstract class FabricEnabledHeaderConfigViewGroup(
71
71
  mStateWrapper?.updateState(map)
72
72
  }
73
73
 
74
+ override fun shouldDelayChildPressedState(): Boolean = false
75
+
74
76
  companion object {
75
77
  private const val DELTA = 0.9f
76
78
  }
@@ -72,6 +72,8 @@ abstract class FabricEnabledHeaderSubviewViewGroup(
72
72
  mStateWrapper?.updateState(map)
73
73
  }
74
74
 
75
+ override fun shouldDelayChildPressedState(): Boolean = false
76
+
75
77
  companion object {
76
78
  private const val DELTA = 0.9f
77
79
  }
@@ -18,6 +18,14 @@ abstract class FabricEnabledViewGroup(
18
18
  private var lastHeight = 0f
19
19
  private var lastHeaderHeight = 0f
20
20
 
21
+ protected var isStateInvalidated = false
22
+ private set
23
+
24
+ // A detached screen can miss native layout changes while the commit hook resets its shadow state.
25
+ protected fun invalidateState() {
26
+ isStateInvalidated = true
27
+ }
28
+
21
29
  fun setStateWrapper(wrapper: StateWrapper?) {
22
30
  mStateWrapper = wrapper
23
31
  }
@@ -36,15 +44,20 @@ abstract class FabricEnabledViewGroup(
36
44
  val realHeaderHeight: Float = pxToDp(headerHeight.toFloat())
37
45
 
38
46
  // Check incoming state values. If they're already the correct value, return early to prevent
39
- // infinite UpdateState/SetState loop.
47
+ // an infinite UpdateState/SetState loop. The state-invalidated flag forces the update when the
48
+ // commit hook has reset the state while the screen was detached from the native hierarchy
49
+ // - the screen may have missed some layout changes in the meantime (see #4336 and #4760).
40
50
  val delta = 0.9f
41
- if (abs(lastWidth - realWidth) < delta &&
51
+ if (!isStateInvalidated &&
52
+ abs(lastWidth - realWidth) < delta &&
42
53
  abs(lastHeight - realHeight) < delta &&
43
54
  abs(lastHeaderHeight - realHeaderHeight) < delta
44
55
  ) {
45
56
  return
46
57
  }
47
58
 
59
+ val stateWrapper = mStateWrapper ?: return
60
+ isStateInvalidated = false
48
61
  lastWidth = realWidth
49
62
  lastHeight = realHeight
50
63
  lastHeaderHeight = realHeaderHeight
@@ -55,6 +68,8 @@ abstract class FabricEnabledViewGroup(
55
68
  putDouble("contentOffsetX", 0.0)
56
69
  putDouble("contentOffsetY", realHeaderHeight.toDouble())
57
70
  }
58
- mStateWrapper?.updateState(map)
71
+ stateWrapper.updateState(map)
59
72
  }
73
+
74
+ override fun shouldDelayChildPressedState(): Boolean = false
60
75
  }
@@ -18,8 +18,8 @@ import com.swmansion.rnscreens.legacy.ScreenStackViewManager
18
18
  import com.swmansion.rnscreens.legacy.ScreenViewManager
19
19
  import com.swmansion.rnscreens.legacy.SearchBarManager
20
20
  import com.swmansion.rnscreens.legacy.utils.ScreenDummyLayoutHelper
21
- import com.swmansion.rnscreens.modals.formsheet.react.contentwrapper.FormSheetContentWrapperViewManager
22
- import com.swmansion.rnscreens.modals.formsheet.react.host.FormSheetHostViewManager
21
+ import com.swmansion.rnscreens.react.modals.formsheet.contentwrapper.FormSheetContentWrapperViewManager
22
+ import com.swmansion.rnscreens.react.modals.formsheet.host.FormSheetHostViewManager
23
23
  import com.swmansion.rnscreens.safearea.SafeAreaViewManager
24
24
  import com.swmansion.rnscreens.scrollviewmarker.ScrollViewMarkerViewManager
25
25
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigViewManager
@@ -57,10 +57,14 @@ class ScreensModule(
57
57
  }
58
58
 
59
59
  private fun setupFabric() {
60
- val fabricUIManager =
61
- UIManagerHelper.getUIManager(reactContext, UIManagerType.FABRIC) as FabricUIManager
60
+ // Null when the host has no live ReactInstance. In bridgeless mode this happens only while
61
+ // the instance owning this module is being torn down (reload / destroy): ReactHostImpl
62
+ // drops its instance reference before it stops the JS thread, so JS can still create this
63
+ // module. There is nothing to set up then, the module gets invalidated right after.
64
+ // See https://github.com/software-mansion/react-native-screens/issues/4699
65
+ val uiManager = UIManagerHelper.getUIManager(reactContext, UIManagerType.FABRIC) ?: return
62
66
  proxy?.apply {
63
- nativeAddMutationsListener(fabricUIManager)
67
+ nativeAddMutationsListener(uiManager as FabricUIManager)
64
68
  }
65
69
  }
66
70
 
@@ -3,6 +3,7 @@ package com.swmansion.rnscreens.common.colorscheme
3
3
  import android.content.res.Configuration
4
4
  import android.view.View
5
5
  import android.view.ViewParent
6
+ import java.lang.ref.WeakReference
6
7
  import kotlin.properties.Delegates
7
8
 
8
9
  internal typealias OnUiNightModeResolvedCallback = (nightMode: Int) -> Unit
@@ -16,6 +17,15 @@ internal class ColorSchemeCoordinator :
16
17
  }
17
18
  }
18
19
  private var parentProvider: ColorSchemeProviding? = null
20
+
21
+ /**
22
+ * Parent provider known from ownership, taking precedence over the view-tree walk
23
+ * in [setup]. Set it when the owner knows its provider statically (e.g. a fragment's
24
+ * root view always resolves through the container that created the fragment) - the
25
+ * walk is unreliable there: transitions reparent an exiting fragment's view into the
26
+ * container's ViewGroupOverlay, whose parent chain ends in null. Survives [teardown].
27
+ */
28
+ internal var explicitParentProvider: WeakReference<ColorSchemeProviding>? = null
19
29
  private var systemUiNightMode: Int = Configuration.UI_MODE_NIGHT_NO
20
30
  private var lastAppliedUiNightMode: Int? = null
21
31
  private val childListeners = mutableListOf<ColorSchemeListener>()
@@ -60,7 +70,7 @@ internal class ColorSchemeCoordinator :
60
70
 
61
71
  systemUiNightMode =
62
72
  hostView.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
63
- parentProvider = findParentColorSchemeProvider(hostView)
73
+ parentProvider = explicitParentProvider?.get() ?: findParentColorSchemeProvider(hostView)
64
74
  parentProvider?.addColorSchemeListener(this)
65
75
  onUiNightModeResolved = onUiNightModeResolvedCallback
66
76
  isSetUp = true
@@ -17,4 +17,13 @@ interface Container {
17
17
  * in the subtree does.
18
18
  */
19
19
  fun wantsToPreventStackNativeDismiss(): ContainerItem?
20
+
21
+ /**
22
+ * Asks the container to pop its own stack to the root, if it can. If it has nothing
23
+ * to pop (or can't pop), the request is forwarded to the nested container of its
24
+ * active item.
25
+ *
26
+ * @return `true` if a pop was performed or requested (here or in a nested container), `false` otherwise.
27
+ */
28
+ fun requestPopToRoot(): Boolean
20
29
  }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import android.os.Build
4
4
  import android.widget.FrameLayout
@@ -6,7 +6,7 @@ import androidx.core.view.doOnNextLayout
6
6
  import com.google.android.material.shape.CornerFamily
7
7
  import com.google.android.material.shape.MaterialShapeDrawable
8
8
  import com.google.android.material.shape.ShapeAppearanceModel
9
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
9
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetConfig
10
10
  import com.swmansion.rnscreens.utils.dpToPx
11
11
 
12
12
  internal class FormSheetAppearanceCoordinator(
@@ -1,9 +1,9 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import android.view.View
4
4
  import android.widget.FrameLayout
5
5
  import com.google.android.material.bottomsheet.BottomSheetBehavior
6
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
6
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
7
7
 
8
8
  internal class FormSheetBehaviorController(
9
9
  private val sheetView: FrameLayout,
@@ -1,14 +1,14 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import android.view.ViewGroup
4
4
  import android.widget.FrameLayout
5
5
  import androidx.core.view.ViewCompat
6
6
  import androidx.core.view.WindowInsetsCompat
7
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetAvailableHeightProvider
8
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetContainer
9
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
10
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
11
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
7
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetAvailableHeightProvider
8
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetContainer
9
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
10
+ import com.swmansion.rnscreens.core.modals.formsheet.interfaces.FormSheetContentSizeChangeDelegate
11
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
12
12
 
13
13
  internal class FormSheetDimensionsCoordinator(
14
14
  private val dialog: FormSheetDialog,
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import android.widget.FrameLayout
4
4
  import androidx.core.view.ViewCompat
@@ -1,7 +1,7 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
1
+ package com.swmansion.rnscreens.core.modals.formsheet.coordinator
2
2
 
3
3
  import androidx.activity.OnBackPressedCallback
4
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
4
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
5
5
 
6
6
  internal class FormSheetNativeDismissCoordinator(
7
7
  private val dialog: FormSheetDialog,
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
3
  import android.content.Context
4
4
  import android.view.View
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
3
  import android.content.Context
4
4
  import android.os.Bundle
@@ -1,19 +1,26 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
1
+ package com.swmansion.rnscreens.core.modals.formsheet.dialog
2
2
 
3
+ import android.app.Activity
3
4
  import android.content.Context
5
+ import android.content.ContextWrapper
4
6
  import android.view.ContextThemeWrapper
5
7
  import android.view.View
6
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
7
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetDialogEventEmitter
8
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
9
- import com.swmansion.rnscreens.modals.formsheet.native.presentation.FormSheetDimmingManager
10
- import com.swmansion.rnscreens.modals.formsheet.native.presentation.FormSheetPresentation
11
- import com.swmansion.rnscreens.modals.formsheet.native.presentation.FormSheetPresentationManager
8
+ import com.swmansion.rnscreens.core.modals.formsheet.interfaces.FormSheetContentSizeChangeDelegate
9
+ import com.swmansion.rnscreens.core.modals.formsheet.interfaces.FormSheetDialogEventEmitter
10
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetConfig
11
+ import com.swmansion.rnscreens.core.modals.formsheet.presentation.FormSheetDimmingManager
12
+ import com.swmansion.rnscreens.core.modals.formsheet.presentation.FormSheetPresentation
13
+ import com.swmansion.rnscreens.core.modals.formsheet.presentation.FormSheetPresentationManager
12
14
  import kotlin.properties.Delegates
13
15
 
16
+ /**
17
+ * @param activityProvider returns the activity whose decor view hosts the sheet's dimming. The default walks the
18
+ * [ContextWrapper] chain of [context]; hosts whose context does not wrap an activity must provide their own.
19
+ */
14
20
  class FormSheetDialogManager(
15
21
  context: Context,
16
22
  private val contentView: View,
23
+ activityProvider: () -> Activity? = { context.findActivity() },
17
24
  ) {
18
25
  private var formSheetConfig = FormSheetConfig()
19
26
 
@@ -45,7 +52,7 @@ class FormSheetDialogManager(
45
52
  }
46
53
  }
47
54
 
48
- private val dimmingManager = FormSheetDimmingManager(context)
55
+ private val dimmingManager = FormSheetDimmingManager(activityProvider)
49
56
 
50
57
  private val presentationManager =
51
58
  FormSheetPresentationManager(
@@ -87,3 +94,14 @@ class FormSheetDialogManager(
87
94
  presentationManager.destroy()
88
95
  }
89
96
  }
97
+
98
+ private fun Context.findActivity(): Activity? {
99
+ var current: Context? = this
100
+ while (current is ContextWrapper) {
101
+ if (current is Activity) {
102
+ return current
103
+ }
104
+ current = current.baseContext
105
+ }
106
+ return null
107
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.interfaces
1
+ package com.swmansion.rnscreens.core.modals.formsheet.interfaces
2
2
 
3
3
  interface FormSheetContentSizeChangeDelegate {
4
4
  fun onContentHeightChanged(newHeight: Int)
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.interfaces
1
+ package com.swmansion.rnscreens.core.modals.formsheet.interfaces
2
2
 
3
3
  interface FormSheetContentSizeChangeProvider {
4
4
  fun setContentSizeChangeDelegate(delegate: FormSheetContentSizeChangeDelegate?)
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.interfaces
1
+ package com.swmansion.rnscreens.core.modals.formsheet.interfaces
2
2
 
3
3
  import com.swmansion.rnscreens.common.event.ViewAppearanceEventEmitter
4
4
 
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.model
1
+ package com.swmansion.rnscreens.core.modals.formsheet.model
2
2
 
3
3
  internal data class FormSheetConfig(
4
4
  val isOpen: Boolean = false,
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.model
1
+ package com.swmansion.rnscreens.core.modals.formsheet.model
2
2
 
3
3
  import kotlin.math.roundToInt
4
4
 
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  import android.animation.Animator
4
4
  import android.animation.AnimatorSet
@@ -1,18 +1,18 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  import android.app.Activity
4
- import android.content.Context
5
- import android.content.ContextWrapper
6
4
  import android.graphics.Color
7
5
  import android.graphics.drawable.ColorDrawable
8
6
  import android.util.Log
9
7
  import android.view.View
10
- import com.facebook.react.bridge.ReactContext
11
8
  import com.google.android.material.bottomsheet.BottomSheetBehavior
12
9
  import kotlin.math.roundToInt
13
10
 
11
+ /**
12
+ * @param activityProvider returns the activity whose decor view hosts the dimming of the bottom-most sheet.
13
+ */
14
14
  internal class FormSheetDimmingManager(
15
- private val context: Context,
15
+ private val activityProvider: () -> Activity?,
16
16
  ) {
17
17
  // TODO: @t0maboro - consider exposing as a prop
18
18
  internal val maxAlpha: Float = MAX_DIMMING_ALPHA_FRACTION
@@ -92,19 +92,7 @@ internal class FormSheetDimmingManager(
92
92
  )
93
93
  }
94
94
 
95
- private fun resolveActivityDecorView(): View? {
96
- var current: Context? = context
97
- while (current is ContextWrapper) {
98
- if (current is Activity) {
99
- return current.window?.decorView
100
- }
101
- if (current is ReactContext) {
102
- return current.currentActivity?.window?.decorView
103
- }
104
- current = current.baseContext
105
- }
106
- return null
107
- }
95
+ private fun resolveActivityDecorView(): View? = activityProvider()?.window?.decorView
108
96
 
109
97
  companion object {
110
98
  const val TAG = "FormSheetDimmingManager"
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  internal enum class FormSheetDismissalOrigin {
4
4
  /**
@@ -1,19 +1,19 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  import android.content.Context
4
4
  import android.util.Log
5
5
  import android.view.ViewGroup
6
6
  import android.widget.FrameLayout
7
7
  import com.google.android.material.bottomsheet.BottomSheetBehavior
8
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetAppearanceCoordinator
9
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetBehaviorController
10
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetDimensionsCoordinator
11
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetKeyboardCoordinator
12
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetNativeDismissCoordinator
13
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetContainer
14
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
15
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
16
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
8
+ import com.swmansion.rnscreens.core.modals.formsheet.coordinator.FormSheetAppearanceCoordinator
9
+ import com.swmansion.rnscreens.core.modals.formsheet.coordinator.FormSheetBehaviorController
10
+ import com.swmansion.rnscreens.core.modals.formsheet.coordinator.FormSheetDimensionsCoordinator
11
+ import com.swmansion.rnscreens.core.modals.formsheet.coordinator.FormSheetKeyboardCoordinator
12
+ import com.swmansion.rnscreens.core.modals.formsheet.coordinator.FormSheetNativeDismissCoordinator
13
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetContainer
14
+ import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
15
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetConfig
16
+ import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
17
17
 
18
18
  internal class FormSheetPresentation(
19
19
  themedContext: Context,
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  import android.animation.Animator
4
4
  import android.animation.AnimatorListenerAdapter
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  internal enum class FormSheetPresentationState {
4
4
  /**
@@ -1,4 +1,4 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
1
+ package com.swmansion.rnscreens.core.modals.formsheet.presentation
2
2
 
3
3
  internal object FormSheetStackRegistry {
4
4
  private val stack = mutableListOf<FormSheetPresentationManager>()
@@ -0,0 +1,6 @@
1
+ package com.swmansion.rnscreens.ext
2
+
3
+ import androidx.fragment.app.FragmentManager
4
+ import androidx.fragment.app.FragmentTransaction
5
+
6
+ internal fun FragmentManager.createTransactionWithReordering(): FragmentTransaction = this.beginTransaction().setReorderingAllowed(true)
@@ -6,7 +6,6 @@ import android.view.ViewParent
6
6
  import androidx.fragment.app.Fragment
7
7
  import androidx.fragment.app.FragmentActivity
8
8
  import androidx.fragment.app.FragmentManager
9
- import androidx.fragment.app.FragmentTransaction
10
9
  import com.facebook.react.ReactRootView
11
10
  import com.swmansion.rnscreens.common.FragmentProviding
12
11
 
@@ -75,5 +74,3 @@ object FragmentManagerHelper {
75
74
  }
76
75
  }
77
76
  }
78
-
79
- internal fun FragmentManager.createTransactionWithReordering(): FragmentTransaction = this.beginTransaction().setReorderingAllowed(true)
@@ -0,0 +1,31 @@
1
+ package com.swmansion.rnscreens.helpers
2
+
3
+ import android.content.res.ColorStateList
4
+ import android.content.res.Resources
5
+ import android.graphics.PorterDuff
6
+ import android.graphics.drawable.Drawable
7
+ import androidx.appcompat.graphics.drawable.DrawableWrapperCompat
8
+
9
+ // Ignores tinting so the wrapped icon keeps its own colors even when a host view
10
+ // (e.g. BottomNavigationView) applies an itemIconTintList.
11
+ internal class NoTintDrawable(
12
+ drawable: Drawable,
13
+ ) : DrawableWrapperCompat(drawable) {
14
+ override fun setTintList(tint: ColorStateList?) = Unit
15
+
16
+ override fun setTint(tintColor: Int) = Unit
17
+
18
+ override fun setTintMode(tintMode: PorterDuff.Mode?) = Unit
19
+
20
+ override fun getConstantState(): ConstantState? = drawable?.constantState?.let(::NoTintConstantState)
21
+
22
+ private class NoTintConstantState(
23
+ private val wrappedState: ConstantState,
24
+ ) : ConstantState() {
25
+ override fun newDrawable(): Drawable = NoTintDrawable(wrappedState.newDrawable())
26
+
27
+ override fun newDrawable(res: Resources?): Drawable = NoTintDrawable(wrappedState.newDrawable(res))
28
+
29
+ override fun getChangingConfigurations(): Int = wrappedState.changingConfigurations
30
+ }
31
+ }
@@ -5,7 +5,6 @@ import android.view.ViewGroup
5
5
  import android.widget.ScrollView
6
6
  import androidx.core.view.isNotEmpty
7
7
  import androidx.core.widget.NestedScrollView
8
- import com.swmansion.rnscreens.legacy.ScreenStack
9
8
 
10
9
  object ViewFinder {
11
10
  fun findScrollViewInFirstDescendantChain(view: View): ViewGroup? {
@@ -23,20 +22,4 @@ object ViewFinder {
23
22
 
24
23
  return null
25
24
  }
26
-
27
- fun findScreenStackInFirstDescendantChain(view: View): ScreenStack? {
28
- var currentView: View? = view
29
-
30
- while (currentView != null) {
31
- if (currentView is ScreenStack) {
32
- return currentView
33
- } else if (currentView is ViewGroup && currentView.isNotEmpty()) {
34
- currentView = currentView.getChildAt(0)
35
- } else {
36
- break
37
- }
38
- }
39
-
40
- return null
41
- }
42
25
  }
@@ -27,6 +27,9 @@ import com.google.android.material.shape.CornerFamily
27
27
  import com.google.android.material.shape.MaterialShapeDrawable
28
28
  import com.google.android.material.shape.ShapeAppearanceModel
29
29
  import com.swmansion.rnscreens.common.FragmentProviding
30
+ import com.swmansion.rnscreens.common.container.Container
31
+ import com.swmansion.rnscreens.common.container.ContainerItem
32
+ import com.swmansion.rnscreens.common.container.ContainerItemSupport
30
33
  import com.swmansion.rnscreens.legacy.bottomsheet.SheetAnimationCoordinator
31
34
  import com.swmansion.rnscreens.legacy.bottomsheet.SheetDetents
32
35
  import com.swmansion.rnscreens.legacy.bottomsheet.fitToContentsSheetHeight
@@ -46,7 +49,10 @@ class Screen(
46
49
  val reactContext: ThemedReactContext,
47
50
  ) : FabricEnabledViewGroup(reactContext),
48
51
  ScreenContentWrapper.OnLayoutCallback,
49
- FragmentProviding {
52
+ FragmentProviding,
53
+ ContainerItem {
54
+ private val containerItemSupport = ContainerItemSupport()
55
+
50
56
  val fragment: Fragment?
51
57
  get() = fragmentWrapper?.fragment
52
58
 
@@ -236,7 +242,7 @@ class Screen(
236
242
  ) {
237
243
  // In case of form sheet we get layout notification a bit later, in `onBottomSheetBehaviorDidLayout`
238
244
  // after the attached behaviour laid out this view.
239
- if (changed && isNativeStackScreen && !usesFormSheetPresentation()) {
245
+ if ((changed || isStateInvalidated) && isNativeStackScreen && !usesFormSheetPresentation()) {
240
246
  val width = r - l
241
247
  val height = b - t
242
248
 
@@ -565,6 +571,13 @@ class Screen(
565
571
  updateShadowNodeScreenSize(width, height, top + translationY.toInt())
566
572
  }
567
573
 
574
+ override fun onDetachedFromWindow() {
575
+ super.onDetachedFromWindow()
576
+ // Rotation may reset the shadow state while this screen is covered. Republish it on the
577
+ // next layout, even if the native frame is identical to the one before detaching.
578
+ invalidateState()
579
+ }
580
+
568
581
  override fun onAttachedToWindow() {
569
582
  super.onAttachedToWindow()
570
583
 
@@ -619,6 +632,20 @@ class Screen(
619
632
  }
620
633
  }
621
634
 
635
+ // region ContainerItem
636
+
637
+ override fun registerNestedContainer(container: Container) = containerItemSupport.registerNestedContainer(container)
638
+
639
+ override fun unregisterNestedContainer(container: Container) = containerItemSupport.unregisterNestedContainer(container)
640
+
641
+ override fun resolveNestedContainer(): Container? = containerItemSupport.resolveNestedContainer()
642
+
643
+ override fun findContentScrollView(): ViewGroup? = containerItemSupport.findContentScrollView(this)
644
+
645
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? = resolveNestedContainer()?.wantsToPreventStackNativeDismiss()
646
+
647
+ // endregion
648
+
622
649
  enum class StackPresentation {
623
650
  PUSH,
624
651
  MODAL,