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