react-native-screens 5.0.0-alpha.2 → 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 (456) hide show
  1. package/Package.swift +87 -0
  2. package/README.md +0 -11
  3. package/android/build.gradle +1 -0
  4. package/android/consumer-rules.pro +3 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
  6. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
  7. package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
  8. package/android/src/main/cpp/NativeProxy.cpp +30 -6
  9. package/android/src/main/cpp/NativeProxy.h +7 -1
  10. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
  12. package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +17 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +51 -20
  20. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -8
  23. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetAvailableHeightProvider.kt +44 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
  25. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +36 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetDialogManager.kt +107 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
  28. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
  29. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +3 -1
  30. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/model/FormSheetDetents.kt +152 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +9 -10
  33. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDimmingManager.kt +103 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDismissalOrigin.kt +22 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentation.kt +173 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentationManager.kt +290 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +2 -2
  38. package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetStackRegistry.kt +28 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
  41. package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
  43. package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
  44. package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +32 -3
  45. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
  46. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +15 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
  53. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
  54. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
  57. package/android/src/main/java/com/swmansion/rnscreens/react/modals/formsheet/event/FormSheetDismissEvent.kt +29 -0
  58. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
  64. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
  65. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +17 -10
  66. package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +11 -9
  67. package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
  68. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
  69. package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
  70. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +360 -101
  71. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
  72. package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +211 -113
  73. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +156 -24
  74. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
  75. package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
  76. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
  77. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +162 -228
  78. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +385 -12
  79. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -6
  80. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +29 -6
  81. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
  82. package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +8 -7
  83. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +27 -280
  84. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
  85. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
  86. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +28 -20
  87. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +3 -55
  88. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +1 -10
  89. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuItemConfig.kt +1 -3
  90. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
  91. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +57 -6
  92. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +3 -1
  93. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +1 -0
  94. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +4 -3
  95. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueue.kt +23 -9
  96. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
  97. package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
  98. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +159 -21
  99. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
  100. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
  101. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +27 -5
  102. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
  103. package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
  104. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
  105. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +4 -0
  106. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +50 -10
  107. package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
  108. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
  109. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +46 -7
  110. package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
  111. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
  112. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
  113. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +72 -36
  114. package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
  115. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +22 -2
  116. package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
  117. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +58 -17
  118. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
  119. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
  120. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
  121. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
  122. package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
  123. package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +20 -6
  124. package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
  125. package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
  126. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
  127. package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
  128. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
  129. package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
  130. package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
  131. package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
  132. package/ios/RNSEnums.h +16 -1
  133. package/ios/conversion/RNSConversions.h +7 -108
  134. package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
  135. package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
  136. package/ios/legacy/RNSBarButtonItem.mm +15 -0
  137. package/ios/legacy/RNSConvert.h +6 -0
  138. package/ios/legacy/RNSConvert.mm +17 -0
  139. package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
  140. package/ios/legacy/RNSModalScreen.mm +1 -1
  141. package/ios/legacy/RNSNavigationBar.h +31 -0
  142. package/ios/legacy/RNSNavigationBar.mm +15 -0
  143. package/ios/legacy/RNSScreen.mm +130 -31
  144. package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
  145. package/ios/legacy/RNSScreenStack.mm +202 -15
  146. package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
  147. package/ios/legacy/RNSScreenStackHeaderConfig.mm +72 -17
  148. package/ios/legacy/RNSScreenStackHeaderSubview.mm +34 -1
  149. package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
  150. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
  151. package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
  152. package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
  153. package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
  154. package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
  155. package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
  156. package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
  157. package/ios/safe-area/RNSSafeAreaViewComponentView.mm +3 -14
  158. package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
  159. package/ios/split/RNSSplitAppearanceApplicator.h +4 -4
  160. package/ios/split/RNSSplitAppearanceApplicator.mm +53 -56
  161. package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
  162. package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
  163. package/ios/split/RNSSplitHostComponentView.h +5 -15
  164. package/ios/split/RNSSplitHostComponentView.mm +55 -6
  165. package/ios/split/RNSSplitHostController.h +25 -6
  166. package/ios/split/RNSSplitHostController.mm +24 -92
  167. package/ios/split/RNSSplitHostProviders.h +67 -0
  168. package/ios/split/RNSSplitScreenComponentView.h +0 -39
  169. package/ios/split/RNSSplitScreenComponentView.mm +27 -10
  170. package/ios/split/RNSSplitScreenController.h +26 -3
  171. package/ios/split/RNSSplitScreenController.mm +13 -30
  172. package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
  173. package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
  174. package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
  175. package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
  176. package/ios/stack/conversion/RNSConversions-Stack.h +62 -0
  177. package/ios/stack/conversion/RNSConversions-Stack.mm +134 -0
  178. package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
  179. package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
  180. package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
  181. package/ios/stack/header/RNSStackHeaderConfigComponentView.h +14 -1
  182. package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +103 -37
  183. package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +11 -0
  184. package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
  185. package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
  186. package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
  187. package/ios/stack/header/RNSStackHeaderItemComponentView.h +12 -3
  188. package/ios/stack/header/RNSStackHeaderItemComponentView.mm +72 -5
  189. package/ios/stack/header/RNSStackHeaderItemDataProviding.h +7 -0
  190. package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
  191. package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
  192. package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
  193. package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
  194. package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
  195. package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
  196. package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
  197. package/ios/stack/host/RNSStackNavigationBar.h +25 -0
  198. package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
  199. package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
  200. package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
  201. package/ios/stack/host/RNSStackNavigationController.mm +13 -5
  202. package/ios/stack/host/RNSStackOperation.h +0 -2
  203. package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
  204. package/ios/stack/screen/RNSStackScreenComponentView.mm +32 -2
  205. package/ios/stack/screen/RNSStackScreenController.mm +12 -0
  206. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +8 -0
  207. package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +179 -24
  208. package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +110 -16
  209. package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
  210. package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
  211. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
  212. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +1 -1
  213. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +1 -1
  214. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
  215. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
  216. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
  217. package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
  218. package/ios/tabs/conversion/RNSConversions-Tabs.h +100 -0
  219. package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +105 -74
  220. package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
  221. package/ios/tabs/host/RNSTabBarController.h +16 -0
  222. package/ios/tabs/host/RNSTabBarController.mm +516 -107
  223. package/ios/tabs/host/RNSTabsHostComponentView.h +4 -0
  224. package/ios/tabs/host/RNSTabsHostComponentView.mm +41 -4
  225. package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
  226. package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
  227. package/ios/tabs/screen/RNSTabsScreenComponentView.mm +56 -56
  228. package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
  229. package/ios/utils/RNSDefines.h +15 -7
  230. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +37 -21
  231. package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  232. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +41 -4
  233. package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  234. package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
  235. package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
  236. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  237. package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  238. package/lib/commonjs/components/stack/host/StackHost.js +17 -7
  239. package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
  240. package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
  241. package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
  242. package/lib/commonjs/components/stack/index.js.map +1 -1
  243. package/lib/commonjs/components/tabs/host/TabsHost.ios.js +3 -0
  244. package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
  245. package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
  246. package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
  247. package/lib/commonjs/components/tabs/index.js.map +1 -1
  248. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
  249. package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
  250. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
  251. package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  252. package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
  253. package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
  254. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
  255. package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  256. package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  257. package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  258. package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  259. package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  260. package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  261. package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
  262. package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  263. package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  264. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  265. package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  266. package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
  267. package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
  268. package/lib/module/components/stack/header/StackHeaderConfig.android.js +39 -23
  269. package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
  270. package/lib/module/components/stack/header/StackHeaderConfig.ios.js +43 -6
  271. package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
  272. package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
  273. package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
  274. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
  275. package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
  276. package/lib/module/components/stack/host/StackHost.js +18 -8
  277. package/lib/module/components/stack/host/StackHost.js.map +1 -1
  278. package/lib/module/components/stack/host/StackHost.web.js +0 -3
  279. package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
  280. package/lib/module/components/stack/index.js.map +1 -1
  281. package/lib/module/components/tabs/host/TabsHost.ios.js +3 -0
  282. package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
  283. package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
  284. package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
  285. package/lib/module/components/tabs/index.js.map +1 -1
  286. package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
  287. package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
  288. package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
  289. package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
  290. package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
  291. package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
  292. package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
  293. package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
  294. package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
  295. package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
  296. package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
  297. package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
  298. package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
  299. package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
  300. package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
  301. package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
  302. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
  303. package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
  304. package/lib/module/legacy/components/ScreenStackItem.js +31 -11
  305. package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
  306. package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +1 -1
  307. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
  308. package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
  309. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +620 -24
  310. package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
  311. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
  312. package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
  313. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
  314. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
  315. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +361 -2
  316. package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
  317. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +4 -2
  318. package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
  319. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
  320. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +7 -0
  321. package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
  322. package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
  323. package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
  324. package/lib/typescript/components/stack/host/StackHost.types.d.ts +47 -0
  325. package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
  326. package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
  327. package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
  328. package/lib/typescript/components/stack/index.d.ts +4 -3
  329. package/lib/typescript/components/stack/index.d.ts.map +1 -1
  330. package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
  331. package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
  332. package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
  333. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +72 -0
  334. package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
  335. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
  336. package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
  337. package/lib/typescript/components/tabs/index.d.ts +4 -6
  338. package/lib/typescript/components/tabs/index.d.ts.map +1 -1
  339. package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
  340. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
  341. package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
  342. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
  343. package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
  344. package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
  345. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
  346. package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
  347. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
  348. package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
  349. package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
  350. package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
  351. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
  352. package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  353. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
  354. package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
  355. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +52 -0
  356. package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
  357. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +29 -1
  358. package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
  359. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +8 -0
  360. package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
  361. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +3 -1
  362. package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
  363. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +4 -0
  364. package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
  365. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
  366. package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
  367. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
  368. package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
  369. package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
  370. package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
  371. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
  372. package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
  373. package/lib/typescript/legacy/types.d.ts +30 -0
  374. package/lib/typescript/legacy/types.d.ts.map +1 -1
  375. package/package.json +11 -8
  376. package/react-native.config.js +3 -0
  377. package/src/components/modals/form-sheet/FormSheet.types.ts +1 -1
  378. package/src/components/stack/header/StackHeaderConfig.android.tsx +54 -43
  379. package/src/components/stack/header/StackHeaderConfig.android.types.ts +641 -24
  380. package/src/components/stack/header/StackHeaderConfig.ios.tsx +55 -17
  381. package/src/components/stack/header/StackHeaderConfig.ios.types.ts +384 -2
  382. package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
  383. package/src/components/stack/header/StackHeaderConfig.types.ts +4 -2
  384. package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
  385. package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +7 -0
  386. package/src/components/stack/host/StackHost.tsx +12 -3
  387. package/src/components/stack/host/StackHost.types.ts +50 -0
  388. package/src/components/stack/host/StackHost.web.tsx +1 -4
  389. package/src/components/stack/index.ts +14 -1
  390. package/src/components/tabs/host/TabsHost.ios.tsx +3 -0
  391. package/src/components/tabs/host/TabsHost.ios.types.ts +76 -0
  392. package/src/components/tabs/host/TabsHost.tsx +7 -0
  393. package/src/components/tabs/host/TabsHost.types.ts +3 -0
  394. package/src/components/tabs/index.ts +9 -0
  395. package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
  396. package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
  397. package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
  398. package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
  399. package/src/components/tabs/screen/TabsScreen.tsx +7 -0
  400. package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
  401. package/src/components/tabs/screen/index.ts +1 -0
  402. package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
  403. package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
  404. package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +78 -0
  405. package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +43 -0
  406. package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +13 -0
  407. package/src/fabric/stack/StackHostNativeComponent.ts +11 -2
  408. package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -0
  409. package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
  410. package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
  411. package/src/legacy/components/ScreenStackItem.tsx +59 -12
  412. package/src/legacy/types.ts +31 -0
  413. package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
  414. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
  415. package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
  416. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
  417. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
  418. package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
  419. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +0 -134
  420. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +0 -162
  421. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +0 -106
  422. package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +0 -198
  423. package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuSelectionController.kt +0 -83
  424. package/ios/conversion/RNSConversions-Stack.h +0 -32
  425. package/ios/conversion/RNSConversions-Stack.mm +0 -41
  426. package/ios/conversion/always_false.h +0 -31
  427. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
  428. package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  429. package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
  430. package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
  431. package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
  432. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
  433. package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
  434. package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
  435. package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
  436. package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
  437. package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
  438. package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
  439. package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
  440. package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
  441. package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
  442. package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
  443. package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
  444. package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
  445. package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
  446. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
  447. package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
  448. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
  449. package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
  450. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
  451. package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
  452. package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
  453. package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
  454. package/src/components/tabs/host/TabsHost.d.ts +0 -12
  455. package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
  456. /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
@@ -2,18 +2,25 @@ package com.swmansion.rnscreens.stack.host
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.content.Context
5
+ import android.content.res.Configuration
5
6
  import android.util.Log
6
7
  import android.view.ViewGroup
7
8
  import android.widget.FrameLayout
8
9
  import androidx.fragment.app.Fragment
9
10
  import androidx.fragment.app.FragmentManager
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
12
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeCoordinator
13
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeListener
14
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeProviding
10
15
  import com.swmansion.rnscreens.common.container.Container
16
+ import com.swmansion.rnscreens.common.container.ContainerItem
11
17
  import com.swmansion.rnscreens.common.container.ParentContainerItemRegistry
12
18
  import com.swmansion.rnscreens.ext.isMeasured
13
- import com.swmansion.rnscreens.helpers.FragmentManagerHelper
14
19
  import com.swmansion.rnscreens.helpers.ViewIdGenerator
20
+ import com.swmansion.rnscreens.stack.header.StackHeaderBackPressHandler
15
21
  import com.swmansion.rnscreens.stack.screen.StackScreen
16
22
  import com.swmansion.rnscreens.stack.screen.StackScreenFragment
23
+ import com.swmansion.rnscreens.stack.screen.StackScreenFragmentDelegate
17
24
  import com.swmansion.rnscreens.utils.RNSLog
18
25
  import java.lang.ref.WeakReference
19
26
 
@@ -23,7 +30,11 @@ internal class StackContainer(
23
30
  private val delegate: WeakReference<StackContainerDelegate>,
24
31
  ) : FrameLayout(context),
25
32
  Container,
26
- FragmentManager.OnBackStackChangedListener {
33
+ FragmentManager.OnBackStackChangedListener,
34
+ ColorSchemeProviding,
35
+ StackHeaderBackPressHandler,
36
+ StackScreenFragmentDelegate,
37
+ StackUpdateBatchStateProviding {
27
38
  private var fragmentManager: FragmentManager? = null
28
39
 
29
40
  private fun requireFragmentManager(): FragmentManager =
@@ -51,6 +62,20 @@ internal class StackContainer(
51
62
  private val fragmentOpExecutor: FragmentOperationExecutor = FragmentOperationExecutor()
52
63
  private val fragmentOps: MutableList<FragmentOperation> = arrayListOf()
53
64
 
65
+ // region Color Scheme
66
+
67
+ private val colorSchemeCoordinator = ColorSchemeCoordinator()
68
+
69
+ internal var colorScheme: ColorScheme by colorSchemeCoordinator::colorScheme
70
+
71
+ override fun getResolvedUiNightMode() = colorSchemeCoordinator.getResolvedUiNightMode()
72
+
73
+ override fun addColorSchemeListener(listener: ColorSchemeListener) = colorSchemeCoordinator.addColorSchemeListener(listener)
74
+
75
+ override fun removeColorSchemeListener(listener: ColorSchemeListener) = colorSchemeCoordinator.removeColorSchemeListener(listener)
76
+
77
+ // endregion
78
+
54
79
  init {
55
80
  id = ViewIdGenerator.generateViewId()
56
81
  }
@@ -60,7 +85,11 @@ internal class StackContainer(
60
85
  super.onAttachedToWindow()
61
86
 
62
87
  parentContainerRegistry.attach(this)
63
- setupFragmentManger()
88
+ setupFragmentManager()
89
+
90
+ // StackContainer only provides container-level color scheme configuration for its screens
91
+ // but doesn't use any color scheme-dependent views, so we don't need the callback.
92
+ colorSchemeCoordinator.setup(this, null)
64
93
 
65
94
  // Following line works with a couple of assumptions.
66
95
  // First, that this view is laid out by our parent view, which is a component view.
@@ -81,27 +110,60 @@ internal class StackContainer(
81
110
  requireFragmentManager().removeOnBackStackChangedListener(this)
82
111
  fragmentManager = null
83
112
  parentContainerRegistry.detach(this)
113
+ colorSchemeCoordinator.teardown()
84
114
  }
85
115
 
86
- internal fun setupFragmentManger() {
116
+ override fun onConfigurationChanged(newConfig: Configuration?) {
117
+ super.onConfigurationChanged(newConfig)
118
+ colorSchemeCoordinator.onConfigurationChanged(newConfig)
119
+ }
120
+
121
+ override fun onFragmentConfigurationChanged(config: Configuration) = onConfigurationChanged(config)
122
+
123
+ internal fun setupFragmentManager() {
87
124
  fragmentManager =
88
- checkNotNull(FragmentManagerHelper.findFragmentManagerForView(this)) {
89
- "[RNScreens] Nullish fragment manager - can't run container operations"
90
- }.also {
125
+ checkNotNull(delegate.get()) {
126
+ "[RNScreens] StackContainer has no delegate to resolve the fragment manager from"
127
+ }.resolveFragmentManager().also {
91
128
  it.addOnBackStackChangedListener(this)
92
129
  }
93
130
  }
94
131
 
132
+ // region Update batch
133
+
134
+ override var isUpdatePending: Boolean = false
135
+ private set
136
+
137
+ /**
138
+ * Announces that more updates are coming. Header updates raised until [endUpdateBatch]
139
+ * are held and applied together with the navigation operations of the batch.
140
+ */
141
+ internal fun beginUpdateBatch() {
142
+ isUpdatePending = true
143
+ }
144
+
145
+ internal fun endUpdateBatch() {
146
+ isUpdatePending = false
147
+ performContainerUpdateIfNeeded()
148
+ }
149
+
150
+ // endregion
151
+
95
152
  /**
96
- * Call this function to trigger container update
153
+ * Applies pending navigation operations and then pending header updates of the screens
154
+ * remaining in the stack.
97
155
  */
98
156
  internal fun performContainerUpdateIfNeeded() {
99
157
  // If container update is requested before container is attached to window, we ignore
100
158
  // the call because we don't have valid fragmentManager yet.
101
159
  // Update will be eventually executed in onAttachedToWindow().
102
- if (hasPendingOperations && isAttachedToWindow) {
160
+ if (!isAttachedToWindow) {
161
+ return
162
+ }
163
+ if (hasPendingOperations) {
103
164
  performOperations(requireFragmentManager())
104
165
  }
166
+ stackModel.forEach { it.flushPendingHeaderUpdates() }
105
167
  }
106
168
 
107
169
  internal fun enqueuePushOperation(stackScreen: StackScreen) {
@@ -164,13 +226,15 @@ internal class StackContainer(
164
226
  }
165
227
 
166
228
  pendingPushOperations.forEach { operation ->
167
- val newFragment = createFragmentForScreen(operation.screen, canNavigateBack = stackModel.isNotEmpty())
229
+ val newFragment =
230
+ createFragmentForScreen(operation.screen, canNavigateBack = stackModel.isNotEmpty())
168
231
 
169
232
  fragmentOps.add(
170
233
  AddAndSetAsPrimaryOp(
171
234
  newFragment,
172
235
  containerViewId = this.id,
173
236
  addToBackStack = stackModel.isNotEmpty(),
237
+ coveredFragment = stackModel.lastOrNull(),
174
238
  ),
175
239
  )
176
240
  stackModel.add(newFragment)
@@ -195,9 +259,9 @@ internal class StackContainer(
195
259
  }
196
260
 
197
261
  private fun dumpStackModel() {
198
- Log.d(TAG, "StackContainer [$id] MODEL BEGIN")
262
+ RNSLog.d(TAG, "StackContainer [$id] MODEL BEGIN")
199
263
  stackModel.forEach {
200
- Log.d(TAG, "${it.stackScreen.screenKey}")
264
+ RNSLog.d(TAG, "${it.stackScreen.screenKey}")
201
265
  }
202
266
  }
203
267
 
@@ -205,21 +269,27 @@ internal class StackContainer(
205
269
  screen: StackScreen,
206
270
  canNavigateBack: Boolean,
207
271
  ): StackScreenFragment =
208
- StackScreenFragment(screen, canNavigateBack).also {
209
- Log.d(TAG, "Created Fragment $it for screen ${screen.screenKey}")
272
+ StackScreenFragment(
273
+ screen,
274
+ canNavigateBack,
275
+ WeakReference(this),
276
+ backPressHandler = WeakReference(this),
277
+ updateBatchStateProvider = WeakReference(this),
278
+ colorSchemeProvider = WeakReference(this),
279
+ ).also {
280
+ RNSLog.d(TAG, "Created Fragment $it for screen ${screen.screenKey}")
210
281
  }
211
282
 
212
283
  private fun updateTopFragment() {
213
- // We try to handle situation where other fragments might be present.
214
- val fragmentManager = requireFragmentManager()
215
- val fragments = fragmentManager.fragments.filterIsInstance<StackScreenFragment>()
216
- check(fragments.isNotEmpty()) { "[RNScreens] Empty fragment manager while attempting to update top fragment" }
217
- fragments.forEach { it.onResignTopFragment() }
218
- fragments.last().onBecomeTopFragment()
284
+ // Covered fragments are detached, so FragmentManager's added list holds only the top
285
+ // fragment - the model is the only place all of them can be resigned from.
286
+ check(stackModel.isNotEmpty()) { "[RNScreens] Empty stack model while attempting to update top fragment" }
287
+ stackModel.forEach { it.onResignTopFragment() }
288
+ stackModel.last().onBecomeTopFragment()
219
289
 
220
290
  // This assumes that the updateTopFragment is called already after primary nav frag. is updated.
221
291
  // If this needs to be changed in the future, just remove this assertion.
222
- check(fragmentManager.primaryNavigationFragment === fragments.last()) {
292
+ check(requireFragmentManager().primaryNavigationFragment === stackModel.last()) {
223
293
  "[RNScreens] Top fragment different from primary navigation fragment"
224
294
  }
225
295
  }
@@ -290,6 +360,74 @@ internal class StackContainer(
290
360
  ?.stackScreen
291
361
  ?.findContentScrollView()
292
362
 
363
+ // Asked when this container's whole subtree is about to be dismissed (the screen
364
+ // hosting this container is popped) - every item gets a vote, back-to-front, so
365
+ // the deepest preventing screen wins.
366
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? =
367
+ stackModel
368
+ .asReversed()
369
+ .firstNotNullOfOrNull { it.stackScreen.wantsToPreventStackNativeDismiss() }
370
+
371
+ // Pop-to-root is not implemented for the v5 stack yet - the request is forwarded to the top screen's
372
+ // nested container.
373
+ override fun requestPopToRoot(): Boolean {
374
+ RNSLog.w(TAG, "[RNScreens] Pop-to-root special effect is not implemented for v5 stack yet")
375
+ return stackModel
376
+ .lastOrNull()
377
+ ?.stackScreen
378
+ ?.resolveNestedContainer()
379
+ ?.requestPopToRoot() == true
380
+ }
381
+
382
+ // endregion
383
+
384
+ // region Header back button
385
+
386
+ override fun handleHeaderBackButtonPress(pressedScreen: StackScreen) {
387
+ val fragmentManager = fragmentManager
388
+ if (fragmentManager == null) {
389
+ Log.w(TAG, "[RNScreens] Ignoring header back button press - container is detached")
390
+ return
391
+ }
392
+
393
+ val topScreen = stackModel.lastOrNull()?.stackScreen
394
+ if (topScreen !== pressedScreen || stackModel.size <= 1) {
395
+ Log.w(
396
+ TAG,
397
+ "[RNScreens] Ignoring header back button press for non-top screen ${pressedScreen.screenKey}",
398
+ )
399
+ return
400
+ }
401
+
402
+ // This pop dismisses only the top screen (together with its subtree), therefore
403
+ // only the top item is asked - screens below the top get no vote at this level.
404
+ val vetoingItem = topScreen.wantsToPreventStackNativeDismiss()
405
+ if (vetoingItem != null) {
406
+ // Only a StackScreen can veto - TabsScreen has no own flag and only forwards.
407
+ val vetoingScreen = vetoingItem as? StackScreen
408
+ if (vetoingScreen != null) {
409
+ vetoingScreen.onNativeDismissPrevented()
410
+ } else {
411
+ Log.w(
412
+ TAG,
413
+ "[RNScreens] Unexpected vetoing item type: ${vetoingItem.javaClass.simpleName}",
414
+ )
415
+ }
416
+ return
417
+ }
418
+
419
+ // Mirrors FragmentManager's internal OnBackPressedCallback, which also runs
420
+ // popBackStackImmediate. The synchronous pop makes the top-screen guard above
421
+ // reliable against double taps: onBackStackChangeCommitted -> onNativeFragmentPop
422
+ // updates stackModel before this call returns.
423
+ fragmentManager.popBackStackImmediate(
424
+ // key MUST BE present, otherwise the navigation action will be delegated to child primary navigation
425
+ // fragment.
426
+ checkNotNull(pressedScreen.screenKey) { "[RNScreens] Screen key is required" },
427
+ FragmentManager.POP_BACK_STACK_INCLUSIVE,
428
+ )
429
+ }
430
+
293
431
  // endregion
294
432
 
295
433
  companion object {
@@ -1,7 +1,14 @@
1
1
  package com.swmansion.rnscreens.stack.host
2
2
 
3
+ import androidx.fragment.app.FragmentManager
3
4
  import com.swmansion.rnscreens.stack.screen.StackScreen
4
5
 
5
6
  internal interface StackContainerDelegate {
6
7
  fun onScreenDismissCommitted(stackScreen: StackScreen)
8
+
9
+ /**
10
+ * Resolves the fragment manager the container should run its operations on. Called every time the container
11
+ * is attached to a window, as the result may differ between attachments.
12
+ */
13
+ fun resolveFragmentManager(): FragmentManager
7
14
  }
@@ -16,7 +16,11 @@ internal class StackContainerUpdateCoordinator {
16
16
  pendingPopOperations.add(PopOperation(stackScreen))
17
17
  }
18
18
 
19
- internal fun executePendingOperationsIfNeeded(
19
+ /**
20
+ * Hands the pending operations to the container in stack order. The container applies
21
+ * them on its next update.
22
+ */
23
+ internal fun enqueuePendingOperations(
20
24
  container: StackContainer,
21
25
  renderedScreens: List<StackScreen>,
22
26
  ) {
@@ -35,8 +39,6 @@ internal class StackContainerUpdateCoordinator {
35
39
  .sortedBy { it.first }
36
40
  .forEach { (_, operation) -> container.enqueuePushOperation(operation.screen) }
37
41
 
38
- container.performContainerUpdateIfNeeded()
39
-
40
42
  pendingPopOperations.clear()
41
43
  pendingPushOperations.clear()
42
44
  }
@@ -1,13 +1,15 @@
1
1
  package com.swmansion.rnscreens.stack.host
2
2
 
3
3
  import android.annotation.SuppressLint
4
- import android.util.Log
5
4
  import android.view.ViewGroup
5
+ import androidx.fragment.app.FragmentManager
6
6
  import com.facebook.react.bridge.UIManager
7
7
  import com.facebook.react.bridge.UIManagerListener
8
8
  import com.facebook.react.common.annotations.UnstableReactNativeAPI
9
9
  import com.facebook.react.uimanager.ThemedReactContext
10
10
  import com.facebook.react.uimanager.UIManagerHelper
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
12
+ import com.swmansion.rnscreens.helpers.FragmentManagerHelper
11
13
  import com.swmansion.rnscreens.helpers.getFabricUIManagerNotNull
12
14
  import com.swmansion.rnscreens.stack.screen.StackScreen
13
15
  import com.swmansion.rnscreens.utils.RNSLog
@@ -26,6 +28,8 @@ class StackHost(
26
28
  private val containerUpdateCoordinator = StackContainerUpdateCoordinator()
27
29
  private var isLayoutEnqueued = false
28
30
 
31
+ internal var colorScheme: ColorScheme by container::colorScheme
32
+
29
33
  init {
30
34
  addView(container)
31
35
 
@@ -77,7 +81,7 @@ class StackHost(
77
81
  // This shouldn't happen in typical scenarios but it can happen with fast-refresh.
78
82
  containerUpdateCoordinator.addPopOperation(stackScreen)
79
83
  } else {
80
- Log.d(TAG, "Ignoring pop operation of ${stackScreen.screenKey}, already not attached or natively dismissed")
84
+ RNSLog.d(TAG, "Ignoring pop operation of ${stackScreen.screenKey}, already not attached or natively dismissed")
81
85
  }
82
86
  }
83
87
 
@@ -94,6 +98,11 @@ class StackHost(
94
98
  }
95
99
  }
96
100
 
101
+ override fun resolveFragmentManager(): FragmentManager =
102
+ checkNotNull(FragmentManagerHelper.findFragmentManagerForView(this)) {
103
+ "[RNScreens] Nullish fragment manager - can't run container operations"
104
+ }
105
+
97
106
  override fun onMeasure(
98
107
  widthMeasureSpec: Int,
99
108
  heightMeasureSpec: Int,
@@ -119,6 +128,16 @@ class StackHost(
119
128
  refreshLayout()
120
129
  }
121
130
 
131
+ // On window configuration changes ViewRootImpl calls forceLayout() recursively on every view
132
+ // in the hierarchy, bypassing requestLayout(). React views never lay out their children during
133
+ // framework traversals, so nothing would clear the force-layout flags in our subtree — and once
134
+ // they are set, any subsequent requestLayout() from a descendant short-circuits before reaching
135
+ // the override above, permanently disabling the manual pass. Schedule it from here as well.
136
+ override fun forceLayout() {
137
+ super.forceLayout()
138
+ refreshLayout()
139
+ }
140
+
122
141
  private fun refreshLayout() {
123
142
  if (!isLayoutEnqueued) {
124
143
  isLayoutEnqueued = true
@@ -148,14 +167,17 @@ class StackHost(
148
167
  container.layout(left, top, right, bottom)
149
168
  }
150
169
 
170
+ override fun willMountItems(uiManager: UIManager) {
171
+ container.beginUpdateBatch()
172
+ }
173
+
151
174
  override fun didMountItems(uiManager: UIManager) {
152
- containerUpdateCoordinator.executePendingOperationsIfNeeded(container, renderedScreens)
175
+ containerUpdateCoordinator.enqueuePendingOperations(container, renderedScreens)
176
+ container.endUpdateBatch()
153
177
  }
154
178
 
155
179
  override fun willDispatchViewUpdates(uiManager: UIManager) = Unit
156
180
 
157
- override fun willMountItems(uiManager: UIManager) = Unit
158
-
159
181
  override fun didDispatchMountItems(uiManager: UIManager) = Unit
160
182
 
161
183
  override fun didScheduleMountItems(uiManager: UIManager) = Unit
@@ -1,12 +1,14 @@
1
1
  package com.swmansion.rnscreens.stack.host
2
2
 
3
3
  import android.view.View
4
+ import com.facebook.react.bridge.JSApplicationIllegalArgumentException
4
5
  import com.facebook.react.module.annotations.ReactModule
5
6
  import com.facebook.react.uimanager.ThemedReactContext
6
7
  import com.facebook.react.uimanager.ViewGroupManager
7
8
  import com.facebook.react.uimanager.ViewManagerDelegate
8
9
  import com.facebook.react.viewmanagers.RNSStackHostManagerDelegate
9
10
  import com.facebook.react.viewmanagers.RNSStackHostManagerInterface
11
+ import com.swmansion.rnscreens.common.colorscheme.ColorScheme
10
12
  import com.swmansion.rnscreens.stack.screen.StackScreen
11
13
 
12
14
  @ReactModule(name = StackHostViewManager.REACT_CLASS)
@@ -70,6 +72,18 @@ class StackHostViewManager :
70
72
  */
71
73
  override fun needsCustomLayoutForChildren() = true
72
74
 
75
+ override fun setColorScheme(
76
+ view: StackHost,
77
+ value: String?,
78
+ ) {
79
+ when (value) {
80
+ null, "inherit" -> view.colorScheme = ColorScheme.INHERIT
81
+ "light" -> view.colorScheme = ColorScheme.LIGHT
82
+ "dark" -> view.colorScheme = ColorScheme.DARK
83
+ else -> throw JSApplicationIllegalArgumentException("[RNScreens] Invalid color scheme: $value.")
84
+ }
85
+ }
86
+
73
87
  companion object {
74
88
  const val REACT_CLASS = "RNSStackHost"
75
89
  }
@@ -0,0 +1,10 @@
1
+ package com.swmansion.rnscreens.stack.host
2
+
3
+ /**
4
+ * Tells whether the owner has begun an update batch that has not ended yet.
5
+ * Consumers hold their pending updates while it is `true`; the owner applies
6
+ * them all in one pass when the batch ends.
7
+ */
8
+ internal interface StackUpdateBatchStateProviding {
9
+ val isUpdatePending: Boolean
10
+ }
@@ -1,10 +1,10 @@
1
1
  package com.swmansion.rnscreens.stack.screen
2
2
 
3
- import android.util.Log
4
3
  import androidx.activity.OnBackPressedCallback
5
4
  import androidx.lifecycle.Lifecycle
6
5
  import androidx.lifecycle.LifecycleEventObserver
7
6
  import androidx.lifecycle.LifecycleOwner
7
+ import com.swmansion.rnscreens.utils.RNSLog
8
8
 
9
9
  internal class PreventNativeDismissCallback(
10
10
  lifecycleOwner: LifecycleOwner,
@@ -31,7 +31,7 @@ internal class PreventNativeDismissCallback(
31
31
  }
32
32
 
33
33
  override fun handleOnBackPressed() {
34
- Log.i("RNScreens", "PreventNativeDismissCallback called for screen ${screen.screenKey}")
34
+ RNSLog.i("RNScreens", "PreventNativeDismissCallback called for screen ${screen.screenKey}")
35
35
  screen.onNativeDismissPrevented()
36
36
  }
37
37
 
@@ -175,4 +175,8 @@ class StackScreen(
175
175
  override fun resolveNestedContainer(): Container? = containerItemSupport.resolveNestedContainer()
176
176
 
177
177
  override fun findContentScrollView(): ViewGroup? = containerItemSupport.findContentScrollView(this)
178
+
179
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? =
180
+ resolveNestedContainer()?.wantsToPreventStackNativeDismiss()
181
+ ?: takeIf { isPreventNativeDismissEnabled }
178
182
  }
@@ -1,20 +1,37 @@
1
1
  package com.swmansion.rnscreens.stack.screen
2
2
 
3
+ import android.content.res.Configuration
3
4
  import android.os.Bundle
5
+ import android.util.Log
4
6
  import android.view.Gravity
5
7
  import android.view.LayoutInflater
6
8
  import android.view.View
7
9
  import android.view.ViewGroup
8
10
  import androidx.fragment.app.Fragment
9
11
  import androidx.transition.Slide
12
+ import com.swmansion.rnscreens.common.colorscheme.ColorSchemeProviding
13
+ import com.swmansion.rnscreens.stack.header.StackHeaderBackPressHandler
10
14
  import com.swmansion.rnscreens.stack.header.StackHeaderCoordinatorLayout
15
+ import com.swmansion.rnscreens.stack.host.StackUpdateBatchStateProviding
16
+ import java.lang.ref.WeakReference
11
17
 
12
18
  internal class StackScreenFragment(
13
19
  internal val stackScreen: StackScreen,
14
20
  private val canNavigateBack: Boolean,
21
+ private val delegate: WeakReference<StackScreenFragmentDelegate>,
22
+ private val backPressHandler: WeakReference<StackHeaderBackPressHandler>,
23
+ private val updateBatchStateProvider: WeakReference<StackUpdateBatchStateProviding>,
24
+ private val colorSchemeProvider: WeakReference<ColorSchemeProviding>,
15
25
  ) : Fragment() {
16
26
  private var screenLifecycleEventEmitter: StackScreenAppearanceEventsEmitter? = null
17
27
 
28
+ /**
29
+ * Retained across fragment view destruction (e.g. tab switches detaching the fragment), so that
30
+ * the app bar scroll offset and the built header survive reattachment. FragmentManager removes
31
+ * the view from its container before `onDestroyView`, so `onCreateView` can return it as-is.
32
+ */
33
+ private var headerCoordinatorLayout: StackHeaderCoordinatorLayout? = null
34
+
18
35
  /**
19
36
  * This holds the screen strongly for now. Beware of retain cycle.
20
37
  *
@@ -35,17 +52,34 @@ internal class StackScreenFragment(
35
52
  allowEnterTransitionOverlap = true
36
53
  allowReturnTransitionOverlap = true
37
54
 
38
- enterTransition = Slide(Gravity.RIGHT)
39
- exitTransition = Slide(Gravity.LEFT)
40
- returnTransition = Slide(Gravity.RIGHT)
41
- reenterTransition = Slide(Gravity.LEFT)
55
+ enterTransition = Slide(Gravity.END)
56
+ exitTransition = Slide(Gravity.START)
57
+ returnTransition = Slide(Gravity.END)
58
+ reenterTransition = Slide(Gravity.START)
42
59
  }
43
60
 
44
61
  override fun onCreateView(
45
62
  inflater: LayoutInflater,
46
63
  container: ViewGroup?,
47
64
  savedInstanceState: Bundle?,
48
- ): View = StackHeaderCoordinatorLayout(requireContext(), stackScreen, canNavigateBack)
65
+ ): View {
66
+ headerCoordinatorLayout?.let { return it }
67
+
68
+ return StackHeaderCoordinatorLayout(
69
+ requireContext(),
70
+ stackScreen,
71
+ canNavigateBack,
72
+ updateBatchStateProvider,
73
+ colorSchemeProvider,
74
+ ) { pressedScreen ->
75
+ backPressHandler.get()?.handleHeaderBackButtonPress(pressedScreen)
76
+ ?: Log.w(TAG, "[RNScreens] Header back button press dropped - handler is gone")
77
+ }.also { headerCoordinatorLayout = it }
78
+ }
79
+
80
+ internal fun flushPendingHeaderUpdates() {
81
+ headerCoordinatorLayout?.flushPendingUpdates()
82
+ }
49
83
 
50
84
  override fun onViewCreated(
51
85
  view: View,
@@ -56,21 +90,23 @@ internal class StackScreenFragment(
56
90
  }
57
91
 
58
92
  override fun onDestroyView() {
59
- val coordinatorLayout = view
60
- check(coordinatorLayout is StackHeaderCoordinatorLayout) {
61
- "[RNScreens] Unexpected fragment view type: $view"
62
- }
63
- coordinatorLayout.tearDown()
64
93
  super.onDestroyView()
65
94
  screenLifecycleEventEmitter = null
66
95
  }
67
96
 
68
97
  override fun onDestroy() {
69
98
  super.onDestroy()
99
+ headerCoordinatorLayout?.tearDown()
100
+ headerCoordinatorLayout = null
70
101
  stackScreen.onDismiss()
71
102
  teardownPreventNativeDismissCallback()
72
103
  }
73
104
 
105
+ override fun onConfigurationChanged(newConfig: Configuration) {
106
+ super.onConfigurationChanged(newConfig)
107
+ delegate.get()?.onFragmentConfigurationChanged(newConfig)
108
+ }
109
+
74
110
  /**
75
111
  * Notifies this fragment that it has become "top fragment" in its fragment manager.
76
112
  * Call this only if the lifecycle of the fragment is at least at CREATED.
@@ -109,4 +145,8 @@ internal class StackScreenFragment(
109
145
  requireNativeDismissBackPressedCallback.remove()
110
146
  preventNativeDismissBackPressedCallback = null
111
147
  }
148
+
149
+ companion object {
150
+ private const val TAG = "StackScreenFragment"
151
+ }
112
152
  }
@@ -0,0 +1,12 @@
1
+ package com.swmansion.rnscreens.stack.screen
2
+
3
+ import android.content.res.Configuration
4
+
5
+ internal interface StackScreenFragmentDelegate {
6
+ /**
7
+ * Notifies the delegate that the fragment received a configuration update,
8
+ * e.g. theme change from JS via Appearance.setColorScheme. Fragments are
9
+ * the only place where such updates are delivered reliably.
10
+ */
11
+ fun onFragmentConfigurationChanged(config: Configuration)
12
+ }