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
@@ -3,6 +3,9 @@ package com.swmansion.rnscreens.tabs.host
3
3
  import android.os.Build
4
4
  import android.view.MenuItem
5
5
  import android.view.View
6
+ import androidx.core.view.AccessibilityDelegateCompat
7
+ import androidx.core.view.ViewCompat
8
+ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
6
9
  import androidx.core.view.children
7
10
  import androidx.core.view.get
8
11
  import com.google.android.material.bottomnavigation.BottomNavigationView
@@ -23,8 +26,26 @@ class TabsHostA11yCoordinator(
23
26
  menuItem.contentDescription = tabsScreen.tabBarItemAccessibilityLabel
24
27
  }
25
28
 
26
- // when matching view by id, espresso driver seems to look for tag property
27
- findTabItemView(menuItem.itemId)?.tag = tabsScreen.tabBarItemTestID
29
+ findTabItemView(menuItem.itemId)?.let { tabItemView ->
30
+ // when matching view by id, espresso driver seems to look for tag property
31
+ tabItemView.tag = tabsScreen.tabBarItemTestID
32
+
33
+ // UiAutomator-based drivers (Maestro, Appium) read the node's viewIdResourceName instead,
34
+ // so expose the testID there as well — this is what React Native's ReactAccessibilityDelegate
35
+ // does for every other view. Read through to the screen so a prop update is reflected.
36
+ ViewCompat.setAccessibilityDelegate(
37
+ tabItemView,
38
+ object : AccessibilityDelegateCompat() {
39
+ override fun onInitializeAccessibilityNodeInfo(
40
+ host: View,
41
+ info: AccessibilityNodeInfoCompat,
42
+ ) {
43
+ super.onInitializeAccessibilityNodeInfo(host, info)
44
+ info.viewIdResourceName = tabsScreen.tabBarItemTestID
45
+ }
46
+ },
47
+ )
48
+ }
28
49
  }
29
50
 
30
51
  // Third-party SDKs can freely assign their own ids to id-less views in CustomBottomNavigationView's subtree and there is no way to
@@ -1,7 +1,8 @@
1
1
  package com.swmansion.rnscreens.tabs.screen
2
2
 
3
3
  import android.content.res.Configuration
4
- import android.graphics.drawable.Drawable
4
+ import android.os.Parcelable
5
+ import android.util.SparseArray
5
6
  import android.view.ViewGroup
6
7
  import androidx.fragment.app.Fragment
7
8
  import com.facebook.react.uimanager.ThemedReactContext
@@ -9,7 +10,6 @@ import com.swmansion.rnscreens.common.FragmentProviding
9
10
  import com.swmansion.rnscreens.common.container.Container
10
11
  import com.swmansion.rnscreens.common.container.ContainerItem
11
12
  import com.swmansion.rnscreens.common.container.ContainerItemSupport
12
- import com.swmansion.rnscreens.helpers.getSystemDrawableResource
13
13
  import com.swmansion.rnscreens.scrollviewmarker.ScrollViewMarker
14
14
  import com.swmansion.rnscreens.scrollviewmarker.ScrollViewSeeking
15
15
  import com.swmansion.rnscreens.tabs.appearance.TabsAppearance
@@ -52,7 +52,11 @@ class TabsScreen(
52
52
 
53
53
  internal var appearance: TabsAppearance? by Delegates.observable(null) { _, oldValue, newValue ->
54
54
  if (oldValue != newValue) {
55
- tabsScreenDelegate.get()?.onAppearanceChanged(this)
55
+ if (invalidateMenuItemSizesIfNeeded(oldValue, newValue)) {
56
+ tabsScreenDelegate.get()?.onItemSizeChange(this)
57
+ } else {
58
+ tabsScreenDelegate.get()?.onAppearanceChanged(this)
59
+ }
56
60
  }
57
61
  }
58
62
 
@@ -78,24 +82,39 @@ class TabsScreen(
78
82
  // endregion
79
83
 
80
84
  // region Icon
81
- var drawableIconResourceName: String? by Delegates.observable(null) { _, oldValue, newValue ->
82
- if (newValue != oldValue) {
83
- icon = getSystemDrawableResource(reactContext, newValue)
84
- }
85
- }
86
85
 
87
- var selectedDrawableIconResourceName: String? by Delegates.observable(null) { _, oldValue, newValue ->
88
- if (newValue != oldValue) {
89
- selectedIcon = getSystemDrawableResource(reactContext, newValue)
90
- }
91
- }
86
+ internal val icon = TabsScreenIcon(reactContext, ::onIconChange)
87
+ internal val selectedIcon = TabsScreenIcon(reactContext, ::onIconChange)
92
88
 
93
- var icon: Drawable? by Delegates.observable(null) { _, oldValue, newValue ->
94
- updateMenuItemAttributesIfNeeded(oldValue, newValue)
89
+ internal var isMenuItemIconInvalidated = true
90
+
91
+ internal var isMenuItemActiveIndicatorInvalidated = true
92
+
93
+ internal var appliedActiveIndicatorWidthPx: Int? = null
94
+
95
+ internal var appliedActiveIndicatorHeightPx: Int? = null
96
+
97
+ internal fun resolveIconsIfNeeded() {
98
+ icon.resolveIfNeeded()
99
+ selectedIcon.resolveIfNeeded()
95
100
  }
96
101
 
97
- var selectedIcon: Drawable? by Delegates.observable(null) { _, oldValue, newValue ->
98
- updateMenuItemAttributesIfNeeded(oldValue, newValue)
102
+ private fun invalidateMenuItemSizesIfNeeded(
103
+ oldValue: TabsAppearance?,
104
+ newValue: TabsAppearance?,
105
+ ): Boolean {
106
+ val isIconSizeChanged = oldValue?.tabBarItemIconSize != newValue?.tabBarItemIconSize
107
+ val isActiveIndicatorSizeChanged =
108
+ oldValue?.tabBarItemActiveIndicatorWidth != newValue?.tabBarItemActiveIndicatorWidth ||
109
+ oldValue?.tabBarItemActiveIndicatorHeight != newValue?.tabBarItemActiveIndicatorHeight
110
+ if (isIconSizeChanged) {
111
+ isMenuItemIconInvalidated = true
112
+ }
113
+ if (isIconSizeChanged || isActiveIndicatorSizeChanged) {
114
+ isMenuItemActiveIndicatorInvalidated = true
115
+ return true
116
+ }
117
+ return false
99
118
  }
100
119
 
101
120
  // endregion
@@ -119,6 +138,8 @@ class TabsScreen(
119
138
  super.onAttachedToWindow()
120
139
  }
121
140
 
141
+ override fun shouldDelayChildPressedState(): Boolean = false
142
+
122
143
  override fun onLayout(
123
144
  changed: Boolean,
124
145
  l: Int,
@@ -127,6 +148,17 @@ class TabsScreen(
127
148
  b: Int,
128
149
  ) = Unit
129
150
 
151
+ override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
152
+ // Do nothing. React Native owns this view hierarchy and keeps it alive, so there is no
153
+ // need to serialize/deserialize native view state. View ids in this subtree are react
154
+ // tags, which are not stable identities - restoring state by id can apply state saved
155
+ // by one view type to a different one, crashing e.g. in CompoundButton (see #4523).
156
+ }
157
+
158
+ override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
159
+ // Ignore restoring instance state too, as we are not saving anything anyways.
160
+ }
161
+
130
162
  internal fun setTabsScreenDelegate(delegate: TabsScreenDelegate?) {
131
163
  tabsScreenDelegate = WeakReference(delegate)
132
164
  }
@@ -137,6 +169,11 @@ class TabsScreen(
137
169
  tabsScreenDelegate.get()?.onMenuItemAttributesChange(this)
138
170
  }
139
171
 
172
+ private fun onIconChange() {
173
+ isMenuItemIconInvalidated = true
174
+ onMenuItemAttributesChange()
175
+ }
176
+
140
177
  internal fun onViewManagerAddEventEmitters() {
141
178
  // When this is called from View Manager the view tag is already set
142
179
  check(id != NO_ID) { "[RNScreens] TabsScreen must have its tag set when registering event emitters" }
@@ -176,6 +213,10 @@ class TabsScreen(
176
213
 
177
214
  override fun findContentScrollView(): ViewGroup? = containerItemSupport.findContentScrollView(this)
178
215
 
216
+ // TabsScreen has no `preventNativeDismiss` flag of its own - it only forwards
217
+ // the question to its nested container.
218
+ override fun wantsToPreventStackNativeDismiss(): ContainerItem? = resolveNestedContainer()?.wantsToPreventStackNativeDismiss()
219
+
179
220
  // endregion
180
221
 
181
222
  companion object {
@@ -8,6 +8,12 @@ internal interface TabsScreenDelegate {
8
8
 
9
9
  fun onMenuItemAttributesChange(tabsScreen: TabsScreen)
10
10
 
11
+ /**
12
+ * The icon box is bar-wide, so an icon size change requires a whole-bar appearance
13
+ * update regardless of tab selection.
14
+ */
15
+ fun onItemSizeChange(tabsScreen: TabsScreen)
16
+
11
17
  /**
12
18
  * **If a fragment is associated with the tab screen**, notify the delegate that the fragment
13
19
  * got configuration update.
@@ -6,6 +6,7 @@ import android.view.LayoutInflater
6
6
  import android.view.View
7
7
  import android.view.ViewGroup
8
8
  import androidx.fragment.app.Fragment
9
+ import com.swmansion.rnscreens.helpers.ViewIdGenerator
9
10
 
10
11
  class TabsScreenFragment(
11
12
  internal val tabsScreen: TabsScreen,
@@ -13,6 +14,8 @@ class TabsScreenFragment(
13
14
  internal val requireScreenKey: String by tabsScreen::requireScreenKey
14
15
  internal val isPreventNativeSelectionEnabled: Boolean by tabsScreen::preventNativeSelection
15
16
 
17
+ internal val menuItemId: Int = ViewIdGenerator.generateViewId()
18
+
16
19
  override fun onCreateView(
17
20
  inflater: LayoutInflater,
18
21
  container: ViewGroup?,
@@ -0,0 +1,82 @@
1
+ package com.swmansion.rnscreens.tabs.screen
2
+
3
+ import android.content.Context
4
+ import android.graphics.drawable.Drawable
5
+ import com.swmansion.rnscreens.helpers.IconResolution
6
+ import com.swmansion.rnscreens.helpers.NoTintDrawable
7
+ import com.swmansion.rnscreens.helpers.PropIconResolver
8
+ import com.swmansion.rnscreens.helpers.resolveImage
9
+ import kotlin.properties.Delegates
10
+
11
+ /**
12
+ * Single icon slot (normal or selected) of a tab bar item. Props stage here and may arrive
13
+ * in any order within a single update batch; resolution runs once per transaction via
14
+ * [resolveIfNeeded]. [onChanged] fires only when the resolved [drawable] actually changes.
15
+ */
16
+ internal class TabsScreenIcon(
17
+ context: Context,
18
+ private val onChanged: () -> Unit,
19
+ ) {
20
+ var drawableResourceName: String? by Delegates.observable(null) { _, oldValue, newValue ->
21
+ if (newValue != oldValue) isInvalidated = true
22
+ }
23
+
24
+ var tinting: TabsScreenIconTinting by Delegates.observable(
25
+ TabsScreenIconTinting.DEFAULT,
26
+ ) { _, oldValue, newValue ->
27
+ if (newValue != oldValue) isInvalidated = true
28
+ }
29
+
30
+ var imageUri: String? by Delegates.observable(null) { _, oldValue, newValue ->
31
+ if (newValue != oldValue) isInvalidated = true
32
+ }
33
+
34
+ // Resolved output; read by the appearance applicator.
35
+ var drawable: Drawable? = null
36
+ private set
37
+
38
+ private var isInvalidated = false
39
+
40
+ // Handles source precedence (drawable name wins over uri), dedup, and stale async image drops.
41
+ private val resolver = createPropIconResolver(context)
42
+
43
+ // Kept unwrapped so a tint-only change re-wraps without reloading.
44
+ private var rawDrawable: Drawable? = null
45
+ private var appliedTinting = TabsScreenIconTinting.DEFAULT
46
+
47
+ fun resolveIfNeeded() {
48
+ if (!isInvalidated) {
49
+ return
50
+ }
51
+ isInvalidated = false
52
+ resolver.resolve(drawableResourceName, imageUri) { result ->
53
+ when (result) {
54
+ IconResolution.Unchanged -> if (tinting != appliedTinting) emit()
55
+ is IconResolution.Resolved -> {
56
+ rawDrawable = result.drawable
57
+ emit()
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ // Tint is read at emit time, so a toggle during an in-flight image load still applies.
64
+ private fun emit() {
65
+ appliedTinting = tinting
66
+ val next =
67
+ rawDrawable?.let {
68
+ if (tinting == TabsScreenIconTinting.ORIGINAL) NoTintDrawable(it) else it
69
+ }
70
+ if (next !== drawable) {
71
+ drawable = next
72
+ onChanged()
73
+ }
74
+ }
75
+
76
+ private companion object {
77
+ fun createPropIconResolver(context: Context) =
78
+ PropIconResolver { name, uri, onComplete ->
79
+ resolveImage(context, name, uri, onComplete)
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,17 @@
1
+ package com.swmansion.rnscreens.tabs.screen
2
+
3
+ internal enum class TabsScreenIconTinting {
4
+ DEFAULT,
5
+ TINTED,
6
+ ORIGINAL,
7
+ ;
8
+
9
+ companion object {
10
+ fun fromString(value: String?): TabsScreenIconTinting =
11
+ when (value) {
12
+ "tinted" -> TINTED
13
+ "original" -> ORIGINAL
14
+ else -> DEFAULT
15
+ }
16
+ }
17
+ }
@@ -8,7 +8,6 @@ import com.facebook.react.uimanager.ViewGroupManager
8
8
  import com.facebook.react.uimanager.ViewManagerDelegate
9
9
  import com.facebook.react.viewmanagers.RNSTabsScreenAndroidManagerDelegate
10
10
  import com.facebook.react.viewmanagers.RNSTabsScreenAndroidManagerInterface
11
- import com.swmansion.rnscreens.helpers.loadImage
12
11
  import com.swmansion.rnscreens.helpers.makeEventRegistrationInfo
13
12
  import com.swmansion.rnscreens.helpers.readOptionalBoolean
14
13
  import com.swmansion.rnscreens.helpers.readOptionalColor
@@ -55,6 +54,11 @@ class TabsScreenViewManager :
55
54
  view.onViewManagerAddEventEmitters()
56
55
  }
57
56
 
57
+ override fun onAfterUpdateTransaction(view: TabsScreen) {
58
+ super.onAfterUpdateTransaction(view)
59
+ view.resolveIconsIfNeeded()
60
+ }
61
+
58
62
  override fun setScreenKey(
59
63
  view: TabsScreen,
60
64
  value: String?,
@@ -125,42 +129,42 @@ class TabsScreenViewManager :
125
129
  view: TabsScreen,
126
130
  value: String?,
127
131
  ) {
128
- view.drawableIconResourceName = value
132
+ view.icon.drawableResourceName = value
129
133
  }
130
134
 
131
135
  override fun setSelectedDrawableIconResourceName(
132
136
  view: TabsScreen,
133
137
  value: String?,
134
138
  ) {
135
- view.selectedDrawableIconResourceName = value
139
+ view.selectedIcon.drawableResourceName = value
140
+ }
141
+
142
+ override fun setIconTinting(
143
+ view: TabsScreen,
144
+ value: String?,
145
+ ) {
146
+ view.icon.tinting = TabsScreenIconTinting.fromString(value)
147
+ }
148
+
149
+ override fun setSelectedIconTinting(
150
+ view: TabsScreen,
151
+ value: String?,
152
+ ) {
153
+ view.selectedIcon.tinting = TabsScreenIconTinting.fromString(value)
136
154
  }
137
155
 
138
156
  override fun setImageIconResource(
139
157
  view: TabsScreen,
140
158
  value: ReadableMap?,
141
159
  ) {
142
- val uri = value?.getString("uri")
143
- if (uri != null) {
144
- loadImage(view.context, uri) { drawable ->
145
- if (drawable != null) {
146
- view.icon = drawable
147
- }
148
- }
149
- }
160
+ view.icon.imageUri = value?.getString("uri")
150
161
  }
151
162
 
152
163
  override fun setSelectedImageIconResource(
153
164
  view: TabsScreen,
154
165
  value: ReadableMap?,
155
166
  ) {
156
- val uri = value?.getString("uri")
157
- if (uri != null) {
158
- loadImage(view.context, uri) { drawable ->
159
- if (drawable != null) {
160
- view.selectedIcon = drawable
161
- }
162
- }
163
- }
167
+ view.selectedIcon.imageUri = value?.getString("uri")
164
168
  }
165
169
 
166
170
  override fun setStandardAppearance(
@@ -187,8 +191,11 @@ class TabsScreenViewManager :
187
191
  selected = if (appearance.hasKey("selected")) parseItemStateAppearance(context, appearance.getMap("selected")) else null,
188
192
  focused = if (appearance.hasKey("focused")) parseItemStateAppearance(context, appearance.getMap("focused")) else null,
189
193
  disabled = if (appearance.hasKey("disabled")) parseItemStateAppearance(context, appearance.getMap("disabled")) else null,
194
+ tabBarItemIconSize = appearance.readOptionalFloat("tabBarItemIconSize"),
190
195
  tabBarItemActiveIndicatorColor = appearance.readOptionalColor(context, "tabBarItemActiveIndicatorColor"),
191
196
  tabBarItemActiveIndicatorEnabled = appearance.readOptionalBoolean("tabBarItemActiveIndicatorEnabled"),
197
+ tabBarItemActiveIndicatorWidth = appearance.readOptionalFloat("tabBarItemActiveIndicatorWidth"),
198
+ tabBarItemActiveIndicatorHeight = appearance.readOptionalFloat("tabBarItemActiveIndicatorHeight"),
192
199
  tabBarItemTitleFontFamily = appearance.readOptionalString("tabBarItemTitleFontFamily"),
193
200
  tabBarItemTitleSmallLabelFontSize = appearance.readOptionalFloat("tabBarItemTitleSmallLabelFontSize"),
194
201
  tabBarItemTitleLargeLabelFontSize = appearance.readOptionalFloat("tabBarItemTitleLargeLabelFontSize"),
@@ -1,13 +1,20 @@
1
1
  package com.swmansion.rnscreens.utils
2
2
 
3
3
  import android.content.Context
4
+ import android.content.res.Resources
4
5
  import android.util.TypedValue
5
6
  import android.view.View
6
- import com.facebook.react.uimanager.PixelUtil
7
+
8
+ /**
9
+ * Density of the device's main display - the value React Native's `PixelUtil` converts with
10
+ * (`DisplayMetricsHolder` screen metrics), read without depending on React Native.
11
+ */
12
+ private val mainDisplayDensity: Float
13
+ get() = Resources.getSystem().displayMetrics.density
7
14
 
8
15
  /**
9
16
  * Converts a pixel value to dp using the given display [density] — not the process-global
10
- * density that [PixelUtil] reads from the device's main display. Fabric mounts views with
17
+ * density of the device's main display. Fabric mounts views with
11
18
  * the per-display density, so state pushed back to the Shadow Tree must be converted with
12
19
  * that same density; the global one mis-scales the frame on any display whose density
13
20
  * differs from the main one (Samsung DeX, freeform multi-window, external monitors). On
@@ -18,12 +25,12 @@ import com.facebook.react.uimanager.PixelUtil
18
25
  * [android.util.DisplayMetrics] that was never populated — which should not happen for a
19
26
  * live view. The `density > 0f` guard exists solely so a degenerate `0` cannot turn the
20
27
  * division into Infinity/NaN and corrupt the pushed state; in that case we fall back to the
21
- * global conversion, which is at least well-defined.
28
+ * main display's density ([mainDisplayDensity]), which is at least well-defined.
22
29
  */
23
30
  internal fun pxToDp(
24
31
  px: Float,
25
32
  density: Float,
26
- ): Float = if (density > 0f) px / density else PixelUtil.toDIPFromPixel(px)
33
+ ): Float = if (density > 0f) px / density else px / mainDisplayDensity
27
34
 
28
35
  /**
29
36
  * Converts a pixel value to dp using the density of the display this [View] is attached to.
@@ -34,13 +41,13 @@ internal fun View.pxToDp(px: Float): Float = pxToDp(px, resources.displayMetrics
34
41
 
35
42
  /**
36
43
  * Converts a dp value to pixels using the given display [density] — not the process-global
37
- * density that [PixelUtil] reads from the device's main display.
44
+ * density of the device's main display.
38
45
  * See [pxToDp] for more context.
39
46
  */
40
47
  internal fun dpToPx(
41
48
  dp: Float,
42
49
  density: Float,
43
- ): Float = if (density > 0f) dp * density else PixelUtil.toPixelFromDIP(dp)
50
+ ): Float = if (density > 0f) dp * density else dp * mainDisplayDensity
44
51
 
45
52
  /**
46
53
  * Converts a dp value to pixels using the density of the display this [View] is attached to.
@@ -49,6 +56,13 @@ internal fun dpToPx(
49
56
  */
50
57
  internal fun View.dpToPx(dp: Float): Float = dpToPx(dp, resources.displayMetrics.density)
51
58
 
59
+ /**
60
+ * Converts an SP value to pixels using the density of the display this [View] is
61
+ * attached to (including the current font scale). Uses the view's own resources
62
+ * rather than the process-global density of the main display. See [pxToDp].
63
+ */
64
+ internal fun View.spToPx(sp: Float): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, resources.displayMetrics)
65
+
52
66
  internal fun resolveDimensionAttr(
53
67
  context: Context,
54
68
  attrId: Int,
@@ -3,6 +3,10 @@ package com.swmansion.rnscreens.utils
3
3
  import android.util.Log
4
4
  import com.swmansion.rnscreens.BuildConfig
5
5
 
6
+ /**
7
+ * `d`, `i` and `v` are emitted only when `RNS_DEBUG_LOGGING` is enabled;
8
+ * `w`, `e` and `wtf` are always emitted.
9
+ */
6
10
  object RNSLog {
7
11
  private inline fun logIfEnabled(
8
12
  tag: String,
@@ -39,13 +43,17 @@ object RNSLog {
39
43
  fun e(
40
44
  tag: String,
41
45
  msg: String,
42
- ) = logIfEnabled(tag, msg, Log::e)
46
+ ) {
47
+ Log.e(tag, msg)
48
+ }
43
49
 
44
50
  fun e(
45
51
  tag: String,
46
52
  msg: String,
47
53
  tr: Throwable,
48
- ) = logIfEnabled(tag, msg, tr, Log::e)
54
+ ) {
55
+ Log.e(tag, msg, tr)
56
+ }
49
57
 
50
58
  fun i(
51
59
  tag: String,
@@ -72,22 +80,30 @@ object RNSLog {
72
80
  fun w(
73
81
  tag: String,
74
82
  msg: String,
75
- ) = logIfEnabled(tag, msg, Log::w)
83
+ ) {
84
+ Log.w(tag, msg)
85
+ }
76
86
 
77
87
  fun w(
78
88
  tag: String,
79
89
  msg: String,
80
90
  tr: Throwable,
81
- ) = logIfEnabled(tag, msg, tr, Log::w)
91
+ ) {
92
+ Log.w(tag, msg, tr)
93
+ }
82
94
 
83
95
  fun wtf(
84
96
  tag: String,
85
97
  msg: String,
86
- ) = logIfEnabled(tag, msg, Log::wtf)
98
+ ) {
99
+ Log.wtf(tag, msg)
100
+ }
87
101
 
88
102
  fun wtf(
89
103
  tag: String,
90
104
  msg: String,
91
105
  tr: Throwable,
92
- ) = logIfEnabled(tag, msg, tr, Log::wtf)
106
+ ) {
107
+ Log.wtf(tag, msg, tr)
108
+ }
93
109
  }
@@ -0,0 +1,22 @@
1
+ package com.swmansion.rnscreens.utils
2
+
3
+ import android.content.Context
4
+ import android.util.TypedValue
5
+ import androidx.annotation.StyleRes
6
+
7
+ /**
8
+ * Resolves a theme attribute pointing at a style (e.g. `?attr/textAppearanceTitleLarge`)
9
+ * to its concrete style resource id. Used to recover Material's default text
10
+ * appearances so they can be re-applied at runtime.
11
+ */
12
+ @StyleRes
13
+ internal fun resolveStyleResAttr(
14
+ context: Context,
15
+ attr: Int,
16
+ ): Int {
17
+ val typedValue = TypedValue()
18
+ require(context.theme.resolveAttribute(attr, typedValue, true)) {
19
+ "[RNScreens] Unable to resolve Material theme style attribute."
20
+ }
21
+ return typedValue.resourceId
22
+ }
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <com.google.android.material.appbar.CollapsingToolbarLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:app="http://schemas.android.com/apk/res-auto"
5
+ style="?attr/collapsingToolbarLayoutLargeStyle"
6
+ android:layout_width="match_parent"
7
+ android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
8
+ app:collapsedTitleGravityMode="availableSpace" />
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <com.google.android.material.appbar.CollapsingToolbarLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:app="http://schemas.android.com/apk/res-auto"
5
+ style="?attr/collapsingToolbarLayoutLargeStyle"
6
+ android:layout_width="match_parent"
7
+ android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
8
+ app:collapsedTitleGravityMode="entireSpace" />
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <com.google.android.material.appbar.CollapsingToolbarLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:app="http://schemas.android.com/apk/res-auto"
5
+ style="?attr/collapsingToolbarLayoutMediumStyle"
6
+ android:layout_width="match_parent"
7
+ android:layout_height="?attr/collapsingToolbarLayoutMediumSize"
8
+ app:collapsedTitleGravityMode="availableSpace" />
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <com.google.android.material.appbar.CollapsingToolbarLayout
3
+ xmlns:android="http://schemas.android.com/apk/res/android"
4
+ xmlns:app="http://schemas.android.com/apk/res-auto"
5
+ style="?attr/collapsingToolbarLayoutMediumStyle"
6
+ android:layout_width="match_parent"
7
+ android:layout_height="?attr/collapsingToolbarLayoutMediumSize"
8
+ app:collapsedTitleGravityMode="entireSpace" />
@@ -1,12 +1,42 @@
1
1
  #include "RNSScreenRemovalListener.h"
2
2
  #include <react/renderer/mounting/ShadowViewMutation.h>
3
+ #include <utility>
3
4
  using namespace facebook::react;
4
5
 
6
+ uint64_t RNSScreenRemovalListener::setListener(
7
+ std::function<void(int)> &&listenerFunction) {
8
+ std::lock_guard<std::mutex> lock(listenerMutex_);
9
+ listenerFunction_ = std::move(listenerFunction);
10
+ return ++currentToken_;
11
+ }
12
+
13
+ void RNSScreenRemovalListener::clearListener(uint64_t token) {
14
+ std::lock_guard<std::mutex> lock(listenerMutex_);
15
+ if (token == currentToken_) {
16
+ listenerFunction_ = nullptr;
17
+ }
18
+ }
19
+
5
20
  std::optional<MountingTransaction> RNSScreenRemovalListener::pullTransaction(
6
21
  SurfaceId surfaceId,
7
22
  MountingTransaction::Number transactionNumber,
8
23
  const TransactionTelemetry &telemetry,
9
24
  ShadowViewMutationList mutations) const {
25
+ // Copy under the lock, invoke outside it: the callback makes a JNI call and
26
+ // must not run while holding a lock the module thread also takes.
27
+ std::function<void(int)> listener;
28
+ {
29
+ std::lock_guard<std::mutex> lock(listenerMutex_);
30
+ listener = listenerFunction_;
31
+ }
32
+
33
+ if (!listener) {
34
+ // Orphaned between module teardown and the next install: pass the
35
+ // transaction through untouched.
36
+ return MountingTransaction{
37
+ surfaceId, transactionNumber, std::move(mutations), telemetry};
38
+ }
39
+
10
40
  for (const ShadowViewMutation &mutation : mutations) {
11
41
  // When using RNSModalScreen on Android it should be added here.
12
42
  if (mutation.type == ShadowViewMutation::Type::Remove &&
@@ -16,7 +46,7 @@ std::optional<MountingTransaction> RNSScreenRemovalListener::pullTransaction(
16
46
  // We call the listener function even if this screen has not been owned
17
47
  // by RNSScreenStack as since RN 0.78 we do not have enough information
18
48
  // here. This final filter is applied later in NativeProxy.
19
- listenerFunction_(mutation.oldChildShadowView.tag);
49
+ listener(mutation.oldChildShadowView.tag);
20
50
  }
21
51
  }
22
52