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.
- package/Package.swift +87 -0
- package/README.md +0 -11
- package/android/build.gradle +1 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderConfigViewGroup.kt +2 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledHeaderSubviewViewGroup.kt +2 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/legacy/FabricEnabledViewGroup.kt +18 -3
- package/android/src/main/cpp/NativeProxy.cpp +30 -6
- package/android/src/main/cpp/NativeProxy.h +7 -1
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +7 -3
- package/android/src/main/java/com/swmansion/rnscreens/common/colorscheme/ColorSchemeCoordinator.kt +11 -1
- package/android/src/main/java/com/swmansion/rnscreens/common/container/Container.kt +17 -0
- package/android/src/main/java/com/swmansion/rnscreens/common/container/ContainerItem.kt +13 -1
- package/android/src/main/java/com/swmansion/rnscreens/common/text/ReactTextAppearance.kt +62 -0
- package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearance.kt +20 -0
- package/android/src/main/java/com/swmansion/rnscreens/common/text/TextAppearanceDefaults.kt +65 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetAppearanceCoordinator.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetBehaviorController.kt +51 -20
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetDimensionsCoordinator.kt +159 -0
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/coordinator/FormSheetKeyboardCoordinator.kt +101 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/coordinator/FormSheetNativeDismissCoordinator.kt +2 -8
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetAvailableHeightProvider.kt +44 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetContainer.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native/core → core/modals/formsheet/dialog}/FormSheetDialog.kt +36 -4
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/dialog/FormSheetDialogManager.kt +107 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeDelegate.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetContentSizeChangeProvider.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/interfaces/FormSheetDialogEventEmitter.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/model/FormSheetConfig.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/model/FormSheetDetents.kt +152 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetAnimatorFactory.kt +9 -10
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDimmingManager.kt +103 -0
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetDismissalOrigin.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentation.kt +173 -0
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetPresentationManager.kt +290 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/native → core/modals/formsheet}/presentation/FormSheetPresentationState.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/core/modals/formsheet/presentation/FormSheetStackRegistry.kt +28 -0
- package/android/src/main/java/com/swmansion/rnscreens/ext/FragmentManagerExt.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/helpers/FragmentManagerHelper.kt +0 -3
- package/android/src/main/java/com/swmansion/rnscreens/helpers/NoTintDrawable.kt +31 -0
- package/android/src/main/java/com/swmansion/rnscreens/helpers/PropIconResolver.kt +17 -23
- package/android/src/main/java/com/swmansion/rnscreens/helpers/ViewFinder.kt +0 -17
- package/android/src/main/java/com/swmansion/rnscreens/legacy/Screen.kt +32 -3
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenContainer.kt +35 -3
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStack.kt +15 -0
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderConfig.kt +7 -1
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackHeaderSubviewManager.kt +7 -0
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenStackViewManager.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/DimmingView.kt +2 -0
- package/android/src/main/java/com/swmansion/rnscreens/legacy/stack/views/ScreensCoordinatorLayout.kt +2 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapper.kt +3 -3
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/contentwrapper/FormSheetContentWrapperViewManager.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDetentChangedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidAppearEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetDidDisappearEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/react/modals/formsheet/event/FormSheetDismissEvent.kt +29 -0
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetNativeDismissPreventedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetSyncFlushEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillAppearEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/event/FormSheetWillDisappearEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetContentView.kt +3 -3
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHost.kt +5 -3
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostEventEmitter.kt +17 -10
- package/android/src/main/java/com/swmansion/rnscreens/{modals/formsheet/react → react/modals/formsheet}/host/FormSheetHostViewManager.kt +11 -9
- package/android/src/main/java/com/swmansion/rnscreens/safearea/OnInterfaceInsetsChangeListener.kt +15 -0
- package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaProvider.kt +8 -8
- package/android/src/main/java/com/swmansion/rnscreens/safearea/SafeAreaView.kt +3 -2
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderApplicator.kt +360 -101
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderBackPressHandler.kt +11 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/StackHeaderCoordinatorLayout.kt +211 -113
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderAppBarLayout.kt +156 -24
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderContentScrimDrawable.kt +36 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/appbar/StackHeaderToolbar.kt +74 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderCollapsedTitleGravityMode.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfig.kt +162 -228
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigViewManager.kt +385 -12
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationObserver.kt +5 -6
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderConfigurationProviding.kt +29 -6
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderDelegate.kt +0 -7
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/config/StackHeaderInvalidationFlags.kt +8 -7
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuApplicator.kt +27 -280
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuController.kt +448 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuDelegate.kt +10 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuMapper.kt +28 -20
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuConfig.kt +3 -55
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuGroupMetadata.kt +1 -10
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuItemConfig.kt +1 -3
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/model/StackHeaderToolbarMenuModel.kt +180 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementOptions.kt +57 -6
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementRawUpdate.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuElementUpdate.kt +1 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuIconResolver.kt +4 -3
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/update/StackHeaderToolbarMenuUpdateQueue.kt +23 -9
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperation.kt +1 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/FragmentOperationExecutor.kt +2 -1
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainer.kt +159 -21
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerDelegate.kt +7 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackContainerUpdateCoordinator.kt +5 -3
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHost.kt +27 -5
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackHostViewManager.kt +14 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/host/StackUpdateBatchStateProviding.kt +10 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/screen/PreventNativeDismissCallback.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreen.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragment.kt +50 -10
- package/android/src/main/java/com/swmansion/rnscreens/stack/screen/StackScreenFragmentDelegate.kt +12 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceApplicator.kt +106 -10
- package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceCoordinator.kt +46 -7
- package/android/src/main/java/com/swmansion/rnscreens/tabs/appearance/TabsAppearanceModel.kt +3 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/container/CustomBottomNavigationView.kt +21 -1
- package/android/src/main/java/com/swmansion/rnscreens/tabs/container/MenuHelpers.kt +5 -23
- package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainer.kt +72 -36
- package/android/src/main/java/com/swmansion/rnscreens/tabs/container/TabsContainerDelegate.kt +11 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHost.kt +22 -2
- package/android/src/main/java/com/swmansion/rnscreens/tabs/host/TabsHostA11yCoordinator.kt +23 -2
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreen.kt +58 -17
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenDelegate.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenFragment.kt +3 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIcon.kt +82 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenIconTinting.kt +17 -0
- package/android/src/main/java/com/swmansion/rnscreens/tabs/screen/TabsScreenViewManager.kt +26 -19
- package/android/src/main/java/com/swmansion/rnscreens/utils/DimensionUtils.kt +20 -6
- package/android/src/main/java/com/swmansion/rnscreens/utils/RNSLog.kt +22 -6
- package/android/src/main/java/com/swmansion/rnscreens/utils/StyleUtils.kt +22 -0
- package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_available_space.xml +8 -0
- package/android/src/main/res/base/layout/rns_collapsing_toolbar_large_entire_space.xml +8 -0
- package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_available_space.xml +8 -0
- package/android/src/main/res/base/layout/rns_collapsing_toolbar_medium_entire_space.xml +8 -0
- package/cpp/legacy/RNSScreenRemovalListener.cpp +31 -1
- package/cpp/legacy/RNSScreenRemovalListener.h +18 -3
- package/ios/RNSEnums.h +16 -1
- package/ios/conversion/RNSConversions.h +7 -108
- package/ios/helpers/image/RNSImageLoadingHelper.h +7 -0
- package/ios/helpers/image/RNSImageLoadingHelper.mm +9 -0
- package/ios/legacy/RNSBarButtonItem.mm +15 -0
- package/ios/legacy/RNSConvert.h +6 -0
- package/ios/legacy/RNSConvert.mm +17 -0
- package/ios/legacy/RNSFullWindowOverlay.mm +1 -1
- package/ios/legacy/RNSModalScreen.mm +1 -1
- package/ios/legacy/RNSNavigationBar.h +31 -0
- package/ios/legacy/RNSNavigationBar.mm +15 -0
- package/ios/legacy/RNSScreen.mm +130 -31
- package/ios/legacy/RNSScreenContentWrapper.mm +4 -1
- package/ios/legacy/RNSScreenStack.mm +202 -15
- package/ios/legacy/RNSScreenStackHeaderConfig.h +30 -0
- package/ios/legacy/RNSScreenStackHeaderConfig.mm +72 -17
- package/ios/legacy/RNSScreenStackHeaderSubview.mm +34 -1
- package/ios/legacy/RNSScreenWindowTraits.mm +5 -13
- package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.h +1 -3
- package/ios/modals/form-sheet/RNSFormSheetConfigurationApplicator.mm +11 -22
- package/ios/modals/form-sheet/RNSFormSheetContentController.h +1 -1
- package/ios/modals/form-sheet/RNSFormSheetContentController.mm +7 -18
- package/ios/modals/form-sheet/RNSFormSheetHostComponentView.mm +4 -4
- package/ios/modals/form-sheet/RNSFormSheetHostShadowStateProxy.mm +2 -2
- package/ios/modals/form-sheet/RNSFormSheetUpdateFlags.h +3 -0
- package/ios/safe-area/RNSSafeAreaViewComponentView.mm +3 -14
- package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.mm +2 -3
- package/ios/split/RNSSplitAppearanceApplicator.h +4 -4
- package/ios/split/RNSSplitAppearanceApplicator.mm +53 -56
- package/ios/split/RNSSplitHostComponentEventEmitter.h +1 -0
- package/ios/split/RNSSplitHostComponentEventEmitter.mm +1 -1
- package/ios/split/RNSSplitHostComponentView.h +5 -15
- package/ios/split/RNSSplitHostComponentView.mm +55 -6
- package/ios/split/RNSSplitHostController.h +25 -6
- package/ios/split/RNSSplitHostController.mm +24 -92
- package/ios/split/RNSSplitHostProviders.h +67 -0
- package/ios/split/RNSSplitScreenComponentView.h +0 -39
- package/ios/split/RNSSplitScreenComponentView.mm +27 -10
- package/ios/split/RNSSplitScreenController.h +26 -3
- package/ios/split/RNSSplitScreenController.mm +13 -30
- package/ios/split/RNSSplitScreenShadowStateProxy.h +1 -40
- package/ios/split/RNSSplitScreenShadowStateProxy.mm +1 -26
- package/ios/split/conversion/RNSConversions-SplitView.h +56 -0
- package/ios/{conversion → split/conversion}/RNSConversions-SplitView.mm +4 -1
- package/ios/stack/conversion/RNSConversions-Stack.h +62 -0
- package/ios/stack/conversion/RNSConversions-Stack.mm +134 -0
- package/ios/stack/header/RNSHeaderItemVisibilityPriority.h +9 -0
- package/ios/stack/header/RNSStackHeaderAppearanceMapper.h +26 -0
- package/ios/stack/header/RNSStackHeaderAppearanceMapper.mm +88 -0
- package/ios/stack/header/RNSStackHeaderConfigComponentView.h +14 -1
- package/ios/stack/header/RNSStackHeaderConfigComponentView.mm +103 -37
- package/ios/stack/header/RNSStackHeaderConfigDataProviding.h +11 -0
- package/ios/stack/header/RNSStackHeaderConfigShadowStateProxy.mm +1 -1
- package/ios/stack/header/RNSStackHeaderContentFactory.mm +3 -0
- package/ios/stack/header/RNSStackHeaderIconResolver.mm +7 -0
- package/ios/stack/header/RNSStackHeaderItemComponentView.h +12 -3
- package/ios/stack/header/RNSStackHeaderItemComponentView.mm +72 -5
- package/ios/stack/header/RNSStackHeaderItemDataProviding.h +7 -0
- package/ios/stack/header/RNSStackHeaderItemShadowStateProxy.mm +1 -1
- package/ios/stack/header/RNSStackHeaderItemSpacerComponentView.mm +2 -1
- package/ios/stack/header/RNSStackHeaderMenuCoordinator.h +13 -0
- package/ios/stack/header/RNSStackHeaderMenuCoordinator.mm +24 -0
- package/ios/stack/header/RNSStackHeaderMenuFinder.h +8 -1
- package/ios/stack/header/RNSStackHeaderMenuFinder.mm +26 -9
- package/ios/stack/header/RNSStackHeaderMenuMapper.mm +4 -0
- package/ios/stack/host/RNSStackNavigationBar.h +25 -0
- package/ios/stack/host/RNSStackNavigationBar.mm +80 -0
- package/ios/stack/host/RNSStackNavigationBarCoordinator.h +8 -0
- package/ios/stack/host/RNSStackNavigationBarCoordinator.mm +11 -0
- package/ios/stack/host/RNSStackNavigationController.mm +13 -5
- package/ios/stack/host/RNSStackOperation.h +0 -2
- package/ios/stack/screen/RNSStackScreenComponentView.h +2 -1
- package/ios/stack/screen/RNSStackScreenComponentView.mm +32 -2
- package/ios/stack/screen/RNSStackScreenController.mm +12 -0
- package/ios/stack/screen/RNSStackScreenHeaderCoordinator.h +8 -0
- package/ios/stack/screen/RNSStackScreenHeaderCoordinator.mm +179 -24
- package/ios/tabs/RNSTabBarAppearanceCoordinator.mm +110 -16
- package/ios/tabs/RNSTabBarItemCoordinator.h +16 -0
- package/ios/tabs/RNSTabBarItemCoordinator.mm +143 -0
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h +1 -1
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm +1 -1
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm +1 -1
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm +1 -1
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm +1 -1
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h +24 -0
- package/ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm +22 -0
- package/ios/tabs/conversion/RNSConversions-Tabs.h +100 -0
- package/ios/{conversion → tabs/conversion}/RNSConversions-Tabs.mm +105 -74
- package/ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h +1 -1
- package/ios/tabs/host/RNSTabBarController.h +16 -0
- package/ios/tabs/host/RNSTabBarController.mm +516 -107
- package/ios/tabs/host/RNSTabsHostComponentView.h +4 -0
- package/ios/tabs/host/RNSTabsHostComponentView.mm +41 -4
- package/ios/tabs/host/RNSTabsHostEventEmitter.mm +1 -1
- package/ios/tabs/screen/RNSTabsScreenComponentView.h +21 -0
- package/ios/tabs/screen/RNSTabsScreenComponentView.mm +56 -56
- package/ios/tabs/screen/RNSTabsScreenViewController.mm +1 -0
- package/ios/utils/RNSDefines.h +15 -7
- package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js +37 -21
- package/lib/commonjs/components/stack/header/StackHeaderConfig.android.js.map +1 -1
- package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js +41 -4
- package/lib/commonjs/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
- package/lib/commonjs/components/stack/header/StackHeaderConfig.js +17 -0
- package/lib/commonjs/components/stack/header/StackHeaderConfig.js.map +1 -0
- package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
- package/lib/commonjs/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
- package/lib/commonjs/components/stack/host/StackHost.js +17 -7
- package/lib/commonjs/components/stack/host/StackHost.js.map +1 -1
- package/lib/commonjs/components/stack/host/StackHost.web.js +0 -2
- package/lib/commonjs/components/stack/host/StackHost.web.js.map +1 -1
- package/lib/commonjs/components/stack/index.js.map +1 -1
- package/lib/commonjs/components/tabs/host/TabsHost.ios.js +3 -0
- package/lib/commonjs/components/tabs/host/TabsHost.ios.js.map +1 -1
- package/lib/commonjs/components/tabs/host/{TabsHost.web.js → TabsHost.js} +1 -1
- package/lib/commonjs/components/tabs/host/TabsHost.js.map +1 -0
- package/lib/commonjs/components/tabs/index.js.map +1 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.android.js +3 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.android.js.map +1 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js +10 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.ios.js.map +1 -1
- package/lib/commonjs/components/tabs/screen/{TabsScreen.web.js → TabsScreen.js} +1 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.js.map +1 -0
- package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js → tabs/screen/TabsScreenIcon.types.js} +1 -1
- package/lib/commonjs/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
- package/lib/commonjs/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/stack/StackHostNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
- package/lib/commonjs/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
- package/lib/commonjs/legacy/components/ScreenStackItem.js +31 -11
- package/lib/commonjs/legacy/components/ScreenStackItem.js.map +1 -1
- package/lib/module/components/stack/header/StackHeaderConfig.android.js +39 -23
- package/lib/module/components/stack/header/StackHeaderConfig.android.js.map +1 -1
- package/lib/module/components/stack/header/StackHeaderConfig.ios.js +43 -6
- package/lib/module/components/stack/header/StackHeaderConfig.ios.js.map +1 -1
- package/lib/module/components/stack/header/StackHeaderConfig.js +10 -0
- package/lib/module/components/stack/header/StackHeaderConfig.js.map +1 -0
- package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js +4 -1
- package/lib/module/components/stack/header/ios/StackHeaderItem.ios.js.map +1 -1
- package/lib/module/components/stack/host/StackHost.js +18 -8
- package/lib/module/components/stack/host/StackHost.js.map +1 -1
- package/lib/module/components/stack/host/StackHost.web.js +0 -3
- package/lib/module/components/stack/host/StackHost.web.js.map +1 -1
- package/lib/module/components/stack/index.js.map +1 -1
- package/lib/module/components/tabs/host/TabsHost.ios.js +3 -0
- package/lib/module/components/tabs/host/TabsHost.ios.js.map +1 -1
- package/{src/components/tabs/host/TabsHost.web.tsx → lib/module/components/tabs/host/TabsHost.js} +1 -2
- package/lib/module/components/tabs/host/TabsHost.js.map +1 -0
- package/lib/module/components/tabs/index.js.map +1 -1
- package/lib/module/components/tabs/screen/TabsScreen.android.js +3 -1
- package/lib/module/components/tabs/screen/TabsScreen.android.js.map +1 -1
- package/lib/module/components/tabs/screen/TabsScreen.ios.js +10 -1
- package/lib/module/components/tabs/screen/TabsScreen.ios.js.map +1 -1
- package/{src/components/tabs/screen/TabsScreen.web.tsx → lib/module/components/tabs/screen/TabsScreen.js} +1 -2
- package/lib/module/components/tabs/screen/TabsScreen.js.map +1 -0
- package/lib/module/components/tabs/screen/TabsScreenIcon.types.js +2 -0
- package/lib/module/components/{stack/header/StackHeaderConfig.d.js.map → tabs/screen/TabsScreenIcon.types.js.map} +1 -1
- package/lib/module/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.js.map +1 -1
- package/lib/module/fabric/legacy/ScreenStackNativeComponent.js.map +1 -1
- package/lib/module/fabric/stack/StackHeaderConfigAndroidNativeComponent.js.map +1 -1
- package/lib/module/fabric/stack/StackHeaderConfigIOSNativeComponent.js.map +1 -1
- package/lib/module/fabric/stack/StackHeaderItemIOSNativeComponent.js.map +1 -1
- package/lib/module/fabric/stack/StackHostNativeComponent.js.map +1 -1
- package/lib/module/fabric/tabs/TabsHostIOSNativeComponent.js.map +1 -1
- package/lib/module/fabric/tabs/TabsScreenAndroidNativeComponent.js.map +1 -1
- package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js +1 -1
- package/lib/module/fabric/tabs/TabsScreenIOSNativeComponent.js.map +1 -1
- package/lib/module/legacy/components/ScreenStackItem.js +31 -11
- package/lib/module/legacy/components/ScreenStackItem.js.map +1 -1
- package/lib/typescript/components/modals/form-sheet/FormSheet.types.d.ts +1 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts +6 -3
- package/lib/typescript/components/stack/header/StackHeaderConfig.android.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts +620 -24
- package/lib/typescript/components/stack/header/StackHeaderConfig.android.types.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts +8 -0
- package/lib/typescript/components/stack/header/StackHeaderConfig.d.ts.map +1 -0
- package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts +6 -3
- package/lib/typescript/components/stack/header/StackHeaderConfig.ios.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts +361 -2
- package/lib/typescript/components/stack/header/StackHeaderConfig.ios.types.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts +4 -2
- package/lib/typescript/components/stack/header/StackHeaderConfig.types.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.d.ts.map +1 -1
- package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts +7 -0
- package/lib/typescript/components/stack/header/ios/StackHeaderItem.ios.types.d.ts.map +1 -1
- package/lib/typescript/components/stack/host/StackHost.d.ts +1 -1
- package/lib/typescript/components/stack/host/StackHost.d.ts.map +1 -1
- package/lib/typescript/components/stack/host/StackHost.types.d.ts +47 -0
- package/lib/typescript/components/stack/host/StackHost.types.d.ts.map +1 -1
- package/lib/typescript/components/stack/host/StackHost.web.d.ts +1 -3
- package/lib/typescript/components/stack/host/StackHost.web.d.ts.map +1 -1
- package/lib/typescript/components/stack/index.d.ts +4 -3
- package/lib/typescript/components/stack/index.d.ts.map +1 -1
- package/lib/typescript/components/tabs/host/TabsHost.d.ts +5 -0
- package/lib/typescript/components/tabs/host/TabsHost.d.ts.map +1 -0
- package/lib/typescript/components/tabs/host/TabsHost.ios.d.ts.map +1 -1
- package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts +72 -0
- package/lib/typescript/components/tabs/host/TabsHost.ios.types.d.ts.map +1 -1
- package/lib/typescript/components/tabs/host/TabsHost.types.d.ts +3 -0
- package/lib/typescript/components/tabs/host/TabsHost.types.d.ts.map +1 -1
- package/lib/typescript/components/tabs/index.d.ts +4 -6
- package/lib/typescript/components/tabs/index.d.ts.map +1 -1
- package/lib/typescript/components/tabs/screen/TabsScreen.android.d.ts.map +1 -1
- package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts +42 -7
- package/lib/typescript/components/tabs/screen/TabsScreen.android.types.d.ts.map +1 -1
- package/lib/typescript/components/tabs/screen/TabsScreen.d.ts +5 -0
- package/lib/typescript/components/tabs/screen/TabsScreen.d.ts.map +1 -0
- package/lib/typescript/components/tabs/screen/TabsScreen.ios.d.ts.map +1 -1
- package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts +78 -13
- package/lib/typescript/components/tabs/screen/TabsScreen.ios.types.d.ts.map +1 -1
- package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts +91 -0
- package/lib/typescript/components/tabs/screen/TabsScreenIcon.types.d.ts.map +1 -0
- package/lib/typescript/components/tabs/screen/index.d.ts +1 -0
- package/lib/typescript/components/tabs/screen/index.d.ts.map +1 -1
- package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts +2 -0
- package/lib/typescript/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/legacy/ScreenStackNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts +52 -0
- package/lib/typescript/fabric/stack/StackHeaderConfigAndroidNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts +29 -1
- package/lib/typescript/fabric/stack/StackHeaderConfigIOSNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts +8 -0
- package/lib/typescript/fabric/stack/StackHeaderItemIOSNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts +3 -1
- package/lib/typescript/fabric/stack/StackHostNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts +4 -0
- package/lib/typescript/fabric/tabs/TabsHostIOSNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts +6 -0
- package/lib/typescript/fabric/tabs/TabsScreenAndroidNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts +10 -1
- package/lib/typescript/fabric/tabs/TabsScreenIOSNativeComponent.d.ts.map +1 -1
- package/lib/typescript/legacy/components/ScreenStackItem.d.ts +25 -0
- package/lib/typescript/legacy/components/ScreenStackItem.d.ts.map +1 -1
- package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts +4 -0
- package/lib/typescript/legacy/components/helpers/prepareHeaderBarButtonItems.d.ts.map +1 -1
- package/lib/typescript/legacy/types.d.ts +30 -0
- package/lib/typescript/legacy/types.d.ts.map +1 -1
- package/package.json +11 -8
- package/react-native.config.js +3 -0
- package/src/components/modals/form-sheet/FormSheet.types.ts +1 -1
- package/src/components/stack/header/StackHeaderConfig.android.tsx +54 -43
- package/src/components/stack/header/StackHeaderConfig.android.types.ts +641 -24
- package/src/components/stack/header/StackHeaderConfig.ios.tsx +55 -17
- package/src/components/stack/header/StackHeaderConfig.ios.types.ts +384 -2
- package/src/components/stack/header/StackHeaderConfig.tsx +12 -0
- package/src/components/stack/header/StackHeaderConfig.types.ts +4 -2
- package/src/components/stack/header/ios/StackHeaderItem.ios.tsx +9 -1
- package/src/components/stack/header/ios/StackHeaderItem.ios.types.ts +7 -0
- package/src/components/stack/host/StackHost.tsx +12 -3
- package/src/components/stack/host/StackHost.types.ts +50 -0
- package/src/components/stack/host/StackHost.web.tsx +1 -4
- package/src/components/stack/index.ts +14 -1
- package/src/components/tabs/host/TabsHost.ios.tsx +3 -0
- package/src/components/tabs/host/TabsHost.ios.types.ts +76 -0
- package/src/components/tabs/host/TabsHost.tsx +7 -0
- package/src/components/tabs/host/TabsHost.types.ts +3 -0
- package/src/components/tabs/index.ts +9 -0
- package/src/components/tabs/screen/TabsScreen.android.tsx +8 -3
- package/src/components/tabs/screen/TabsScreen.android.types.ts +42 -7
- package/src/components/tabs/screen/TabsScreen.ios.tsx +22 -5
- package/src/components/tabs/screen/TabsScreen.ios.types.ts +79 -17
- package/src/components/tabs/screen/TabsScreen.tsx +7 -0
- package/src/components/tabs/screen/TabsScreenIcon.types.ts +117 -0
- package/src/components/tabs/screen/index.ts +1 -0
- package/src/fabric/legacy/ScreenStackHeaderSubviewNativeComponent.ts +6 -0
- package/src/fabric/legacy/ScreenStackNativeComponent.ts +2 -0
- package/src/fabric/stack/StackHeaderConfigAndroidNativeComponent.ts +78 -0
- package/src/fabric/stack/StackHeaderConfigIOSNativeComponent.ts +43 -0
- package/src/fabric/stack/StackHeaderItemIOSNativeComponent.ts +13 -0
- package/src/fabric/stack/StackHostNativeComponent.ts +11 -2
- package/src/fabric/tabs/TabsHostIOSNativeComponent.ts +8 -0
- package/src/fabric/tabs/TabsScreenAndroidNativeComponent.ts +9 -0
- package/src/fabric/tabs/TabsScreenIOSNativeComponent.ts +20 -2
- package/src/legacy/components/ScreenStackItem.tsx +59 -12
- package/src/legacy/types.ts +31 -0
- package/android/src/main/java/com/swmansion/rnscreens/legacy/ScreenModalFragment.kt +0 -281
- package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogRootView.kt +0 -104
- package/android/src/main/java/com/swmansion/rnscreens/legacy/bottomsheet/BottomSheetDialogScreen.kt +0 -26
- package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingView.kt +0 -83
- package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewManager.kt +0 -89
- package/android/src/main/java/com/swmansion/rnscreens/modals/dimmingview/DimmingViewPointerEvents.kt +0 -18
- package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/coordinator/FormSheetDimensionsCoordinator.kt +0 -134
- package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/core/FormSheetDialogManager.kt +0 -162
- package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/model/FormSheetDetents.kt +0 -106
- package/android/src/main/java/com/swmansion/rnscreens/modals/formsheet/native/presentation/FormSheetPresentationManager.kt +0 -198
- package/android/src/main/java/com/swmansion/rnscreens/stack/header/toolbar/StackHeaderToolbarMenuSelectionController.kt +0 -83
- package/ios/conversion/RNSConversions-Stack.h +0 -32
- package/ios/conversion/RNSConversions-Stack.mm +0 -41
- package/ios/conversion/always_false.h +0 -31
- package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js +0 -10
- package/lib/commonjs/components/stack/header/StackHeaderConfig.web.js.map +0 -1
- package/lib/commonjs/components/tabs/host/TabsHost.d.js +0 -2
- package/lib/commonjs/components/tabs/host/TabsHost.d.js.map +0 -1
- package/lib/commonjs/components/tabs/host/TabsHost.web.js.map +0 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.d.js +0 -2
- package/lib/commonjs/components/tabs/screen/TabsScreen.d.js.map +0 -1
- package/lib/commonjs/components/tabs/screen/TabsScreen.web.js.map +0 -1
- package/lib/module/components/stack/header/StackHeaderConfig.d.js +0 -2
- package/lib/module/components/stack/header/StackHeaderConfig.web.js +0 -4
- package/lib/module/components/stack/header/StackHeaderConfig.web.js.map +0 -1
- package/lib/module/components/tabs/host/TabsHost.d.js +0 -2
- package/lib/module/components/tabs/host/TabsHost.d.js.map +0 -1
- package/lib/module/components/tabs/host/TabsHost.web.js +0 -4
- package/lib/module/components/tabs/host/TabsHost.web.js.map +0 -1
- package/lib/module/components/tabs/screen/TabsScreen.d.js +0 -2
- package/lib/module/components/tabs/screen/TabsScreen.d.js.map +0 -1
- package/lib/module/components/tabs/screen/TabsScreen.web.js +0 -4
- package/lib/module/components/tabs/screen/TabsScreen.web.js.map +0 -1
- package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts +0 -7
- package/lib/typescript/components/stack/header/StackHeaderConfig.web.d.ts.map +0 -1
- package/lib/typescript/components/tabs/host/TabsHost.web.d.ts +0 -7
- package/lib/typescript/components/tabs/host/TabsHost.web.d.ts.map +0 -1
- package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts +0 -7
- package/lib/typescript/components/tabs/screen/TabsScreen.web.d.ts.map +0 -1
- package/src/components/stack/header/StackHeaderConfig.d.ts +0 -22
- package/src/components/stack/header/StackHeaderConfig.web.tsx +0 -5
- package/src/components/tabs/host/TabsHost.d.ts +0 -12
- package/src/components/tabs/screen/TabsScreen.d.ts +0 -12
- /package/ios/{conversion → scroll-view-marker/conversion}/RNSConversions-ScrollViewMarker.h +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
package com.swmansion.rnscreens.modals.formsheet.
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.coordinator
|
|
2
2
|
|
|
3
3
|
import android.view.View
|
|
4
4
|
import android.widget.FrameLayout
|
|
5
5
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
|
6
|
-
import com.swmansion.rnscreens.modals.formsheet.
|
|
6
|
+
import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
|
|
7
7
|
|
|
8
8
|
internal class FormSheetBehaviorController(
|
|
9
9
|
private val sheetView: FrameLayout,
|
|
@@ -69,6 +69,9 @@ internal class FormSheetBehaviorController(
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
|
+
* Expected to be called from the measure pass, before the sheet is measured (see
|
|
73
|
+
* `FormSheetAvailableHeightProvider`), so the metrics below are consumed by the ongoing traversal.
|
|
74
|
+
*
|
|
72
75
|
* @param detents - parsed detents configuration.
|
|
73
76
|
* @param sheetAvailableSpace - the full window height that detent fractions are measured against.
|
|
74
77
|
* Using the full height lets a BottomSheet with large detent configured to slide
|
|
@@ -77,7 +80,11 @@ internal class FormSheetBehaviorController(
|
|
|
77
80
|
* Used exclusively when the sheet is in `fitToContents` mode.
|
|
78
81
|
* @param nativeContainerPaddingBottom - the bottom system inset. In `fitToContents` mode, this is added to the
|
|
79
82
|
* BottomSheet's height to extend its background behind the system bars, while the inner content remains within
|
|
80
|
-
* the safe area.
|
|
83
|
+
* the safe area. For fractional detents it is subtracted from the collapsed peek height, which Material resolves
|
|
84
|
+
* above the inset, so the lowest detent lands at its fraction of [sheetAvailableSpace] like the other ones.
|
|
85
|
+
* @param keyboardLift - the part of the keyboard inset above [nativeContainerPaddingBottom]. Every resting position
|
|
86
|
+
* is extended by it so the sheet is pushed above the keyboard as far as [sheetAvailableSpace] allows,
|
|
87
|
+
* see [FormSheetDetents].
|
|
81
88
|
* @param initialDetentIndex - the index of the detent the sheet should snap to while opening.
|
|
82
89
|
* @param applyInitialDetent - whether the sheet should forcefully snap to the initial detent state.
|
|
83
90
|
* This should typically be `true` only when the sheet transitions from closed to open.
|
|
@@ -87,6 +94,7 @@ internal class FormSheetBehaviorController(
|
|
|
87
94
|
sheetAvailableSpace: Int,
|
|
88
95
|
contentHeightForFitToContents: Int = 0,
|
|
89
96
|
nativeContainerPaddingBottom: Int = 0,
|
|
97
|
+
keyboardLift: Int = 0,
|
|
90
98
|
initialDetentIndex: Int = 0,
|
|
91
99
|
applyInitialDetent: Boolean = false,
|
|
92
100
|
) {
|
|
@@ -97,22 +105,39 @@ internal class FormSheetBehaviorController(
|
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
if (detents.isFitToContents) {
|
|
100
|
-
configureFitToContents(
|
|
108
|
+
configureFitToContents(
|
|
109
|
+
detents,
|
|
110
|
+
sheetAvailableSpace,
|
|
111
|
+
contentHeightForFitToContents,
|
|
112
|
+
nativeContainerPaddingBottom,
|
|
113
|
+
keyboardLift,
|
|
114
|
+
)
|
|
101
115
|
} else {
|
|
102
116
|
when (detents.count) {
|
|
103
|
-
1 -> configureSingleDetent(detents, sheetAvailableSpace)
|
|
104
|
-
2 ->
|
|
105
|
-
|
|
117
|
+
1 -> configureSingleDetent(detents, sheetAvailableSpace, keyboardLift)
|
|
118
|
+
2 ->
|
|
119
|
+
configureTwoDetents(
|
|
120
|
+
detents,
|
|
121
|
+
sheetAvailableSpace,
|
|
122
|
+
nativeContainerPaddingBottom,
|
|
123
|
+
keyboardLift,
|
|
124
|
+
initialDetentIndex,
|
|
125
|
+
applyInitialDetent,
|
|
126
|
+
)
|
|
127
|
+
3 ->
|
|
128
|
+
configureThreeDetents(
|
|
129
|
+
detents,
|
|
130
|
+
sheetAvailableSpace,
|
|
131
|
+
nativeContainerPaddingBottom,
|
|
132
|
+
keyboardLift,
|
|
133
|
+
initialDetentIndex,
|
|
134
|
+
applyInitialDetent,
|
|
135
|
+
)
|
|
106
136
|
else -> throw IllegalStateException(
|
|
107
137
|
"[RNScreens] Unsupported detent count ${detents.count}.",
|
|
108
138
|
)
|
|
109
139
|
}
|
|
110
140
|
}
|
|
111
|
-
|
|
112
|
-
// Metrics were mutated on an already-measured sheet; force a fresh layout
|
|
113
|
-
// pass so the behavior re-settles to the new detent instead of keeping its
|
|
114
|
-
// stale height.
|
|
115
|
-
sheetView.requestLayout()
|
|
116
141
|
}
|
|
117
142
|
|
|
118
143
|
private fun configureFitToContents(
|
|
@@ -120,33 +145,37 @@ internal class FormSheetBehaviorController(
|
|
|
120
145
|
sheetAvailableSpace: Int,
|
|
121
146
|
contentHeight: Int,
|
|
122
147
|
bottomInset: Int,
|
|
148
|
+
keyboardLift: Int,
|
|
123
149
|
) = behavior.apply {
|
|
124
150
|
skipCollapsed = true
|
|
125
151
|
isFitToContents = true
|
|
126
|
-
maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset)
|
|
152
|
+
maxHeight = detents.maxAllowedHeightForFitToContents(sheetAvailableSpace, contentHeight, bottomInset, keyboardLift)
|
|
127
153
|
state = BottomSheetBehavior.STATE_EXPANDED
|
|
128
154
|
}
|
|
129
155
|
|
|
130
156
|
private fun configureSingleDetent(
|
|
131
157
|
detents: FormSheetDetents,
|
|
132
158
|
sheetAvailableSpace: Int,
|
|
159
|
+
keyboardLift: Int,
|
|
133
160
|
) = behavior.apply {
|
|
134
161
|
skipCollapsed = true
|
|
135
162
|
isFitToContents = true
|
|
136
|
-
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
|
|
163
|
+
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
|
|
137
164
|
state = BottomSheetBehavior.STATE_EXPANDED
|
|
138
165
|
}
|
|
139
166
|
|
|
140
167
|
private fun configureTwoDetents(
|
|
141
168
|
detents: FormSheetDetents,
|
|
142
169
|
sheetAvailableSpace: Int,
|
|
170
|
+
bottomInset: Int,
|
|
171
|
+
keyboardLift: Int,
|
|
143
172
|
initialDetentIndex: Int,
|
|
144
173
|
applyInitialDetent: Boolean,
|
|
145
174
|
) = behavior.apply {
|
|
146
175
|
skipCollapsed = false
|
|
147
176
|
isFitToContents = true
|
|
148
|
-
peekHeight = detents.
|
|
149
|
-
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
|
|
177
|
+
peekHeight = detents.peekHeight(sheetAvailableSpace, bottomInset, keyboardLift)
|
|
178
|
+
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
|
|
150
179
|
if (applyInitialDetent) {
|
|
151
180
|
state = resolveStateFromIndex(initialDetentIndex, detents.count)
|
|
152
181
|
}
|
|
@@ -155,15 +184,17 @@ internal class FormSheetBehaviorController(
|
|
|
155
184
|
private fun configureThreeDetents(
|
|
156
185
|
detents: FormSheetDetents,
|
|
157
186
|
sheetAvailableSpace: Int,
|
|
187
|
+
bottomInset: Int,
|
|
188
|
+
keyboardLift: Int,
|
|
158
189
|
initialDetentIndex: Int,
|
|
159
190
|
applyInitialDetent: Boolean,
|
|
160
191
|
) = behavior.apply {
|
|
161
192
|
skipCollapsed = false
|
|
162
193
|
isFitToContents = false
|
|
163
|
-
peekHeight = detents.
|
|
164
|
-
halfExpandedRatio = detents.halfExpandedRatio()
|
|
165
|
-
expandedOffset = detents.expandedOffsetFromTop(sheetAvailableSpace)
|
|
166
|
-
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace)
|
|
194
|
+
peekHeight = detents.peekHeight(sheetAvailableSpace, bottomInset, keyboardLift)
|
|
195
|
+
halfExpandedRatio = detents.halfExpandedRatio(sheetAvailableSpace, keyboardLift)
|
|
196
|
+
expandedOffset = detents.expandedOffsetFromTop(sheetAvailableSpace, keyboardLift = keyboardLift)
|
|
197
|
+
maxHeight = detents.maxAllowedHeight(sheetAvailableSpace, keyboardLift)
|
|
167
198
|
if (applyInitialDetent) {
|
|
168
199
|
state = resolveStateFromIndex(initialDetentIndex, detents.count)
|
|
169
200
|
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.coordinator
|
|
2
|
+
|
|
3
|
+
import android.view.ViewGroup
|
|
4
|
+
import android.widget.FrameLayout
|
|
5
|
+
import androidx.core.view.ViewCompat
|
|
6
|
+
import androidx.core.view.WindowInsetsCompat
|
|
7
|
+
import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetAvailableHeightProvider
|
|
8
|
+
import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetContainer
|
|
9
|
+
import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
|
|
10
|
+
import com.swmansion.rnscreens.core.modals.formsheet.interfaces.FormSheetContentSizeChangeDelegate
|
|
11
|
+
import com.swmansion.rnscreens.core.modals.formsheet.model.FormSheetDetents
|
|
12
|
+
|
|
13
|
+
internal class FormSheetDimensionsCoordinator(
|
|
14
|
+
private val dialog: FormSheetDialog,
|
|
15
|
+
private val container: FormSheetContainer,
|
|
16
|
+
private val behaviorController: FormSheetBehaviorController?,
|
|
17
|
+
) : FormSheetContentSizeChangeDelegate,
|
|
18
|
+
FormSheetAvailableHeightProvider.OnAvailableHeightMeasuredListener {
|
|
19
|
+
private var lastTopInset = 0
|
|
20
|
+
private var lastBottomInset = 0
|
|
21
|
+
private var lastImeInset = 0
|
|
22
|
+
private var currentDetents: FormSheetDetents? = null
|
|
23
|
+
private var currentInitialDetentIndex: Int = 0
|
|
24
|
+
private var shouldApplyInitialDetent: Boolean = false
|
|
25
|
+
|
|
26
|
+
private var currentContentHeight: Int = 0
|
|
27
|
+
|
|
28
|
+
// Height the metrics were last resolved against. Any other value reported by the measure pass
|
|
29
|
+
// means the window has been resized and metrics have to be recomputed.
|
|
30
|
+
private var resolvedAvailableSpace: Int = 0
|
|
31
|
+
private var isGeometryDirty: Boolean = false
|
|
32
|
+
|
|
33
|
+
internal fun setup() {
|
|
34
|
+
dialog.availableHeightProvider.availableHeightListener = this
|
|
35
|
+
setupWindowInsetsListener()
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private fun setupWindowInsetsListener() {
|
|
39
|
+
ViewCompat.setOnApplyWindowInsetsListener(container) { _, insets ->
|
|
40
|
+
val topInset = getTopInset(insets)
|
|
41
|
+
val bottomInset = getBottomInset(insets)
|
|
42
|
+
val imeInset = getImeInset(insets)
|
|
43
|
+
if (topInset != lastTopInset || bottomInset != lastBottomInset || imeInset != lastImeInset) {
|
|
44
|
+
lastTopInset = topInset
|
|
45
|
+
lastBottomInset = bottomInset
|
|
46
|
+
lastImeInset = imeInset
|
|
47
|
+
invalidateGeometry()
|
|
48
|
+
}
|
|
49
|
+
insets
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override fun onContentHeightChanged(newHeight: Int) {
|
|
54
|
+
if (currentContentHeight != newHeight) {
|
|
55
|
+
currentContentHeight = newHeight
|
|
56
|
+
invalidateGeometry()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
internal fun updateFormSheetDimensions(
|
|
61
|
+
detents: FormSheetDetents?,
|
|
62
|
+
initialDetentIndex: Int = 0,
|
|
63
|
+
applyInitialDetent: Boolean = false,
|
|
64
|
+
) {
|
|
65
|
+
currentDetents = detents
|
|
66
|
+
currentInitialDetentIndex = initialDetentIndex
|
|
67
|
+
shouldApplyInitialDetent = applyInitialDetent
|
|
68
|
+
invalidateGeometry()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Schedules a measure pass; the metrics are resolved from there. The provider is a sibling of the sheet
|
|
72
|
+
// subtree, not an ancestor, so it has to be asked for a re-measure explicitly. No-op while the dialog
|
|
73
|
+
// is not shown - the first traversal after `show()` measures everything anyway.
|
|
74
|
+
private fun invalidateGeometry() {
|
|
75
|
+
isGeometryDirty = true
|
|
76
|
+
dialog.availableHeightProvider.requestLayout()
|
|
77
|
+
container.requestLayout()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override fun onAvailableHeightMeasured(height: Int) {
|
|
81
|
+
if (!isGeometryDirty && height == resolvedAvailableSpace) {
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
isGeometryDirty = false
|
|
85
|
+
resolvedAvailableSpace = height
|
|
86
|
+
resolveGeometry(height)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* For Yoga we require the container height to be "stable" to avoid updating content size in flight.
|
|
91
|
+
* If left as MATCH_PARENT, BottomSheetDialog dynamically applies insets as padding when sheet overflows
|
|
92
|
+
* status bar or display cutout. This causes Yoga to recalculate the layout, resulting in UI flickering
|
|
93
|
+
* during the drag gesture. By calculating and enforcing a static height that explicitly subtracts
|
|
94
|
+
* the system insets, we completely bypass these redundant layout passes.
|
|
95
|
+
*
|
|
96
|
+
* Runs inside the measure pass of `FormSheetAvailableHeightProvider`, i.e. before Material's container, the sheet and
|
|
97
|
+
* our container are measured, so the values applied here are picked up by the very same traversal.
|
|
98
|
+
*/
|
|
99
|
+
private fun resolveGeometry(sheetAvailableSpace: Int) {
|
|
100
|
+
currentDetents?.let { detents ->
|
|
101
|
+
behaviorController?.updateSheetBehavior(
|
|
102
|
+
detents = detents,
|
|
103
|
+
sheetAvailableSpace = sheetAvailableSpace,
|
|
104
|
+
contentHeightForFitToContents = currentContentHeight,
|
|
105
|
+
nativeContainerPaddingBottom = lastBottomInset,
|
|
106
|
+
keyboardLift = keyboardLift,
|
|
107
|
+
initialDetentIndex = currentInitialDetentIndex,
|
|
108
|
+
applyInitialDetent = shouldApplyInitialDetent,
|
|
109
|
+
)
|
|
110
|
+
shouldApplyInitialDetent = false
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
val sheetContainerHeight =
|
|
114
|
+
currentDetents?.sheetContainerHeight(
|
|
115
|
+
sheetAvailableSpace,
|
|
116
|
+
lastTopInset,
|
|
117
|
+
lastBottomInset,
|
|
118
|
+
currentContentHeight,
|
|
119
|
+
keyboardLift,
|
|
120
|
+
) ?: (sheetAvailableSpace - lastTopInset - lastBottomInset - keyboardLift).coerceAtLeast(0)
|
|
121
|
+
|
|
122
|
+
val layoutParams =
|
|
123
|
+
container.layoutParams
|
|
124
|
+
?: FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, sheetContainerHeight)
|
|
125
|
+
|
|
126
|
+
if (layoutParams.width != ViewGroup.LayoutParams.MATCH_PARENT || layoutParams.height != sheetContainerHeight) {
|
|
127
|
+
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
|
128
|
+
layoutParams.height = sheetContainerHeight
|
|
129
|
+
container.layoutParams = layoutParams
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The part of the keyboard inset that sticks out above the bottom system inset. Material pads the sheet by
|
|
135
|
+
* the larger of the two, so this is exactly how much the sheet has to be extended to keep its detent-sized
|
|
136
|
+
* part above the keyboard.
|
|
137
|
+
*/
|
|
138
|
+
private val keyboardLift: Int
|
|
139
|
+
get() = (lastImeInset - lastBottomInset).coerceAtLeast(0)
|
|
140
|
+
|
|
141
|
+
private fun getImeInset(insetsCompat: WindowInsetsCompat): Int = insetsCompat.getInsets(WindowInsetsCompat.Type.ime()).bottom
|
|
142
|
+
|
|
143
|
+
private fun getTopInset(insetsCompat: WindowInsetsCompat): Int =
|
|
144
|
+
insetsCompat
|
|
145
|
+
.getInsets(
|
|
146
|
+
WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
|
|
147
|
+
).top
|
|
148
|
+
|
|
149
|
+
private fun getBottomInset(insetsCompat: WindowInsetsCompat): Int =
|
|
150
|
+
insetsCompat
|
|
151
|
+
.getInsets(
|
|
152
|
+
WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
|
|
153
|
+
).bottom
|
|
154
|
+
|
|
155
|
+
internal fun destroy() {
|
|
156
|
+
dialog.availableHeightProvider.availableHeightListener = null
|
|
157
|
+
ViewCompat.setOnApplyWindowInsetsListener(container, null)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.coordinator
|
|
2
|
+
|
|
3
|
+
import android.widget.FrameLayout
|
|
4
|
+
import androidx.core.view.ViewCompat
|
|
5
|
+
import androidx.core.view.WindowInsetsAnimationCompat
|
|
6
|
+
import androidx.core.view.WindowInsetsCompat
|
|
7
|
+
import androidx.core.view.doOnLayout
|
|
8
|
+
|
|
9
|
+
internal class FormSheetKeyboardCoordinator(
|
|
10
|
+
private val bottomSheetView: FrameLayout,
|
|
11
|
+
) {
|
|
12
|
+
/**
|
|
13
|
+
* Whether the sheet should track the keyboard animation. Kept `false` while an enter / exit
|
|
14
|
+
* transition owns `translationY`. Tracking the keyboard (`true`) should be allowed only when
|
|
15
|
+
* the sheet is in PRESENTED state.
|
|
16
|
+
*/
|
|
17
|
+
internal var isTrackingEnabled: Boolean = false
|
|
18
|
+
|
|
19
|
+
private val insetsAnimationCallback = KeyboardInsetsAnimationCallback()
|
|
20
|
+
|
|
21
|
+
internal fun setup() {
|
|
22
|
+
// BottomSheetBehavior registers an internal `WindowInsetsAnimationCallback` on the
|
|
23
|
+
// sheet view during its first `onLayoutChild`. That callback drives `translationY` to track
|
|
24
|
+
// animated inset changes, what interferes with our slide-in custom animation.
|
|
25
|
+
//
|
|
26
|
+
// We manage insets ourselves by setting a fixed height for FormSheetContainer, so we can
|
|
27
|
+
// clear the Material's callback to remove the conflict entirely.
|
|
28
|
+
//
|
|
29
|
+
// This method must run after the first layout pass.
|
|
30
|
+
bottomSheetView.doOnLayout {
|
|
31
|
+
ViewCompat.setWindowInsetsAnimationCallback(it, insetsAnimationCallback)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
internal fun destroy() {
|
|
36
|
+
ViewCompat.setWindowInsetsAnimationCallback(bottomSheetView, null)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private inner class KeyboardInsetsAnimationCallback : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {
|
|
40
|
+
private var startTop = 0
|
|
41
|
+
private var startTranslationY = 0f
|
|
42
|
+
|
|
43
|
+
// Decided once per keyboard animation, in `onPrepare`. Tracking can't be picked up mid-animation
|
|
44
|
+
// because of no start position to translate from.
|
|
45
|
+
private var isTracking = false
|
|
46
|
+
|
|
47
|
+
private val isActive: Boolean
|
|
48
|
+
get() = isTracking && isTrackingEnabled
|
|
49
|
+
|
|
50
|
+
override fun onPrepare(animation: WindowInsetsAnimationCompat) {
|
|
51
|
+
if (!animation.isKeyboardAnimation() || !isTrackingEnabled) {
|
|
52
|
+
return
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Saving sheet's position before applying keyboard insets.
|
|
56
|
+
startTop = bottomSheetView.top
|
|
57
|
+
isTracking = true
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override fun onStart(
|
|
61
|
+
animation: WindowInsetsAnimationCompat,
|
|
62
|
+
bounds: WindowInsetsAnimationCompat.BoundsCompat,
|
|
63
|
+
): WindowInsetsAnimationCompat.BoundsCompat {
|
|
64
|
+
if (!animation.isKeyboardAnimation() || !isActive) {
|
|
65
|
+
return bounds
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The end sheet position is known - move the sheet and let the animation progress
|
|
69
|
+
// bring it to the new position.
|
|
70
|
+
startTranslationY = (startTop - bottomSheetView.top).toFloat()
|
|
71
|
+
bottomSheetView.translationY = startTranslationY
|
|
72
|
+
return bounds
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
override fun onProgress(
|
|
76
|
+
insets: WindowInsetsCompat,
|
|
77
|
+
runningAnimations: List<WindowInsetsAnimationCompat>,
|
|
78
|
+
): WindowInsetsCompat {
|
|
79
|
+
if (!isActive) {
|
|
80
|
+
return insets
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
val keyboardAnimation = runningAnimations.firstOrNull { it.isKeyboardAnimation() } ?: return insets
|
|
84
|
+
bottomSheetView.translationY = startTranslationY * (1f - keyboardAnimation.interpolatedFraction)
|
|
85
|
+
return insets
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
override fun onEnd(animation: WindowInsetsAnimationCompat) {
|
|
89
|
+
if (!animation.isKeyboardAnimation()) {
|
|
90
|
+
return
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (isActive) {
|
|
94
|
+
bottomSheetView.translationY = 0f
|
|
95
|
+
}
|
|
96
|
+
isTracking = false
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private fun WindowInsetsAnimationCompat.isKeyboardAnimation(): Boolean = typeMask and WindowInsetsCompat.Type.ime() != 0
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
package com.swmansion.rnscreens.modals.formsheet.
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.coordinator
|
|
2
2
|
|
|
3
3
|
import androidx.activity.OnBackPressedCallback
|
|
4
|
-
import com.swmansion.rnscreens.modals.
|
|
5
|
-
import com.swmansion.rnscreens.modals.formsheet.native.core.FormSheetDialog
|
|
4
|
+
import com.swmansion.rnscreens.core.modals.formsheet.dialog.FormSheetDialog
|
|
6
5
|
|
|
7
6
|
internal class FormSheetNativeDismissCoordinator(
|
|
8
7
|
private val dialog: FormSheetDialog,
|
|
9
8
|
private val behaviorController: FormSheetBehaviorController?,
|
|
10
|
-
private val dimmingManager: DimmingViewManager,
|
|
11
9
|
private val onDismissAllowed: () -> Unit,
|
|
12
10
|
private val onDismissPrevented: () -> Unit,
|
|
13
11
|
) : FormSheetDialog.CancelRequestInterceptor {
|
|
@@ -27,15 +25,11 @@ internal class FormSheetNativeDismissCoordinator(
|
|
|
27
25
|
internal fun setup() {
|
|
28
26
|
dialog.cancelRequestInterceptor = this
|
|
29
27
|
dialog.onBackPressedDispatcher.addCallback(preventNativeDismissBackPressCallback)
|
|
30
|
-
// Backdrop taps go through `cancel()` rather than dismissing directly, so that they are
|
|
31
|
-
// subject to the very same interception as the back press and the swipe down.
|
|
32
|
-
dimmingManager.setOnBackdropClickListener { dialog.cancel() }
|
|
33
28
|
}
|
|
34
29
|
|
|
35
30
|
internal fun destroy() {
|
|
36
31
|
dialog.cancelRequestInterceptor = null
|
|
37
32
|
preventNativeDismissBackPressCallback.remove()
|
|
38
|
-
dimmingManager.setOnBackdropClickListener(null)
|
|
39
33
|
}
|
|
40
34
|
|
|
41
35
|
override fun handleCancelRequest() {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.dialog
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.view.View
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* View installed as the first child of the window's `android.R.id.content`, as a sibling
|
|
8
|
+
* of Material's dialog `container` - nothing in Material's hierarchy is moved.
|
|
9
|
+
*
|
|
10
|
+
* Every metric we hand to `BottomSheetBehavior` and the height of [FormSheetContainer] is derived from
|
|
11
|
+
* the height the sheet is measured against. The measure pass is the only point where that height is known
|
|
12
|
+
* *before* the sheet gets measured. `FrameLayout` measures its children in index order, so the provider reports
|
|
13
|
+
* the height right before Material's `container`, the coordinator and the sheet are measured in the same
|
|
14
|
+
* traversal, keeping those values in sync with window resizes, e.g. orientation change.
|
|
15
|
+
*/
|
|
16
|
+
internal class FormSheetAvailableHeightProvider(
|
|
17
|
+
context: Context,
|
|
18
|
+
) : View(context) {
|
|
19
|
+
internal fun interface OnAvailableHeightMeasuredListener {
|
|
20
|
+
/**
|
|
21
|
+
* Invoked at the beginning of every measure pass with the height the sheet is about
|
|
22
|
+
* to be measured against.
|
|
23
|
+
*/
|
|
24
|
+
fun onAvailableHeightMeasured(height: Int)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
internal var availableHeightListener: OnAvailableHeightMeasuredListener? = null
|
|
28
|
+
|
|
29
|
+
init {
|
|
30
|
+
visibility = INVISIBLE
|
|
31
|
+
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override fun onMeasure(
|
|
35
|
+
widthMeasureSpec: Int,
|
|
36
|
+
heightMeasureSpec: Int,
|
|
37
|
+
) {
|
|
38
|
+
val height = MeasureSpec.getSize(heightMeasureSpec)
|
|
39
|
+
if (MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.UNSPECIFIED && height > 0) {
|
|
40
|
+
availableHeightListener?.onAvailableHeightMeasured(height)
|
|
41
|
+
}
|
|
42
|
+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
package com.swmansion.rnscreens.modals.formsheet.
|
|
1
|
+
package com.swmansion.rnscreens.core.modals.formsheet.dialog
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.os.Bundle
|
|
5
|
+
import android.util.Log
|
|
5
6
|
import android.view.View
|
|
6
7
|
import android.view.ViewGroup
|
|
7
8
|
import android.view.Window
|
|
@@ -14,8 +15,8 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
|
|
|
14
15
|
* A custom BottomSheetDialog override used to render the FormSheet native component.
|
|
15
16
|
*
|
|
16
17
|
* We enforce edge-to-edge rendering, bypassing standard Material checks.
|
|
17
|
-
* This
|
|
18
|
-
* The FormSheetContainer is sized manually against the system insets.
|
|
18
|
+
* This is required because our custom dimming logic needs the Dialog to span
|
|
19
|
+
* the entire screen. The FormSheetContainer is sized manually against the system insets.
|
|
19
20
|
*/
|
|
20
21
|
internal class FormSheetDialog(
|
|
21
22
|
context: Context,
|
|
@@ -33,6 +34,12 @@ internal class FormSheetDialog(
|
|
|
33
34
|
|
|
34
35
|
internal var cancelRequestInterceptor: CancelRequestInterceptor? = null
|
|
35
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Installed next to Material's content once the dialog is created. Reports the height the sheet
|
|
39
|
+
* is measured against so the sheet metrics can be resolved before the sheet itself is measured.
|
|
40
|
+
*/
|
|
41
|
+
internal val availableHeightProvider = FormSheetAvailableHeightProvider(context)
|
|
42
|
+
|
|
36
43
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
37
44
|
super.onCreate(savedInstanceState)
|
|
38
45
|
|
|
@@ -40,6 +47,7 @@ internal class FormSheetDialog(
|
|
|
40
47
|
disableNativeWindowAnimation(window)
|
|
41
48
|
|
|
42
49
|
setupBottomSheetHeight()
|
|
50
|
+
installAvailableHeightProvider()
|
|
43
51
|
}
|
|
44
52
|
|
|
45
53
|
override fun onAttachedToWindow() {
|
|
@@ -63,7 +71,8 @@ internal class FormSheetDialog(
|
|
|
63
71
|
* `enableEdgeToEdge` attribute AND the navigation bar is translucent (see
|
|
64
72
|
* `BottomSheetDialog#onAttachedToWindow`).
|
|
65
73
|
*
|
|
66
|
-
* We force edge-to-edge on every API level so the
|
|
74
|
+
* We force edge-to-edge on every API level so the window content always spans the whole
|
|
75
|
+
* screen.
|
|
67
76
|
*/
|
|
68
77
|
private fun forceEdgeToEdge() {
|
|
69
78
|
val window = window ?: return
|
|
@@ -80,4 +89,27 @@ internal class FormSheetDialog(
|
|
|
80
89
|
val bottomSheetView = findViewById<FrameLayout>(com.google.android.material.R.id.design_bottom_sheet)
|
|
81
90
|
bottomSheetView?.layoutParams?.height = ViewGroup.LayoutParams.MATCH_PARENT
|
|
82
91
|
}
|
|
92
|
+
|
|
93
|
+
private fun installAvailableHeightProvider() {
|
|
94
|
+
if (availableHeightProvider.parent != null) {
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
val contentParent = findViewById<ViewGroup>(android.R.id.content)
|
|
99
|
+
if (contentParent == null) {
|
|
100
|
+
Log.e(TAG, "[RNScreens] Window content view not found; the sheet dimensions won't be resolved.")
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// FrameLayout measures its children in order, so the provider reports the height before Material's container
|
|
105
|
+
contentParent.addView(
|
|
106
|
+
availableHeightProvider,
|
|
107
|
+
0,
|
|
108
|
+
FrameLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT),
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
companion object {
|
|
113
|
+
private const val TAG = "FormSheetDialog"
|
|
114
|
+
}
|
|
83
115
|
}
|