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,9 +1,12 @@
1
1
  package com.swmansion.rnscreens.stack.header
2
2
 
3
+ import android.annotation.SuppressLint
3
4
  import android.content.res.ColorStateList
5
+ import android.graphics.Color
6
+ import android.graphics.Typeface
4
7
  import android.graphics.drawable.Drawable
5
- import android.text.TextUtils
6
8
  import android.util.Log
9
+ import android.util.TypedValue
7
10
  import android.view.Gravity
8
11
  import android.view.View
9
12
  import android.view.ViewGroup
@@ -11,10 +14,9 @@ import android.view.ViewGroup.LayoutParams.MATCH_PARENT
11
14
  import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
12
15
  import android.widget.FrameLayout
13
16
  import androidx.appcompat.view.ContextThemeWrapper
14
- import androidx.appcompat.widget.AppCompatTextView
17
+ import androidx.appcompat.widget.AppCompatImageView
15
18
  import androidx.appcompat.widget.Toolbar
16
19
  import androidx.core.graphics.drawable.DrawableCompat
17
- import androidx.core.widget.TextViewCompat
18
20
  import com.google.android.material.R
19
21
  import com.google.android.material.appbar.AppBarLayout
20
22
  import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
@@ -24,11 +26,20 @@ import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_
24
26
  import com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP
25
27
  import com.google.android.material.appbar.CollapsingToolbarLayout
26
28
  import com.google.android.material.appbar.MaterialToolbar
29
+ import com.google.android.material.color.MaterialColors
30
+ import com.google.android.material.shape.MaterialShapeDrawable
31
+ import com.swmansion.rnscreens.common.text.TextAppearance
32
+ import com.swmansion.rnscreens.common.text.TextAppearanceDefaults
27
33
  import com.swmansion.rnscreens.ext.detachFromCurrentParent
28
34
  import com.swmansion.rnscreens.stack.header.appbar.StackHeaderAppBarLayout
35
+ import com.swmansion.rnscreens.stack.header.appbar.StackHeaderContentScrimDrawable
29
36
  import com.swmansion.rnscreens.stack.header.config.StackHeaderConfigurationProviding
30
- import com.swmansion.rnscreens.stack.header.subview.StackHeaderSubview
37
+ import com.swmansion.rnscreens.stack.header.config.StackHeaderType
38
+ import com.swmansion.rnscreens.utils.dpToPx
39
+ import com.swmansion.rnscreens.utils.resolveColorAttr
31
40
  import com.swmansion.rnscreens.utils.resolveDrawableAttr
41
+ import com.swmansion.rnscreens.utils.spToPx
42
+ import kotlin.math.roundToInt
32
43
 
33
44
  /**
34
45
  * Builds and applies the Material app bar — type, subviews, title, back button,
@@ -43,7 +54,12 @@ internal class StackHeaderApplicator(
43
54
  coordinatorLayout: StackHeaderCoordinatorLayout,
44
55
  config: StackHeaderConfigurationProviding,
45
56
  ): StackHeaderAppBarLayout {
46
- val appBar = StackHeaderAppBarLayout.create(wrappedContext, config.type)
57
+ val appBar =
58
+ StackHeaderAppBarLayout.create(
59
+ wrappedContext,
60
+ config.type,
61
+ config.collapsedTitleGravityMode,
62
+ )
47
63
 
48
64
  if (config.transparent) {
49
65
  coordinatorLayout.removeContentBehavior()
@@ -56,7 +72,6 @@ internal class StackHeaderApplicator(
56
72
  // Make sure that we receive insets, necessary when changing header mode in runtime.
57
73
  appBar.requestApplyInsets()
58
74
  populateAppBar(appBar, config)
59
- maybeApplyRTLCollapsingToolbarLayoutWorkaround(coordinatorLayout, config, appBar)
60
75
  appBar.toolbar.requestLayout()
61
76
 
62
77
  return appBar
@@ -84,30 +99,21 @@ internal class StackHeaderApplicator(
84
99
  toolbar.addView(it.view, Toolbar.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.END))
85
100
  }
86
101
 
87
- populateTitleOrCenter(appBar, toolbar, config)
102
+ populateCenterSubview(appBar, toolbar, config)
88
103
  populateBackground(appBar, config)
89
104
  }
90
105
 
91
- private fun populateTitleOrCenter(
106
+ private fun populateCenterSubview(
92
107
  appBar: StackHeaderAppBarLayout,
93
108
  toolbar: Toolbar,
94
109
  config: StackHeaderConfigurationProviding,
95
110
  ) {
96
- val centerSubview = config.centerSubview
97
- if (centerSubview != null) {
98
- if (appBar is StackHeaderAppBarLayout.Small) {
99
- centerSubview.view.detachFromCurrentParent()
100
- toolbar.addView(centerSubview.view, Toolbar.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.CENTER_HORIZONTAL))
101
- } else {
102
- Log.e(TAG, "[RNScreens] Center subview is supported only for small header type.")
103
- }
104
- } else if (appBar is StackHeaderAppBarLayout.Small) {
105
- // Small header needs a managed title view because we can't use Toolbar's native
106
- // title — it would be laid out to the leading side of leading subview.
107
- val titleView = createManagedTitleView(toolbar)
108
- appBar.managedTitleView = titleView
109
- val index = if (config.isRTL) 0 else -1
110
- toolbar.addView(titleView, index, Toolbar.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.START))
111
+ val centerSubview = config.centerSubview ?: return
112
+ if (appBar is StackHeaderAppBarLayout.Small) {
113
+ centerSubview.view.detachFromCurrentParent()
114
+ toolbar.addView(centerSubview.view, Toolbar.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, Gravity.CENTER_HORIZONTAL))
115
+ } else {
116
+ Log.e(TAG, "[RNScreens] Center subview is supported only for small header type.")
111
117
  }
112
118
  }
113
119
 
@@ -144,51 +150,195 @@ internal class StackHeaderApplicator(
144
150
  )
145
151
  }
146
152
 
147
- private fun createManagedTitleView(toolbar: Toolbar): AppCompatTextView =
148
- AppCompatTextView(toolbar.context).apply {
149
- setSingleLine()
150
- ellipsize = TextUtils.TruncateAt.END
151
- TextViewCompat.setTextAppearance(
152
- this,
153
- R.style.TextAppearance_Material3_TitleLarge,
154
- )
155
- layoutParams =
156
- Toolbar
157
- .LayoutParams(
158
- WRAP_CONTENT,
159
- WRAP_CONTENT,
160
- Gravity.START,
161
- ).apply {
162
- // TODO: there seems to be a problem with collapsing margins.
163
- // We will expose customization either way but we should
164
- // have consistent behavior and defaults.
165
- marginStart = toolbar.titleMarginStart + toolbar.contentInsetStart
166
- marginEnd = toolbar.titleMarginEnd
167
- topMargin = toolbar.titleMarginTop
168
- bottomMargin = toolbar.titleMarginBottom
169
- }
170
- }
171
-
172
153
  // endregion
173
154
 
174
155
  // region In-place updates
175
156
 
176
- internal fun applyTitle(
157
+ // ctl.setMaxLines() is listed in Material docs in the same way as other props but for some
158
+ // reason it's restricted.
159
+ @SuppressLint("RestrictedApi")
160
+ internal fun applyTitleAndSubtitle(
161
+ appBar: StackHeaderAppBarLayout,
162
+ config: StackHeaderConfigurationProviding,
163
+ ) {
164
+ when (appBar) {
165
+ is StackHeaderAppBarLayout.Small -> {
166
+ appBar.toolbar.title = config.title
167
+ appBar.toolbar.subtitle = config.subtitle
168
+ }
169
+
170
+ is StackHeaderAppBarLayout.Collapsing -> {
171
+ val ctl = appBar.collapsingToolbarLayout
172
+
173
+ ctl.maxLines = config.maxLines
174
+
175
+ ctl.title = config.title
176
+ ctl.subtitle = config.subtitle
177
+
178
+ // setText only recomputes draw offsets within the existing bounds; the
179
+ // title/subtitle vertical split is recomputed only in onLayout. Force a layout
180
+ // so toggling the subtitle at runtime reclaims the title space.
181
+ ctl.requestLayout()
182
+ }
183
+ }
184
+ }
185
+
186
+ internal fun applyTitlePositioning(
187
+ appBar: StackHeaderAppBarLayout,
188
+ config: StackHeaderConfigurationProviding,
189
+ ) {
190
+ when (appBar) {
191
+ is StackHeaderAppBarLayout.Small -> {
192
+ appBar.toolbar.isTitleCentered = config.titleCentered
193
+ appBar.toolbar.isSubtitleCentered = config.subtitleCentered
194
+ }
195
+
196
+ is StackHeaderAppBarLayout.Collapsing -> {
197
+ appBar.collapsingToolbarLayout.expandedTitleGravity =
198
+ config.expandedTitleHorizontalGravity or config.expandedTitleVerticalGravity
199
+ appBar.collapsingToolbarLayout.collapsedTitleGravity =
200
+ config.collapsedTitleHorizontalGravity or config.collapsedTitleVerticalGravity
201
+ }
202
+ }
203
+ }
204
+
205
+ internal fun applyTitleAndSubtitleAppearance(
177
206
  appBar: StackHeaderAppBarLayout,
178
207
  config: StackHeaderConfigurationProviding,
179
208
  ) {
209
+ // Defaults are resolved from wrappedContext, not the widget's own context: MaterialToolbar
210
+ // wraps its context (materialThemeOverlay) in a ContextThemeWrapper whose theme is a
211
+ // one-time copy, so it never sees later setTheme calls on wrappedContext (color scheme
212
+ // changes).
180
213
  when (appBar) {
181
214
  is StackHeaderAppBarLayout.Small -> {
182
- appBar.managedTitleView?.text = config.title
183
- appBar.managedTitleView?.requestLayout()
215
+ val toolbar = appBar.toolbar
216
+
217
+ // Widget.Material3Expressive.Toolbar#{title,subtitle}TextAppearance
218
+ // = @macro/m3_comp_app_bar_small_{title,subtitle}_font. That style sets no text
219
+ // colors, so both come from @macro/m3_comp_app_bar_{title,subtitle}_color.
220
+ applySlot(
221
+ view = toolbar,
222
+ defaults =
223
+ TextAppearanceDefaults.resolve(
224
+ wrappedContext,
225
+ R.attr.textAppearanceTitleLarge,
226
+ R.attr.colorOnSurface,
227
+ ),
228
+ appearance = config.titleAppearance,
229
+ setColor = { toolbar.setTitleTextColor(it) },
230
+ setTypeface = { appBar.titleTextView.typeface = it },
231
+ setTextSizePx = { appBar.titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, it) },
232
+ )
233
+ applySlot(
234
+ view = toolbar,
235
+ defaults =
236
+ TextAppearanceDefaults.resolve(
237
+ wrappedContext,
238
+ R.attr.textAppearanceLabelMedium,
239
+ R.attr.colorOnSurfaceVariant,
240
+ ),
241
+ appearance = config.subtitleAppearance,
242
+ setColor = { toolbar.setSubtitleTextColor(it) },
243
+ setTypeface = { appBar.subtitleTextView.typeface = it },
244
+ setTextSizePx = { appBar.subtitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, it) },
245
+ )
184
246
  }
185
247
 
186
248
  is StackHeaderAppBarLayout.Collapsing -> {
187
- appBar.collapsingToolbarLayout.title = config.title
249
+ val ctl = appBar.collapsingToolbarLayout
250
+ val isLarge = appBar.type == StackHeaderType.LARGE
251
+
252
+ // Widget.Material3Expressive.CollapsingToolbar.{Large,Medium}#expandedTitleTextAppearance
253
+ // = @macro/m3_comp_app_bar_{large,medium}_flexible_title_font
254
+ val expandedTitleAttr =
255
+ if (isLarge) R.attr.textAppearanceDisplaySmall else R.attr.textAppearanceHeadlineMedium
256
+
257
+ // …#expandedSubtitleTextAppearance
258
+ // = @macro/m3_comp_app_bar_{large,medium}_flexible_subtitle_font
259
+ val expandedSubtitleAttr =
260
+ if (isLarge) R.attr.textAppearanceTitleMedium else R.attr.textAppearanceLabelLarge
261
+
262
+ // In the calls below, the collapsed appearances and all four colors come from the base
263
+ // Widget.Material3Expressive.CollapsingToolbar: collapsed{Title,Subtitle}TextAppearance
264
+ // = @macro/m3_comp_app_bar_small_{title,subtitle}_font,
265
+ // {collapsed,expanded}{Title,Subtitle}TextColor
266
+ // = @macro/m3_comp_app_bar_{title,subtitle}_color.
267
+
268
+ applySlot(
269
+ view = ctl,
270
+ defaults =
271
+ TextAppearanceDefaults.resolve(wrappedContext, expandedTitleAttr, R.attr.colorOnSurface),
272
+ appearance = config.expandedTitleAppearance,
273
+ setColor = { ctl.setExpandedTitleTextColor(ColorStateList.valueOf(it)) },
274
+ setTypeface = { ctl.setExpandedTitleTypeface(it) },
275
+ setTextSizePx = { ctl.expandedTitleTextSize = it },
276
+ )
277
+ applySlot(
278
+ view = ctl,
279
+ defaults =
280
+ TextAppearanceDefaults.resolve(wrappedContext, R.attr.textAppearanceTitleLarge, R.attr.colorOnSurface),
281
+ appearance = config.collapsedTitleAppearance,
282
+ setColor = { ctl.setCollapsedTitleTextColor(it) },
283
+ setTypeface = { ctl.setCollapsedTitleTypeface(it) },
284
+ setTextSizePx = { ctl.collapsedTitleTextSize = it },
285
+ )
286
+ applySlot(
287
+ view = ctl,
288
+ defaults =
289
+ TextAppearanceDefaults.resolve(wrappedContext, expandedSubtitleAttr, R.attr.colorOnSurfaceVariant),
290
+ appearance = config.expandedSubtitleAppearance,
291
+ setColor = { ctl.setExpandedSubtitleTextColor(ColorStateList.valueOf(it)) },
292
+ setTypeface = { ctl.setExpandedSubtitleTypeface(it) },
293
+ setTextSizePx = { ctl.expandedSubtitleTextSize = it },
294
+ )
295
+ applySlot(
296
+ view = ctl,
297
+ defaults =
298
+ TextAppearanceDefaults.resolve(wrappedContext, R.attr.textAppearanceLabelMedium, R.attr.colorOnSurfaceVariant),
299
+ appearance = config.collapsedSubtitleAppearance,
300
+ setColor = { ctl.setCollapsedSubtitleTextColor(it) },
301
+ setTypeface = { ctl.setCollapsedSubtitleTypeface(it) },
302
+ setTextSizePx = { ctl.collapsedSubtitleTextSize = it },
303
+ )
304
+
305
+ // Layout is necessary e.g. after changing subtitle text size.
306
+ ctl.requestLayout()
188
307
  }
189
308
  }
190
309
  }
191
310
 
311
+ /**
312
+ * Applies one title/subtitle slot as absolute values: each property is the prop value when
313
+ * set, the Material default otherwise.
314
+ */
315
+ private fun applySlot(
316
+ view: View,
317
+ defaults: TextAppearanceDefaults,
318
+ appearance: TextAppearance,
319
+ setColor: (Int) -> Unit,
320
+ setTypeface: (Typeface) -> Unit,
321
+ setTextSizePx: (Float) -> Unit,
322
+ ) {
323
+ setColor(appearance.color ?: defaults.color)
324
+ setTypeface(appearance.resolveTypeface(defaults.typeface))
325
+ setTextSizePx(appearance.fontSize?.let { view.spToPx(it) } ?: defaults.textSizePx)
326
+ }
327
+
328
+ internal fun applyContentInsets(
329
+ appBar: StackHeaderAppBarLayout,
330
+ config: StackHeaderConfigurationProviding,
331
+ ) {
332
+ val toolbar = appBar.toolbar
333
+
334
+ toolbar.setContentInsetsRelative(
335
+ config.contentInsetStart?.let { toolbar.dpToPx(it).roundToInt() } ?: appBar.defaultContentInsetStart,
336
+ config.contentInsetEnd?.let { toolbar.dpToPx(it).roundToInt() } ?: appBar.defaultContentInsetEnd,
337
+ )
338
+
339
+ toolbar.requestLayout()
340
+ }
341
+
192
342
  internal fun applyBackButton(
193
343
  toolbar: MaterialToolbar,
194
344
  config: StackHeaderConfigurationProviding,
@@ -208,9 +358,15 @@ internal class StackHeaderApplicator(
208
358
  val baseDrawable =
209
359
  config.backButtonIcon
210
360
  ?.let { getResizedDrawable(toolbar, it) }
211
- ?: resolveDefaultBackButtonIcon()
361
+ ?: resolveDefaultBackButtonIcon(toolbar)
362
+
363
+ val tintList =
364
+ buildTintList(
365
+ config.backButtonTintColorNormal,
366
+ config.backButtonTintColorPressed,
367
+ config.backButtonTintColorFocused,
368
+ )
212
369
 
213
- val tintList = resolveBackButtonTintList(config)
214
370
  toolbar.navigationIcon =
215
371
  if (tintList != null && baseDrawable != null) {
216
372
  DrawableCompat.wrap(baseDrawable.mutate()).also {
@@ -223,6 +379,32 @@ internal class StackHeaderApplicator(
223
379
  toolbar.setNavigationOnClickListener { onNavigationIconClick() }
224
380
  }
225
381
 
382
+ internal fun applyOverflowIcon(
383
+ toolbar: MaterialToolbar,
384
+ config: StackHeaderConfigurationProviding,
385
+ ) {
386
+ val baseDrawable =
387
+ config.overflowIcon
388
+ ?.let { getResizedDrawable(toolbar, it) }
389
+ ?: resolveDefaultOverflowIcon(toolbar)
390
+
391
+ val tintList =
392
+ buildTintList(
393
+ config.overflowIconTintColorNormal,
394
+ config.overflowIconTintColorPressed,
395
+ config.overflowIconTintColorFocused,
396
+ )
397
+
398
+ toolbar.overflowIcon =
399
+ if (tintList != null && baseDrawable != null) {
400
+ DrawableCompat.wrap(baseDrawable.mutate()).also {
401
+ DrawableCompat.setTintList(it, tintList)
402
+ }
403
+ } else {
404
+ baseDrawable
405
+ }
406
+ }
407
+
226
408
  internal fun applyScrollFlags(
227
409
  appBar: StackHeaderAppBarLayout,
228
410
  config: StackHeaderConfigurationProviding,
@@ -270,6 +452,109 @@ internal class StackHeaderApplicator(
270
452
  appBar.requestLayout()
271
453
  }
272
454
 
455
+ internal fun applyBackgroundColors(
456
+ appBar: StackHeaderAppBarLayout,
457
+ config: StackHeaderConfigurationProviding,
458
+ ) {
459
+ // Widget.Material3Expressive.AppBarLayout (an empty alias of Widget.Material3.AppBarLayout)
460
+ // #android:background = @macro/m3_comp_app_bar_container_color.
461
+ val backgroundColor =
462
+ config.backgroundColor ?: resolveColorAttr(appBar.context, R.attr.colorSurface)
463
+
464
+ // Both header kinds default to the same token, from different places:
465
+ // small — ...AppBarLayout#liftOnScrollColor
466
+ // = @macro/m3_comp_app_bar_on_scroll_container_color;
467
+ // collapsing — the M3 CollapsingToolbar styles set no contentScrim, so CTL installs its
468
+ // own default for titleCollapseMode=fade (getDefaultContentScrimColorForTitleCollapseFadeMode).
469
+ val scrolledBackgroundColor =
470
+ config.scrolledBackgroundColor
471
+ ?: resolveColorAttr(appBar.context, R.attr.colorSurfaceContainer)
472
+
473
+ val background =
474
+ MaterialShapeDrawable().apply {
475
+ fillColor = ColorStateList.valueOf(backgroundColor)
476
+ }
477
+
478
+ when (appBar) {
479
+ is StackHeaderAppBarLayout.Small -> {
480
+ appBar.background = background
481
+ appBar.setLiftOnScrollColor(ColorStateList.valueOf(scrolledBackgroundColor))
482
+
483
+ // The lift animation runs only on lifted-state changes; jump to the end
484
+ // state when colors change while already lifted. The end state is the
485
+ // scrolled color composited over the background (see Material's
486
+ // initializeLiftOnScrollWithColor), not the raw scrolled color — they
487
+ // differ when the scrolled color is not fully opaque.
488
+ if (appBar.isLifted) {
489
+ background.fillColor =
490
+ ColorStateList.valueOf(
491
+ MaterialColors.layer(backgroundColor, scrolledBackgroundColor),
492
+ )
493
+ }
494
+ }
495
+
496
+ is StackHeaderAppBarLayout.Collapsing -> {
497
+ // Fade collapse mode disables liftOnScroll, but the lift animation only checks the
498
+ // lift color. We set it to null so the fill stays at backgroundColor under the
499
+ // transparent/translucent content scrim.
500
+ appBar.setLiftOnScrollColor(null)
501
+ appBar.background = background
502
+ appBar.collapsingToolbarLayout.contentScrim =
503
+ StackHeaderContentScrimDrawable(scrolledBackgroundColor)
504
+ }
505
+ }
506
+
507
+ applyStatusBarScrim(appBar, config, backgroundColor, scrolledBackgroundColor)
508
+ }
509
+
510
+ private fun applyStatusBarScrim(
511
+ appBar: StackHeaderAppBarLayout,
512
+ config: StackHeaderConfigurationProviding,
513
+ backgroundColor: Int,
514
+ scrolledBackgroundColor: Int,
515
+ ) {
516
+ when (appBar) {
517
+ is StackHeaderAppBarLayout.Small -> {
518
+ val scrimColor = resolveStatusBarScrimColor(config, drivingColor = backgroundColor)
519
+ val autoFollow = scrimColor != null && config.statusBarScrimColor == null
520
+ appBar.setStatusBarScrimSyncEnabled(autoFollow)
521
+ appBar.statusBarForeground?.setTint(
522
+ when {
523
+ scrimColor == null -> Color.TRANSPARENT
524
+ // Same lifted jump as the background fill in applyBackgroundColors.
525
+ autoFollow && appBar.isLifted ->
526
+ MaterialColors.layer(backgroundColor, scrolledBackgroundColor)
527
+ else -> scrimColor
528
+ },
529
+ )
530
+ }
531
+
532
+ is StackHeaderAppBarLayout.Collapsing -> {
533
+ // Defaulting to the content scrim color masks toolbar content passing
534
+ // through the status-bar area (scroll-only flags) and is a visual
535
+ // no-op in the opaque exitUntilCollapsed case. An invisible scrim is
536
+ // normalized to null so the content scrim exclusion can key on scrim
537
+ // presence alone.
538
+ val scrimColor =
539
+ resolveStatusBarScrimColor(config, drivingColor = scrolledBackgroundColor)
540
+ ?.takeIf { Color.alpha(it) > 0 }
541
+ if (scrimColor != null) {
542
+ appBar.collapsingToolbarLayout.setStatusBarScrimColor(scrimColor)
543
+ } else {
544
+ appBar.collapsingToolbarLayout.statusBarScrim = null
545
+ }
546
+ appBar.updateContentScrimExclusion()
547
+ }
548
+ }
549
+ }
550
+
551
+ // The default scrim exists only for an opaque driving color — a translucent
552
+ // scrim would double-composite over the layer it covers.
553
+ private fun resolveStatusBarScrimColor(
554
+ config: StackHeaderConfigurationProviding,
555
+ drivingColor: Int,
556
+ ): Int? = config.statusBarScrimColor ?: drivingColor.takeIf { Color.alpha(it) == 0xFF }
557
+
273
558
  // endregion
274
559
 
275
560
  // region Helpers
@@ -298,53 +583,27 @@ internal class StackHeaderApplicator(
298
583
  }
299
584
  }
300
585
 
301
- private fun resolveDefaultBackButtonIcon(): Drawable? = resolveDrawableAttr(wrappedContext, androidx.appcompat.R.attr.homeAsUpIndicator)
302
-
303
- private fun maybeApplyRTLCollapsingToolbarLayoutWorkaround(
304
- coordinatorLayout: StackHeaderCoordinatorLayout,
305
- config: StackHeaderConfigurationProviding,
306
- appBar: StackHeaderAppBarLayout,
307
- ) {
308
- // For collapsing headers, CTL lazily adds a MATCH_PARENT dummy view to the Toolbar
309
- // during the first onMeasure (ensureToolbar). We need our subviews at higher indices
310
- // than the dummy view so they get positioned first in RTL layout. Forcing a measure
311
- // triggers the dummy view creation.
312
- if (appBar is StackHeaderAppBarLayout.Collapsing && config.isRTL) {
313
- appBar.measure(
314
- View.MeasureSpec.makeMeasureSpec(coordinatorLayout.width, View.MeasureSpec.EXACTLY),
315
- View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
316
- )
317
- moveDummyViewToFront(appBar.toolbar)
318
- }
319
- }
320
-
321
- /**
322
- * CollapsingToolbarLayout adds a MATCH_PARENT dummy view to the Toolbar for title bounds
323
- * tracking. In RTL, the Toolbar iterates custom views in reverse child order — so the
324
- * dummy view (if last) gets processed first and consumes the entire layout cursor.
325
- * Moving it to index 0 ensures our subviews are processed first.
326
- *
327
- * See https://github.com/material-components/material-components-android/issues/1867.
328
- */
329
- private fun moveDummyViewToFront(toolbar: Toolbar) {
330
- for (i in 0 until toolbar.childCount) {
331
- val child = toolbar.getChildAt(i)
332
- // Assumes only StackHeaderSubview children exist in Collapsing toolbar besides
333
- // the CTL dummy view.
334
- if (child !is StackHeaderSubview) {
335
- val lp = child.layoutParams
336
- toolbar.removeViewAt(i)
337
- toolbar.addView(child, 0, lp)
338
- return
339
- }
340
- }
341
- }
342
-
343
- private fun resolveBackButtonTintList(config: StackHeaderConfigurationProviding): ColorStateList? {
344
- val normal = config.backButtonTintColorNormal
345
- val pressed = config.backButtonTintColorPressed
346
- val focused = config.backButtonTintColorFocused
347
-
586
+ // Default icon drawables must load through the toolbar's snapshot context, not
587
+ // wrappedContext: on Android 14+ the framework's themed resource cache returns stale
588
+ // entries for a Theme mutated in place by setTheme (ThemeKey dedup + shallow clone),
589
+ // freezing the icon tint after a color scheme change. The toolbar wrapper's theme is
590
+ // created fresh on every rebuild, so its cache entries always match the current palette.
591
+ // Plain attribute resolution (e.g. text appearance defaults) doesn't hit that cache and
592
+ // stays on the live wrappedContext.
593
+ private fun resolveDefaultBackButtonIcon(toolbar: MaterialToolbar): Drawable? =
594
+ resolveDrawableAttr(toolbar.context, androidx.appcompat.R.attr.homeAsUpIndicator)
595
+
596
+ // Mirrors how the toolbar's own overflow button obtains its icon: an AppCompatImageView built
597
+ // with actionOverflowButtonStyle resolves the theme's srcCompat and applies AppCompat's
598
+ // colorControlNormal auto-tint.
599
+ private fun resolveDefaultOverflowIcon(toolbar: MaterialToolbar): Drawable? =
600
+ AppCompatImageView(toolbar.context, null, androidx.appcompat.R.attr.actionOverflowButtonStyle).drawable
601
+
602
+ private fun buildTintList(
603
+ normal: Int?,
604
+ pressed: Int?,
605
+ focused: Int?,
606
+ ): ColorStateList? {
348
607
  if (normal == null && pressed == null && focused == null) return null
349
608
 
350
609
  val states = mutableListOf<IntArray>()
@@ -0,0 +1,11 @@
1
+ package com.swmansion.rnscreens.stack.header
2
+
3
+ import com.swmansion.rnscreens.stack.screen.StackScreen
4
+
5
+ /**
6
+ * Receives presses of the native header back button. Implemented by the object
7
+ * managing the navigation state of the stack the pressed header belongs to.
8
+ */
9
+ internal fun interface StackHeaderBackPressHandler {
10
+ fun handleHeaderBackButtonPress(pressedScreen: StackScreen)
11
+ }