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
@@ -1,134 +0,0 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.coordinator
2
-
3
- import android.view.ViewGroup
4
- import android.widget.FrameLayout
5
- import androidx.core.view.ViewCompat
6
- import androidx.core.view.WindowInsetsCompat
7
- import androidx.core.view.doOnLayout
8
- import com.google.android.material.bottomsheet.BottomSheetDialog
9
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetContainer
10
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
11
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
12
-
13
- internal class FormSheetDimensionsCoordinator(
14
- private val dialog: BottomSheetDialog,
15
- private val container: FormSheetContainer,
16
- private val bottomSheetView: FrameLayout?,
17
- private val behaviorController: FormSheetBehaviorController?,
18
- ) : FormSheetContentSizeChangeDelegate {
19
- private var lastTopInset = 0
20
- private var lastBottomInset = 0
21
- private var currentDetents: FormSheetDetents? = null
22
- private var currentInitialDetentIndex: Int = 0
23
- private var shouldApplyInitialDetent: Boolean = false
24
-
25
- private var currentContentHeight: Int = 0
26
-
27
- internal fun setup() {
28
- setupWindowInsetsListener()
29
-
30
- bottomSheetView?.let { view ->
31
- disableMaterialInsetsAnimationCallback(view)
32
- }
33
- }
34
-
35
- private fun setupWindowInsetsListener() {
36
- ViewCompat.setOnApplyWindowInsetsListener(container) { _, insets ->
37
- lastTopInset = getTopInset(insets)
38
- lastBottomInset = getBottomInset(insets)
39
- updateNativeContainerHeight()
40
- insets
41
- }
42
- }
43
-
44
- /**
45
- * BottomSheetBehavior registers an internal `WindowInsetsAnimationCallback` on the
46
- * sheet view during its first `onLayoutChild`. That callback drives `translationY` to follow
47
- * animated inset changes, what interferes with our slide-in custom animation.
48
- *
49
- * We manage insets ourselves by setting a fixed height for FormSheetContainer, so we can
50
- * clear the Material's callback to remove the conflict entirely.
51
- *
52
- * This method must run after the first layout pass.
53
- */
54
- private fun disableMaterialInsetsAnimationCallback(view: FrameLayout) {
55
- view.doOnLayout {
56
- ViewCompat.setWindowInsetsAnimationCallback(it, null)
57
- }
58
- }
59
-
60
- override fun onContentHeightChanged(newHeight: Int) {
61
- if (currentContentHeight != newHeight) {
62
- currentContentHeight = newHeight
63
- updateNativeContainerHeight()
64
- }
65
- }
66
-
67
- internal fun updateFormSheetDimensions(
68
- detents: FormSheetDetents?,
69
- initialDetentIndex: Int = 0,
70
- applyInitialDetent: Boolean = false,
71
- ) {
72
- currentDetents = detents
73
- currentInitialDetentIndex = initialDetentIndex
74
- shouldApplyInitialDetent = applyInitialDetent
75
- updateNativeContainerHeight()
76
- }
77
-
78
- /**
79
- * For Yoga we require the container height to be "stable" to avoid updating content size in flight.
80
- * If left as MATCH_PARENT, BottomSheetDialog dynamically applies insets as padding when sheet overflows
81
- * status bar or display cutout. This causes Yoga to recalculate the layout, resulting in UI flickering
82
- * during the drag gesture. By calculating and enforcing a static height that explicitly subtracts
83
- * the system insets, we completely bypass these redundant layout passes.
84
- */
85
- private fun updateNativeContainerHeight() {
86
- val dialogDecorHeight = dialog.window?.decorView?.height ?: 0
87
-
88
- if (dialogDecorHeight <= 0) {
89
- return
90
- }
91
-
92
- currentDetents?.let { detents ->
93
- behaviorController?.updateSheetBehavior(
94
- detents = detents,
95
- sheetAvailableSpace = dialogDecorHeight,
96
- contentHeightForFitToContents = currentContentHeight,
97
- nativeContainerPaddingBottom = lastBottomInset,
98
- initialDetentIndex = currentInitialDetentIndex,
99
- applyInitialDetent = shouldApplyInitialDetent,
100
- )
101
- shouldApplyInitialDetent = false
102
- }
103
-
104
- val sheetContainerHeight =
105
- currentDetents?.sheetContainerHeight(dialogDecorHeight, lastTopInset, lastBottomInset, currentContentHeight)
106
- ?: (dialogDecorHeight - lastTopInset - lastBottomInset).coerceAtLeast(0)
107
-
108
- val layoutParams =
109
- container.layoutParams
110
- ?: FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, sheetContainerHeight)
111
-
112
- if (layoutParams.width != ViewGroup.LayoutParams.MATCH_PARENT || layoutParams.height != sheetContainerHeight) {
113
- layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
114
- layoutParams.height = sheetContainerHeight
115
- container.layoutParams = layoutParams
116
- }
117
- }
118
-
119
- private fun getTopInset(insetsCompat: WindowInsetsCompat): Int =
120
- insetsCompat
121
- .getInsets(
122
- WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
123
- ).top
124
-
125
- private fun getBottomInset(insetsCompat: WindowInsetsCompat): Int =
126
- insetsCompat
127
- .getInsets(
128
- WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
129
- ).bottom
130
-
131
- internal fun destroy() {
132
- ViewCompat.setOnApplyWindowInsetsListener(container, null)
133
- }
134
- }
@@ -1,162 +0,0 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.core
2
-
3
- import android.content.Context
4
- import android.util.Log
5
- import android.view.ContextThemeWrapper
6
- import android.view.View
7
- import android.widget.FrameLayout
8
- import com.swmansion.rnscreens.modals.dimmingview.DimmingViewManager
9
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetAppearanceCoordinator
10
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetBehaviorController
11
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetDimensionsCoordinator
12
- import com.swmansion.rnscreens.modals.formsheet.native.coordinator.FormSheetNativeDismissCoordinator
13
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetContentSizeChangeDelegate
14
- import com.swmansion.rnscreens.modals.formsheet.native.interfaces.FormSheetDialogEventEmitter
15
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetConfig
16
- import com.swmansion.rnscreens.modals.formsheet.native.model.FormSheetDetents
17
- import com.swmansion.rnscreens.modals.formsheet.native.presentation.FormSheetPresentationManager
18
- import kotlin.properties.Delegates
19
-
20
- class FormSheetDialogManager(
21
- context: Context,
22
- private val contentView: View,
23
- ) {
24
- private var formSheetConfig = FormSheetConfig()
25
-
26
- private val themedContext =
27
- ContextThemeWrapper(
28
- context,
29
- com.google.android.material.R.style.Theme_Material3_DayNight_NoActionBar,
30
- )
31
-
32
- // Eagerly create the container so it's always ready for the provided content view
33
- private val container = FormSheetContainer(themedContext, contentView)
34
-
35
- // Eagerly create the dialog and attach the container
36
- private val dialog =
37
- FormSheetDialog(themedContext).apply {
38
- setContentView(container)
39
- setCanceledOnTouchOutside(false)
40
- }
41
-
42
- private val bottomSheetView = dialog.findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
43
-
44
- private val behaviorController =
45
- bottomSheetView?.let {
46
- FormSheetBehaviorController(it) { index -> eventEmitter?.emitOnDetentChanged(index) }
47
- }
48
-
49
- private val dimmingManager = DimmingViewManager(context, dialog)
50
-
51
- private val appearanceCoordinator =
52
- FormSheetAppearanceCoordinator(
53
- bottomSheetView = bottomSheetView,
54
- )
55
-
56
- private val dimensionsCoordinator =
57
- FormSheetDimensionsCoordinator(
58
- dialog = dialog,
59
- container = container,
60
- bottomSheetView = bottomSheetView,
61
- behaviorController = behaviorController,
62
- )
63
-
64
- private val presentationManager =
65
- FormSheetPresentationManager(
66
- dialog = dialog,
67
- bottomSheetView = bottomSheetView,
68
- dimmingManager = dimmingManager,
69
- onNativeDismiss = { eventEmitter?.emitOnNativeDismissEvent() },
70
- )
71
-
72
- private val nativeDismissCoordinator =
73
- FormSheetNativeDismissCoordinator(
74
- dialog = dialog,
75
- behaviorController = behaviorController,
76
- dimmingManager = dimmingManager,
77
- onDismissAllowed = { presentationManager.handleNativeDismiss() },
78
- onDismissPrevented = { eventEmitter?.emitOnNativeDismissPreventedEvent() },
79
- )
80
-
81
- internal var eventEmitter: FormSheetDialogEventEmitter? by Delegates.observable(null) { _, _, newValue ->
82
- presentationManager.appearanceEventEmitter = newValue
83
- }
84
-
85
- internal val contentSizeChangeDelegate: FormSheetContentSizeChangeDelegate
86
- get() = dimensionsCoordinator
87
-
88
- init {
89
- presentationManager.setup()
90
- nativeDismissCoordinator.setup()
91
- appearanceCoordinator.setup()
92
- dimensionsCoordinator.setup()
93
- behaviorController?.setup()
94
- }
95
-
96
- internal fun applyConfig(newConfig: FormSheetConfig) {
97
- val oldConfig = formSheetConfig
98
- formSheetConfig = newConfig
99
-
100
- val reopened = !oldConfig.isOpen && newConfig.isOpen
101
-
102
- // ALWAYS refresh dimensions when reopening to ensure that BottomSheet
103
- // state and layout are synchronized with native behavior.
104
- val dimensionsChanged = oldConfig.detents != newConfig.detents
105
- if (dimensionsChanged || reopened) {
106
- dimensionsCoordinator.updateFormSheetDimensions(
107
- resolveDetents(newConfig.detents),
108
- newConfig.initialDetentIndex,
109
- reopened,
110
- )
111
- }
112
-
113
- if (oldConfig.prefersGrabberVisible != newConfig.prefersGrabberVisible) {
114
- container.setGrabberVisible(newConfig.prefersGrabberVisible)
115
- }
116
-
117
- if (oldConfig.preferredCornerRadius != newConfig.preferredCornerRadius) {
118
- appearanceCoordinator.updateCornerRadius(newConfig.preferredCornerRadius)
119
- }
120
-
121
- if (oldConfig.nativeContainerBackgroundColor != newConfig.nativeContainerBackgroundColor) {
122
- appearanceCoordinator.updateBackgroundColor(newConfig.nativeContainerBackgroundColor)
123
- }
124
-
125
- if (oldConfig.shouldPreventNativeDismiss != newConfig.shouldPreventNativeDismiss) {
126
- nativeDismissCoordinator.shouldPreventDismiss = newConfig.shouldPreventNativeDismiss
127
- }
128
-
129
- if (oldConfig.isOpen != newConfig.isOpen) {
130
- presentationManager.updatePresentationState(newConfig.isOpen)
131
- }
132
- }
133
-
134
- private fun resolveDetents(rawDetents: List<Double>): FormSheetDetents {
135
- if (rawDetents.isEmpty()) {
136
- return FormSheetDetents(listOf(LARGE_DETENT_FRACTION))
137
- }
138
-
139
- return try {
140
- FormSheetDetents(rawDetents)
141
- } catch (e: IllegalArgumentException) {
142
- Log.e(
143
- "[RNScreens]",
144
- "Invalid FormSheet detents: $rawDetents. Falling back to large detent.",
145
- e,
146
- )
147
- FormSheetDetents(listOf(LARGE_DETENT_FRACTION))
148
- }
149
- }
150
-
151
- internal fun destroy() {
152
- behaviorController?.destroy()
153
- nativeDismissCoordinator.destroy()
154
- presentationManager.destroy()
155
- dimensionsCoordinator.destroy()
156
- dialog.dismiss()
157
- }
158
-
159
- companion object {
160
- private const val LARGE_DETENT_FRACTION = 1.0
161
- }
162
- }
@@ -1,106 +0,0 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.model
2
-
3
- internal class FormSheetDetents(
4
- rawDetents: List<Double>,
5
- ) {
6
- private val detents: List<Double> = rawDetents.toList()
7
-
8
- init {
9
- require(detents.isNotEmpty()) { "[RNScreens] At least one detent must be provided." }
10
- require(detents.size <= MAX_DETENTS) { "[RNScreens] Maximum of $MAX_DETENTS detents supported, got ${detents.size}." }
11
-
12
- // Valid fitToContents configuration is a single detent with value -1.0.
13
- // For any other configuration, we should validate provided detents array.
14
- if (!isFitToContents) {
15
- detents.forEach {
16
- require(it in 0.0..1.0) {
17
- "[RNScreens] Detent values must be within 0.0 and 1.0, got $it."
18
- }
19
- }
20
-
21
- require(detents == detents.distinct().sorted()) {
22
- "[RNScreens] Detents must be sorted in strictly ascending order."
23
- }
24
- }
25
- }
26
-
27
- internal val isFitToContents: Boolean
28
- get() = detents.size == 1 && detents[0] == FIT_TO_CONTENTS_DETENT_VALUE
29
-
30
- internal val count: Int get() = detents.size
31
-
32
- private fun heightFractionAt(index: Int): Double = detents[index]
33
-
34
- private fun heightAt(
35
- index: Int,
36
- containerHeight: Int,
37
- ): Int = (heightFractionAt(index) * containerHeight).toInt()
38
-
39
- internal fun firstHeight(containerHeight: Int): Int = heightAt(0, containerHeight)
40
-
41
- internal fun maxAllowedHeight(containerHeight: Int): Int = heightAt(count - 1, containerHeight)
42
-
43
- internal fun maxAllowedHeightForFitToContents(
44
- containerHeight: Int,
45
- contentHeight: Int,
46
- bottomInset: Int,
47
- ): Int {
48
- /*
49
- * We add the `bottomInset` to the `contentHeight` so that the Material BottomSheet
50
- * is laid out behind the system navigation bar. The sheet's container covers the insets,
51
- * while the RN content is strictly constrained to `contentHeight`.
52
- */
53
- if (contentHeight <= 0) {
54
- // Avoid collapsing the sheet before the React content has been laid out and measured.
55
- return containerHeight
56
- }
57
- return (contentHeight + bottomInset).coerceAtMost(containerHeight)
58
- }
59
-
60
- internal fun halfExpandedRatio(): Float {
61
- check(count == MAX_DETENTS) { "[RNScreens] Exactly $MAX_DETENTS detents are required for halfExpandedRatio." }
62
- return (heightFractionAt(1) / heightFractionAt(2)).toFloat()
63
- }
64
-
65
- internal fun expandedOffsetFromTop(
66
- containerHeight: Int,
67
- topInset: Int = 0,
68
- ): Int {
69
- check(count == MAX_DETENTS) { "[RNScreens] Exactly $MAX_DETENTS detents are required for expandedOffsetFromTop." }
70
- return ((1 - heightFractionAt(2)) * containerHeight).toInt() + topInset
71
- }
72
-
73
- // Distance from the top of the window to the top of the largest detent's surface.
74
- private fun largestDetentTopOffset(containerHeight: Int): Int = containerHeight - maxAllowedHeight(containerHeight)
75
-
76
- /**
77
- * Material's BottomSheetDialog dynamically applies padding when its content overlaps
78
- * system insets. To prevent recalculating the size, we pre-calculate a static height
79
- * inside safe area bounds.
80
- */
81
- internal fun sheetContainerHeight(
82
- containerHeight: Int,
83
- topInset: Int,
84
- bottomInset: Int,
85
- contentHeight: Int = 0,
86
- ): Int {
87
- if (isFitToContents) {
88
- // Until we have a measured content height, fall back to a safe-area height so Yoga can lay out.
89
- if (contentHeight <= 0) {
90
- return (containerHeight - topInset - bottomInset).coerceAtLeast(0)
91
- }
92
- return contentHeight.coerceAtMost(containerHeight)
93
- }
94
-
95
- // Bottom inset is always fully subtracted because the sheet is in its dedicated window and it's
96
- // anchored to the bottom.
97
- // Top inset is subtracted only by the amount the sheet actually overlaps it.
98
- val topOverlap = (topInset - largestDetentTopOffset(containerHeight)).coerceAtLeast(0)
99
- return (maxAllowedHeight(containerHeight) - topOverlap - bottomInset).coerceAtLeast(0)
100
- }
101
-
102
- companion object {
103
- const val MAX_DETENTS = 3
104
- const val FIT_TO_CONTENTS_DETENT_VALUE = -1.0
105
- }
106
- }
@@ -1,198 +0,0 @@
1
- package com.swmansion.rnscreens.modals.formsheet.native.presentation
2
-
3
- import android.animation.Animator
4
- import android.animation.AnimatorListenerAdapter
5
- import android.view.View
6
- import com.google.android.material.bottomsheet.BottomSheetBehavior
7
- import com.swmansion.rnscreens.common.event.ViewAppearanceEventEmitter
8
- import com.swmansion.rnscreens.modals.dimmingview.DimmingViewManager
9
- import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
10
-
11
- internal class FormSheetPresentationManager(
12
- private val dialog: FormSheetDialog,
13
- private val bottomSheetView: View?,
14
- private val dimmingManager: DimmingViewManager,
15
- private val onNativeDismiss: () -> Unit,
16
- ) {
17
- internal var appearanceEventEmitter: ViewAppearanceEventEmitter? = null
18
-
19
- private var state = FormSheetPresentationState.DISMISSED
20
- private var targetIsOpen = false
21
-
22
- private val animatorFactory = FormSheetAnimatorFactory(dimmingManager)
23
- private var currentSheetAnimator: Animator? = null
24
-
25
- internal fun setup() {
26
- bottomSheetView?.let { view ->
27
- dimmingManager.attachToBehavior(BottomSheetBehavior.from(view))
28
- }
29
- }
30
-
31
- internal fun updatePresentationState(isOpen: Boolean) {
32
- targetIsOpen = isOpen
33
- resolvePresentationState()
34
- }
35
-
36
- private fun resolvePresentationState() {
37
- if (targetIsOpen) {
38
- presentIfNeeded()
39
- } else {
40
- dismissIfNeeded()
41
- }
42
- }
43
-
44
- private fun presentIfNeeded() {
45
- if (state != FormSheetPresentationState.DISMISSED) {
46
- return
47
- }
48
-
49
- state = FormSheetPresentationState.PRESENTING
50
- appearanceEventEmitter?.emitOnWillAppear()
51
- dialog.setOnShowListener {
52
- dialog.setOnShowListener(null)
53
- dimmingManager.onDialogShow()
54
- startEnterAnimation()
55
- }
56
- dialog.show()
57
- }
58
-
59
- private fun dismissIfNeeded() {
60
- if (state != FormSheetPresentationState.PRESENTED) {
61
- return
62
- }
63
-
64
- state = FormSheetPresentationState.DISMISSING
65
- appearanceEventEmitter?.emitOnWillDisappear()
66
-
67
- val isSheetHidden =
68
- bottomSheetView?.let {
69
- BottomSheetBehavior.from(it).state == BottomSheetBehavior.STATE_HIDDEN
70
- } ?: true
71
-
72
- if (isSheetHidden) {
73
- performDismiss()
74
- return
75
- }
76
-
77
- startExitAnimation()
78
- }
79
-
80
- private fun startEnterAnimation() {
81
- if (bottomSheetView == null) {
82
- onPresentationComplete()
83
- return
84
- }
85
-
86
- val isInterrupting = currentSheetAnimator?.isRunning == true
87
- currentSheetAnimator?.removeAllListeners()
88
- currentSheetAnimator?.cancel()
89
-
90
- dimmingManager.isTransitionAnimationRunning = true
91
-
92
- currentSheetAnimator =
93
- animatorFactory.createEnterAnimator(bottomSheetView, isInterrupting).apply {
94
- addListener(
95
- object : AnimatorListenerAdapter() {
96
- override fun onAnimationEnd(animation: Animator) {
97
- dimmingManager.isTransitionAnimationRunning = false
98
-
99
- if (currentSheetAnimator == this@apply) currentSheetAnimator = null
100
- onPresentationComplete()
101
- }
102
- },
103
- )
104
- start()
105
- }
106
- }
107
-
108
- private fun startExitAnimation() {
109
- if (bottomSheetView == null) {
110
- performDismiss()
111
- return
112
- }
113
-
114
- val isInterrupting = currentSheetAnimator?.isRunning == true
115
- currentSheetAnimator?.removeAllListeners()
116
- currentSheetAnimator?.cancel()
117
-
118
- dimmingManager.isTransitionAnimationRunning = true
119
-
120
- currentSheetAnimator =
121
- animatorFactory.createExitAnimator(bottomSheetView, isInterrupting).apply {
122
- addListener(
123
- object : AnimatorListenerAdapter() {
124
- override fun onAnimationEnd(animation: Animator) {
125
- dimmingManager.isTransitionAnimationRunning = false
126
-
127
- if (currentSheetAnimator == this@apply) currentSheetAnimator = null
128
- syncBehaviorStateAfterExitAnimationComplete(bottomSheetView)
129
- performDismiss()
130
- }
131
- },
132
- )
133
- start()
134
- }
135
- }
136
-
137
- private fun performDismiss() {
138
- dialog.dismiss()
139
- onDismissComplete()
140
- }
141
-
142
- private fun onPresentationComplete() {
143
- if (state == FormSheetPresentationState.PRESENTING) {
144
- state = FormSheetPresentationState.PRESENTED
145
- appearanceEventEmitter?.emitOnDidAppear()
146
- // ensure state hasn't updated during presentation
147
- resolvePresentationState()
148
- }
149
- }
150
-
151
- private fun onDismissComplete() {
152
- if (state == FormSheetPresentationState.DISMISSING) {
153
- state = FormSheetPresentationState.DISMISSED
154
- appearanceEventEmitter?.emitOnDidDisappear()
155
- // ensure state hasn't updated during dismissal
156
- resolvePresentationState()
157
- }
158
- }
159
-
160
- internal fun handleNativeDismiss() {
161
- if (state == FormSheetPresentationState.DISMISSING || state == FormSheetPresentationState.DISMISSED) {
162
- return
163
- }
164
-
165
- onNativeDismiss()
166
- updatePresentationState(isOpen = false)
167
- }
168
-
169
- /**
170
- * Synchronizes the BottomSheetBehavior state with our custom exit animation.
171
- *
172
- * Since our custom ExitAnimator uses `translationY` for visual movement, the physical
173
- * `top` of the view remains at the top of the screen. If we just call `state = STATE_HIDDEN`,
174
- * Material will attempt to align the layout and enter `STATE_SETTLING`, leaving the state
175
- * machine corrupted for the next open.
176
- *
177
- * To fix this, we manually push the physical `top` to the bottom of the screen.
178
- * This makes the behavior skip the animation and synchronously switch to `STATE_HIDDEN`,
179
- * properly cleaning up its internal state on dismissal.
180
- */
181
- private fun syncBehaviorStateAfterExitAnimationComplete(view: View) {
182
- val behavior = BottomSheetBehavior.from(view)
183
- val parent = view.parent as? View
184
- val targetTop = parent?.height ?: view.height
185
-
186
- view.offsetTopAndBottom(targetTop - view.top)
187
- behavior.state = BottomSheetBehavior.STATE_HIDDEN
188
- }
189
-
190
- internal fun destroy() {
191
- currentSheetAnimator?.cancel()
192
- currentSheetAnimator = null
193
-
194
- dialog.setOnShowListener(null)
195
-
196
- state = FormSheetPresentationState.DISMISSED
197
- }
198
- }
@@ -1,83 +0,0 @@
1
- package com.swmansion.rnscreens.stack.header.toolbar
2
-
3
- import android.util.Log
4
- import com.google.android.material.appbar.MaterialToolbar
5
- import com.swmansion.rnscreens.stack.header.toolbar.model.StackHeaderToolbarMenuGroupMetadata
6
-
7
- /**
8
- * Owns toolbar-menu selection state (id map + group metadata) and applies
9
- * group-item checked-state changes.
10
- */
11
- internal class StackHeaderToolbarMenuSelectionController {
12
- internal var forwardIdMap: Map<String, Int> = emptyMap()
13
- private set
14
-
15
- private var groupMetadata: StackHeaderToolbarMenuGroupMetadata = StackHeaderToolbarMenuGroupMetadata.EMPTY
16
-
17
- internal fun setMenuMaps(
18
- forwardIdMap: Map<String, Int>,
19
- groupMetadata: StackHeaderToolbarMenuGroupMetadata,
20
- ) {
21
- this.forwardIdMap = forwardIdMap
22
- this.groupMetadata = groupMetadata
23
- }
24
-
25
- internal fun clear() {
26
- forwardIdMap = emptyMap()
27
- groupMetadata = StackHeaderToolbarMenuGroupMetadata.EMPTY
28
- }
29
-
30
- /**
31
- * Mutates the checked state of [itemId] within its group and returns the id of the group
32
- * whose selection changed, or `null` when nothing changed (the item is not in a group, an
33
- * invalid attempt to uncheck a single-selection item, or the item was already in the
34
- * target state). Does not emit — callers decide when to emit so that batched updates can
35
- * coalesce into one event per group.
36
- */
37
- internal fun applyGroupItemStateChange(
38
- toolbar: MaterialToolbar,
39
- itemId: String,
40
- explicitCheckedValue: Boolean? = null,
41
- ): String? {
42
- val groupId = groupMetadata.itemGroupMap[itemId] ?: return null
43
- val singleSelection = groupMetadata.groupSingleSelection[groupId] ?: return null
44
- val intId = forwardIdMap[itemId] ?: return null
45
- val menuItem = toolbar.menu.findItem(intId) ?: return null
46
-
47
- if (singleSelection && explicitCheckedValue == false) {
48
- Log.w(
49
- TAG,
50
- "[RNScreens] Cannot uncheck item '$itemId' in single-selection group '$groupId'. " +
51
- "Check a different item instead.",
52
- )
53
- return null
54
- }
55
-
56
- val newChecked =
57
- if (singleSelection) {
58
- true
59
- } else {
60
- explicitCheckedValue ?: !menuItem.isChecked
61
- }
62
- if (menuItem.isChecked == newChecked) return null
63
- menuItem.isChecked = newChecked
64
-
65
- return groupId
66
- }
67
-
68
- internal fun collectSelectedIds(
69
- toolbar: MaterialToolbar,
70
- groupId: String,
71
- ): List<String> =
72
- groupMetadata
73
- .groupMemberItems[groupId]
74
- .orEmpty()
75
- .filter { memberId ->
76
- val intId = forwardIdMap[memberId] ?: return@filter false
77
- toolbar.menu.findItem(intId)?.isChecked == true
78
- }
79
-
80
- companion object {
81
- private const val TAG = "StackHeaderToolbarMenuSelectionController"
82
- }
83
- }