@apexnative/navigation 1.0.0-alpha.1 → 1.0.0-alpha.11
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/ApexNavigation.podspec +2 -1
- package/CHANGELOG.md +132 -0
- package/README.md +147 -51
- package/android/CLAUDE.md +78 -25
- package/android/CORE.md +49 -25
- package/android/RECIPES.md +13 -6
- package/android/consumer-rules.pro +6 -0
- package/android/src/main/java/dev/apexnative/navigation/NavigationActivity.kt +85 -10
- package/android/src/main/java/dev/apexnative/navigation/NavigationApplication.kt +34 -13
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutChecks.kt +5 -1
- package/android/src/main/java/dev/apexnative/navigation/layout/LayoutNode.kt +6 -2
- package/android/src/main/java/dev/apexnative/navigation/nativescreen/NativeScreenContext.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/AnimationsOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/BottomTabsOptions.kt +13 -8
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonMenuOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/ButtonOptions.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/options/HardwareBackButtonOptions.kt +9 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LargeTitleOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/LayoutAnimation.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/OptionKey.kt +18 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionPaths.kt +91 -0
- package/android/src/main/java/dev/apexnative/navigation/options/OptionsCache.kt +8 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SheetOptions.kt +7 -4
- package/android/src/main/java/dev/apexnative/navigation/options/SideMenuOptions.kt +6 -1
- package/android/src/main/java/dev/apexnative/navigation/options/StackAnimationOptions.kt +40 -2
- package/android/src/main/java/dev/apexnative/navigation/options/StatusBarOptions.kt +7 -3
- package/android/src/main/java/dev/apexnative/navigation/options/TitleOptions.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarAppearanceOptions.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/options/TopBarOptions.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/options/UserChoices.kt +159 -0
- package/android/src/main/java/dev/apexnative/navigation/react/CommandAnswer.kt +29 -36
- package/android/src/main/java/dev/apexnative/navigation/react/CommandContract.kt +59 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentHeights.kt +95 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ContentMounts.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ErrorTexts.kt +75 -60
- package/android/src/main/java/dev/apexnative/navigation/react/Hinge.kt +35 -23
- package/android/src/main/java/dev/apexnative/navigation/react/NavigationTurboModule.kt +12 -7
- package/android/src/main/java/dev/apexnative/navigation/react/OptionsCommands.kt +42 -4
- package/android/src/main/java/dev/apexnative/navigation/react/PendingCalls.kt +48 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ReactView.kt +54 -20
- package/android/src/main/java/dev/apexnative/navigation/react/ReloadCoordinator.kt +7 -6
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenEnvironment.kt +177 -0
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenRegions.kt +19 -50
- package/android/src/main/java/dev/apexnative/navigation/react/ScrollEvents.kt +49 -128
- package/android/src/main/java/dev/apexnative/navigation/react/events/AppearanceDispatcher.kt +50 -81
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventContract.kt +226 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/EventEmitter.kt +135 -94
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationState.kt +154 -0
- package/android/src/main/java/dev/apexnative/navigation/react/events/ScreenAppearance.kt +0 -6
- package/android/src/main/java/dev/apexnative/navigation/safearea/SafeAreaView.kt +12 -10
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotContainers.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotScreenView.kt +39 -19
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotView.kt +16 -4
- package/android/src/main/java/dev/apexnative/navigation/slots/SlotViews.kt +40 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageKey.kt +66 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageLoader.kt +7 -89
- package/android/src/main/java/dev/apexnative/navigation/utils/ImageRequests.kt +76 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/MaterialTheme.kt +5 -6
- package/android/src/main/java/dev/apexnative/navigation/utils/OptionImages.kt +262 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/SystemAnimations.kt +36 -0
- package/android/src/main/java/dev/apexnative/navigation/utils/UiUtils.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewController.kt +3 -1
- package/android/src/main/java/dev/apexnative/navigation/utils/ViewExtensions.kt +0 -13
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementController.kt +10 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementDefinition.kt +9 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/ArrangementPlanner.kt +20 -15
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/arrangement/SecondaryScreenPresenter.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/AppliedTabCalls.kt +49 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsCollapseBehavior.kt +5 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsController.kt +108 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/BottomTabsPresenter.kt +25 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowGeometry.kt +22 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabItems.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/TabsRoom.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentPresenter.kt +28 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ComponentViewController.kt +12 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ContentReadiness.kt +2 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/RenderWait.kt +27 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenFrame.kt +1 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenReadiness.kt +103 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/component/ScreenSafeArea.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/externalcomponent/ExternalComponentViewController.kt +2 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalAnimations.kt +22 -24
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalCoordinator.kt +109 -21
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalRecord.kt +21 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalSheet.kt +476 -73
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/ModalViews.kt +57 -25
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetBack.kt +42 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/modal/SheetStops.kt +83 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackCheck.kt +50 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/BackCallbackState.kt +49 -14
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/Navigator.kt +71 -12
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/navigator/RootCoordinator.kt +37 -11
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/overlay/OverlayCoordinator.kt +10 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/Capabilities.kt +11 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ContainerBackground.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/parent/ParentController.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuController.kt +42 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuMotion.kt +19 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuPresenter.kt +16 -7
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/sidemenu/SideMenuRules.kt +43 -4
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitPanes.kt +23 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/splitview/SplitViewController.kt +77 -17
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/BackPreview.kt +315 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/PreparedFrame.kt +3 -3
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackCommands.kt +30 -20
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackController.kt +216 -18
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackDisplay.kt +26 -1
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackQueue.kt +149 -41
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackTransitions.kt +26 -8
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/StackViews.kt +115 -6
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabMotion.kt +142 -0
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/fab/FabPresenter.kt +222 -48
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/ScreenSearch.kt +3 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/search/StackSearchPresenter.kt +30 -34
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarComponents.kt +5 -51
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/BarRowTransition.kt +3 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/ButtonPlaces.kt +11 -5
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/MenuChecks.kt +13 -56
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarPresenter.kt +219 -54
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/stack/topbar/TopBarVisibility.kt +9 -2
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ScrollEventListener.kt +6 -9
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/viewcontroller/ViewController.kt +75 -21
- package/android/src/main/java/dev/apexnative/navigation/views/animations/AnimationLayer.kt +73 -0
- package/android/src/main/java/dev/apexnative/navigation/views/animations/Curves.kt +29 -11
- package/android/src/main/java/dev/apexnative/navigation/views/animations/ValueInterpolation.kt +14 -0
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabs.kt +9 -7
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/BottomTabsLayout.kt +61 -2
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomBottomTabItemView.kt +0 -5
- package/android/src/main/java/dev/apexnative/navigation/views/bottomtabs/CustomTabRow.kt +72 -10
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStep.kt +31 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementTransitions.kt +143 -135
- package/android/src/main/java/dev/apexnative/navigation/views/element/TargetsWait.kt +13 -5
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionLayer.kt +37 -112
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionTargets.kt +9 -6
- package/android/src/main/java/dev/apexnative/navigation/views/element/TransitionViews.kt +100 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ElementPictures.kt +112 -4
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/FlightGeometry.kt +346 -36
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMorph.kt +199 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/SharedAnimatorFactory.kt +56 -41
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextMorph.kt +176 -0
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewMorph.kt +108 -0
- package/android/src/main/java/dev/apexnative/navigation/views/sidemenu/SideMenuView.kt +12 -3
- package/android/src/main/java/dev/apexnative/navigation/views/stack/ScreenEdge.kt +45 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/StackLayout.kt +140 -1
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/Fab.kt +14 -10
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabCopy.kt +85 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/fab/FabMenu.kt +13 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TitleBar.kt +5 -17
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/TopBar.kt +73 -34
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonComponentCell.kt +6 -6
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarButtonView.kt +113 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/BarMenu.kt +219 -0
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonBar.kt +125 -178
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonMenus.kt +34 -64
- package/android/src/main/java/dev/apexnative/navigation/views/stack/topbar/titlebar/ButtonRow.kt +216 -0
- package/android/src/main/jni/ANNContentHeights.cpp +82 -0
- package/android/src/main/res/drawable/apex_navigation_ic_arrow_right.xml +14 -0
- package/android/src/main/res/layout/apex_navigation_menu_header.xml +19 -0
- package/android/src/main/res/layout/apex_navigation_menu_item.xml +68 -0
- package/android/src/main/res/values/styles.xml +1 -1
- package/android/src/main/res/values-night/styles.xml +1 -1
- package/cli/app.js +1 -1
- package/cli/doctor/checks/app.js +77 -14
- package/cli/doctor/checks/splash.js +4 -22
- package/cli/migrate/native.js +18 -0
- package/cli/project.js +10 -2
- package/cli/setup/index.js +18 -0
- package/cli/setup/source.js +2 -1
- package/cli/setup/steps/appDelegate.js +66 -11
- package/cli/setup/steps/mainApplication.js +134 -19
- package/cli/setup/steps/metro.js +46 -0
- package/cli/setup/steps/sceneDelegate.js +108 -0
- package/cli/splash/index.js +3 -1
- package/docs-md/architecture/native-screens.md +4 -0
- package/docs-md/architecture/theme-and-context.md +131 -12
- package/docs-md/architecture/transitions.md +58 -12
- package/docs-md/containers/arrangement.md +17 -1
- package/docs-md/containers/modals.md +8 -4
- package/docs-md/containers/overlays.md +3 -1
- package/docs-md/containers/side-menu.md +19 -2
- package/docs-md/containers/tabs.md +5 -1
- package/docs-md/flows/bottom-sheets.md +4 -2
- package/docs-md/flows/forms-in-a-modal.md +1 -1
- package/docs-md/fundamentals/screens-and-props.md +9 -1
- package/docs-md/fundamentals/starting-the-app.md +1 -1
- package/docs-md/guides/cli.md +4 -3
- package/docs-md/guides/deep-links.md +15 -33
- package/docs-md/help/glossary.md +4 -4
- package/docs-md/help/troubleshooting.md +44 -6
- package/docs-md/index.json +61 -1
- package/docs-md/migration/from-expo-router.md +1 -1
- package/docs-md/migration/from-react-native-navigation.md +9 -3
- package/docs-md/migration/from-react-navigation.md +2 -2
- package/docs-md/screen-ui/back-and-gestures.md +46 -2
- package/docs-md/screen-ui/bar-buttons.md +5 -5
- package/docs-md/screen-ui/search.md +1 -1
- package/docs-md/screen-ui/system-ui.md +17 -12
- package/docs-md/screen-ui/toolbar-and-fab.md +4 -2
- package/docs-md/screen-ui/top-bar.md +8 -4
- package/docs-md/start/installation.md +21 -3
- package/ios/Animations/ANNFrameDriver.h +55 -15
- package/ios/Animations/ANNFrameDriver.mm +216 -60
- package/ios/Animations/ANNTransitionAnimator.h +26 -5
- package/ios/Animations/ANNTransitionAnimator.mm +61 -13
- package/ios/Animations/ANNTransitionPlan.h +2 -2
- package/ios/Animations/ANNTransitionPlan.mm +10 -0
- package/ios/Animations/ANNTransitionWait.mm +6 -7
- package/ios/Animations/Elements/ANNElementFinder.h +57 -0
- package/ios/Animations/Elements/ANNElementFinder.mm +174 -2
- package/ios/Animations/Elements/ANNElementTransition.h +10 -8
- package/ios/Animations/Elements/ANNElementTransition.mm +19 -21
- package/ios/Animations/Elements/ANNSharedElementFlight.h +16 -11
- package/ios/Animations/Elements/ANNSharedElementFlight.mm +308 -69
- package/ios/Animations/Interpolators/ANNInterpolate.h +2 -30
- package/ios/Animations/Interpolators/ANNTransformParts.h +48 -0
- package/ios/Animations/Interpolators/ANNTransformParts.mm +507 -0
- package/ios/Animations/Interpolators/ANNViewTracks.h +9 -6
- package/ios/Animations/Interpolators/ANNViewTracks.mm +100 -30
- package/ios/CLAUDE.md +60 -24
- package/ios/CORE.md +44 -34
- package/ios/Contract/ANNCommandAnswer.h +13 -5
- package/ios/Contract/ANNCommandAnswer.mm +40 -32
- package/ios/Contract/ANNCommandContract.h +15 -0
- package/ios/Contract/ANNCommandContract.mm +78 -0
- package/ios/Contract/ANNCommandRunner.h +10 -9
- package/ios/Contract/ANNCommandRunner.mm +22 -28
- package/ios/Contract/ANNErrorTexts.h +6 -2
- package/ios/Contract/ANNErrorTexts.mm +18 -10
- package/ios/Contract/ANNLayoutNode.h +3 -3
- package/ios/Contract/ANNLayoutReader.h +3 -3
- package/ios/Core/ANNAppDelegate.mm +0 -2
- package/ios/Core/ANNAppearanceDispatcher.h +5 -4
- package/ios/Core/ANNAppearanceDispatcher.mm +12 -1
- package/ios/Core/ANNDeepLinkQueue.h +22 -2
- package/ios/Core/ANNDeepLinkQueue.mm +121 -14
- package/ios/Core/ANNErrorHandler.h +9 -4
- package/ios/Core/ANNErrorHandler.mm +20 -2
- package/ios/Core/ANNEventContract.h +246 -0
- package/ios/Core/ANNEventContract.mm +225 -0
- package/ios/Core/ANNEventEmitter.h +6 -2
- package/ios/Core/ANNEventEmitter.mm +117 -80
- package/ios/Core/ANNHinge.h +6 -0
- package/ios/Core/ANNHinge.mm +15 -4
- package/ios/Core/ANNJavaScriptCalls.h +33 -0
- package/ios/Core/ANNJavaScriptCalls.mm +52 -0
- package/ios/Core/ANNLayoutProtocol.h +5 -5
- package/ios/Core/ANNNavigationState.h +7 -5
- package/ios/Core/ANNNavigationState.mm +8 -7
- package/ios/Core/ANNNodeHelper.h +32 -12
- package/ios/Core/ANNNodeHelper.mm +100 -3
- package/ios/Core/ANNParking.h +5 -4
- package/ios/Core/ANNReloadCoordinator.mm +5 -12
- package/ios/Core/ANNRenderWait.h +20 -6
- package/ios/Core/ANNRenderWait.mm +143 -56
- package/ios/Core/ANNSceneDelegate.mm +25 -15
- package/ios/Core/ANNSystemUI.h +3 -2
- package/ios/Core/ANNSystemUI.mm +7 -0
- package/ios/Core/ANNUtils.h +7 -0
- package/ios/Core/ANNUtils.mm +10 -0
- package/ios/Core/ApexNavigation+Internal.h +1 -1
- package/ios/Core/ApexNavigation.mm +7 -6
- package/ios/Core/UIViewController+LayoutProtocol.h +9 -2
- package/ios/Core/UIViewController+LayoutProtocol.mm +8 -0
- package/ios/Layouts/Arrangement/ANNArrangementState.h +2 -17
- package/ios/Layouts/Arrangement/ANNArrangementState.mm +0 -38
- package/ios/Layouts/Arrangement/ANNArrangementViewController.mm +195 -21
- package/ios/Layouts/Modal/ANNModalCoordinator.h +1 -1
- package/ios/Layouts/Modal/ANNModalCoordinator.mm +57 -16
- package/ios/Layouts/Modal/ANNModalPresentation.h +8 -5
- package/ios/Layouts/Modal/ANNModalPresentation.mm +12 -12
- package/ios/Layouts/Modal/ANNSheetPresenter.mm +83 -1
- package/ios/Layouts/Overlay/ANNOverlayCoordinator.mm +2 -8
- package/ios/Layouts/Root/ANNRootCoordinator.mm +58 -19
- package/ios/Layouts/Root/ANNSplashViewController.h +5 -3
- package/ios/Layouts/Root/ANNSplashViewController.mm +147 -0
- package/ios/Layouts/Screen/ANNComponentPresenter.h +11 -3
- package/ios/Layouts/Screen/ANNComponentPresenter.mm +34 -6
- package/ios/Layouts/Screen/ANNComponentViewController.h +15 -13
- package/ios/Layouts/Screen/ANNComponentViewController.mm +130 -75
- package/ios/Layouts/Screen/ANNNativeScreenContext.mm +7 -5
- package/ios/Layouts/Screen/ANNPreviewInteraction.h +7 -4
- package/ios/Layouts/Screen/ANNPreviewInteraction.mm +72 -10
- package/ios/Layouts/Screen/ANNScreenEnvironment.h +63 -0
- package/ios/Layouts/Screen/ANNScreenEnvironment.mm +181 -0
- package/ios/Layouts/Screen/ANNScreenPlace.h +53 -0
- package/ios/Layouts/Screen/ANNScreenPlace.mm +205 -0
- package/ios/Layouts/Screen/ANNScreenRegions.h +3 -18
- package/ios/Layouts/Screen/ANNScreenRegions.mm +9 -44
- package/ios/Layouts/Screen/ANNScreenSafeArea.h +4 -9
- package/ios/Layouts/Screen/ANNScreenSafeArea.mm +14 -16
- package/ios/Layouts/Screen/ANNScreenSettling.h +34 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +171 -0
- package/ios/Layouts/SideMenu/ANNSideMenuTypes.h +8 -0
- package/ios/Layouts/SideMenu/ANNSideMenuViewController.mm +83 -14
- package/ios/Layouts/SplitView/ANNSplitViewCommands.h +3 -2
- package/ios/Layouts/SplitView/ANNSplitViewCommands.mm +105 -39
- package/ios/Layouts/SplitView/ANNSplitViewController.mm +7 -8
- package/ios/Layouts/Stack/ANNPreviewPush.h +7 -6
- package/ios/Layouts/Stack/ANNPreviewPush.mm +142 -27
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.h +11 -2
- package/ios/Layouts/Stack/ANNStackAnimatingDelegate.mm +14 -7
- package/ios/Layouts/Stack/ANNStackCommands.mm +1 -0
- package/ios/Layouts/Stack/ANNStackController.h +8 -0
- package/ios/Layouts/Stack/ANNStackController.mm +184 -16
- package/ios/Layouts/Stack/ANNStackQueue.h +5 -2
- package/ios/Layouts/Stack/ANNStackQueue.mm +56 -43
- package/ios/Layouts/Stack/ANNSwipePopInteraction.h +26 -0
- package/ios/Layouts/Stack/ANNSwipePopInteraction.mm +185 -0
- package/ios/Layouts/Stack/InteractivePopGestureDelegate.mm +28 -4
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.h +4 -2
- package/ios/Layouts/Stack/UINavigationController+ANNCommands.mm +2 -3
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.h +4 -0
- package/ios/Layouts/Tabs/ANNBottomTabItemBuilder.mm +11 -0
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.h +12 -1
- package/ios/Layouts/Tabs/ANNBottomTabsAccessoryView.mm +23 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.h +3 -0
- package/ios/Layouts/Tabs/ANNBottomTabsController.mm +237 -57
- package/ios/Layouts/Tabs/ANNBottomTabsCustomRow.mm +8 -3
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.h +6 -2
- package/ios/Layouts/Tabs/ANNBottomTabsPresenter.mm +232 -43
- package/ios/Layouts/Tabs/ANNTabsDesign.h +6 -5
- package/ios/Layouts/Tabs/ANNTabsDesign.mm +9 -1
- package/ios/Layouts/Tabs/UITabBar+utils.h +5 -5
- package/ios/Layouts/Tabs/UITabBar+utils.mm +32 -13
- package/ios/Options/ANNAnimationOptions.h +2 -1
- package/ios/Options/ANNAnimationOptions.mm +1 -1
- package/ios/Options/ANNBottomTabsOptions.h +2 -0
- package/ios/Options/ANNBottomTabsOptions.mm +1 -0
- package/ios/Options/ANNOptions.h +25 -0
- package/ios/Options/ANNOptions.mm +157 -1
- package/ios/Options/ANNOptionsCache.h +7 -6
- package/ios/Options/ANNOptionsReader.mm +108 -0
- package/ios/Options/ANNSearchBarOptions.h +4 -3
- package/ios/Options/ANNSheetOptions.h +4 -1
- package/ios/Options/ANNSideMenuOptions.h +2 -0
- package/ios/Options/ANNSideMenuOptions.mm +2 -0
- package/ios/Options/ANNStackPopAnimationOptions.h +13 -0
- package/ios/Options/ANNStackPopAnimationOptions.mm +11 -0
- package/ios/Options/ANNUserChoice.h +57 -0
- package/ios/Options/ANNUserChoice.mm +44 -0
- package/ios/Options/Params/ANNImageSource.h +61 -0
- package/ios/Options/Params/ANNImageSource.mm +101 -0
- package/ios/Options/Params/ANNOptionImages.h +37 -0
- package/ios/Options/Params/ANNOptionImages.mm +284 -0
- package/ios/Options/Params/ANNParam.h +15 -0
- package/ios/Options/Params/ANNParam.mm +61 -0
- package/ios/Options/Params/Color.h +3 -0
- package/ios/Options/Params/Color.mm +21 -0
- package/ios/Options/Params/ColorParser.h +4 -3
- package/ios/Options/Params/ColorParser.mm +22 -4
- package/ios/Options/Params/Image.h +15 -2
- package/ios/Options/Params/Image.mm +35 -2
- package/ios/Options/Params/ImageParser.h +5 -5
- package/ios/Options/Params/ImageParser.mm +28 -46
- package/ios/Public/ApexNavigation/ANNSceneDelegate.h +3 -0
- package/ios/Public/ApexNavigation/ApexNavigation.h +1 -1
- package/ios/RECIPES.md +13 -6
- package/ios/React/ANNReactView.mm +6 -25
- package/ios/React/ANNSafeAreaViewComponentView.mm +28 -17
- package/ios/React/ANNSurfaceHostingView.h +14 -0
- package/ios/React/ANNSurfaceHostingView.mm +144 -1
- package/ios/React/Slots/ANNSlotComponentView.mm +24 -17
- package/ios/React/Slots/ANNSlotContainers.h +14 -6
- package/ios/React/Slots/ANNSlotContainers.mm +75 -2
- package/ios/React/Slots/ANNSlotHost.mm +1 -3
- package/ios/React/Slots/ANNSlotScreenView.mm +8 -2
- package/ios/TopBar/ANNBackButtonPresenter.mm +6 -5
- package/ios/TopBar/ANNBarAppearance.h +2 -1
- package/ios/TopBar/ANNBarAppearance.mm +111 -30
- package/ios/TopBar/ANNBarBackgroundComponent.mm +16 -0
- package/ios/TopBar/ANNBarButtonComponentView.h +4 -4
- package/ios/TopBar/ANNBarButtonComponentView.mm +1 -1
- package/ios/TopBar/ANNBarButtons.h +14 -8
- package/ios/TopBar/ANNBarButtons.mm +397 -80
- package/ios/TopBar/ANNIconButtonImage.h +1 -0
- package/ios/TopBar/ANNIconButtonImage.mm +34 -1
- package/ios/TopBar/ANNLargeTitlePresenter.h +13 -0
- package/ios/TopBar/ANNLargeTitlePresenter.mm +50 -7
- package/ios/TopBar/ANNMainList.h +3 -0
- package/ios/TopBar/ANNMainList.mm +4 -0
- package/ios/TopBar/ANNScrollEdgeEffects.h +22 -6
- package/ios/TopBar/ANNScrollEdgeEffects.mm +123 -16
- package/ios/TopBar/ANNSearchPresenter.mm +172 -21
- package/ios/TopBar/ANNSearchResultsViewController.mm +29 -6
- package/ios/TopBar/ANNTopBarPresenter.h +8 -2
- package/ios/TopBar/ANNTopBarPresenter.mm +155 -33
- package/ios/TurboModules/ANNTurboEventEmitter.mm +4 -35
- package/ios/TurboModules/ANNTurboModule.mm +104 -33
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.cpp +20 -0
- package/ios/cpp/react/renderer/components/ApexNavigationSpec/ANNSlotState.h +5 -14
- package/lib/module/ARCHITECTURE.md +40 -27
- package/lib/module/adapters/NativeANNTurboModule.js.map +1 -1
- package/lib/module/api/app/AppRegistry.js +14 -2
- package/lib/module/api/app/AppRegistry.js.map +1 -1
- package/lib/module/api/app/createNavigation.js +190 -66
- package/lib/module/api/app/createNavigation.js.map +1 -1
- package/lib/module/api/commands/commands.js +54 -6
- package/lib/module/api/commands/commands.js.map +1 -1
- package/lib/module/api/events/navigationEvents.js +6 -2
- package/lib/module/api/events/navigationEvents.js.map +1 -1
- package/lib/module/api/hooks/useNavigation.js +8 -3
- package/lib/module/api/hooks/useNavigation.js.map +1 -1
- package/lib/module/api/hooks/useSafeAreaInsets.js +4 -3
- package/lib/module/api/hooks/useSafeAreaInsets.js.map +1 -1
- package/lib/module/api/linking/dispatchedLinks.js +23 -0
- package/lib/module/api/linking/dispatchedLinks.js.map +1 -0
- package/lib/module/api/linking/linking.js +11 -0
- package/lib/module/api/linking/linking.js.map +1 -1
- package/lib/module/api/navigation.js.map +1 -1
- package/lib/module/api/options/OptionsChain.js +2 -2
- package/lib/module/api/screens/arrangement.js +5 -2
- package/lib/module/api/screens/arrangement.js.map +1 -1
- package/lib/module/api/screens/defineScreen.js +45 -3
- package/lib/module/api/screens/defineScreen.js.map +1 -1
- package/lib/module/api/screens/nativeScreens.js +31 -6
- package/lib/module/api/screens/nativeScreens.js.map +1 -1
- package/lib/module/api/screens/registerScreens.js +193 -35
- package/lib/module/api/screens/registerScreens.js.map +1 -1
- package/lib/module/api/theme/theme.js +5 -0
- package/lib/module/api/theme/theme.js.map +1 -1
- package/lib/module/engine/commands.js +51 -9
- package/lib/module/engine/commands.js.map +1 -1
- package/lib/module/engine/layout.js +20 -11
- package/lib/module/engine/layout.js.map +1 -1
- package/lib/module/engine/nativeScreens.js +9 -0
- package/lib/module/engine/nativeScreens.js.map +1 -1
- package/lib/module/engine/options.js +49 -15
- package/lib/module/engine/options.js.map +1 -1
- package/lib/module/engine/optionsChange.js +102 -0
- package/lib/module/engine/optionsChange.js.map +1 -0
- package/lib/module/engine/places.js +52 -7
- package/lib/module/engine/places.js.map +1 -1
- package/lib/module/engine/props.js +30 -1
- package/lib/module/engine/props.js.map +1 -1
- package/lib/module/engine/refresh.js +85 -0
- package/lib/module/engine/refresh.js.map +1 -0
- package/lib/module/engine/rememberedOptions.js +61 -1
- package/lib/module/engine/rememberedOptions.js.map +1 -1
- package/lib/module/engine/screens.js +77 -16
- package/lib/module/engine/screens.js.map +1 -1
- package/lib/module/interfaces/contract/commands.json +101 -0
- package/lib/module/interfaces/contract/errors.json +275 -0
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts +12 -2
- package/lib/typescript/adapters/NativeANNTurboModule.d.ts.map +1 -1
- package/lib/typescript/api/app/AppRegistry.d.ts.map +1 -1
- package/lib/typescript/api/app/createNavigation.d.ts +8 -3
- package/lib/typescript/api/app/createNavigation.d.ts.map +1 -1
- package/lib/typescript/api/commands/commands.d.ts.map +1 -1
- package/lib/typescript/api/commands/presentation.d.ts +4 -3
- package/lib/typescript/api/commands/presentation.d.ts.map +1 -1
- package/lib/typescript/api/events/navigationEvents.d.ts +3 -3
- package/lib/typescript/api/events/navigationEvents.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts +1 -1
- package/lib/typescript/api/hooks/useNavigation.d.ts.map +1 -1
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts +4 -3
- package/lib/typescript/api/hooks/useSafeAreaInsets.d.ts.map +1 -1
- package/lib/typescript/api/index.d.ts +1 -1
- package/lib/typescript/api/index.d.ts.map +1 -1
- package/lib/typescript/api/linking/dispatchedLinks.d.ts +7 -0
- package/lib/typescript/api/linking/dispatchedLinks.d.ts.map +1 -0
- package/lib/typescript/api/linking/linking.d.ts +8 -0
- package/lib/typescript/api/linking/linking.d.ts.map +1 -1
- package/lib/typescript/api/navigation.d.ts +4 -1
- package/lib/typescript/api/navigation.d.ts.map +1 -1
- package/lib/typescript/api/options/OptionsChain.d.ts +2 -2
- package/lib/typescript/api/screens/arrangement.d.ts +12 -2
- package/lib/typescript/api/screens/arrangement.d.ts.map +1 -1
- package/lib/typescript/api/screens/defineScreen.d.ts +23 -4
- package/lib/typescript/api/screens/defineScreen.d.ts.map +1 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts +8 -1
- package/lib/typescript/api/screens/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/api/screens/registerScreens.d.ts.map +1 -1
- package/lib/typescript/api/theme/theme.d.ts +2 -0
- package/lib/typescript/api/theme/theme.d.ts.map +1 -1
- package/lib/typescript/engine/commands.d.ts +5 -0
- package/lib/typescript/engine/commands.d.ts.map +1 -1
- package/lib/typescript/engine/layout.d.ts.map +1 -1
- package/lib/typescript/engine/nativeScreens.d.ts +5 -0
- package/lib/typescript/engine/nativeScreens.d.ts.map +1 -1
- package/lib/typescript/engine/options.d.ts +5 -2
- package/lib/typescript/engine/options.d.ts.map +1 -1
- package/lib/typescript/engine/optionsChange.d.ts +28 -0
- package/lib/typescript/engine/optionsChange.d.ts.map +1 -0
- package/lib/typescript/engine/places.d.ts +7 -2
- package/lib/typescript/engine/places.d.ts.map +1 -1
- package/lib/typescript/engine/props.d.ts +8 -1
- package/lib/typescript/engine/props.d.ts.map +1 -1
- package/lib/typescript/engine/refresh.d.ts +35 -0
- package/lib/typescript/engine/refresh.d.ts.map +1 -0
- package/lib/typescript/engine/rememberedOptions.d.ts +13 -0
- package/lib/typescript/engine/rememberedOptions.d.ts.map +1 -1
- package/lib/typescript/engine/screens.d.ts +27 -6
- package/lib/typescript/engine/screens.d.ts.map +1 -1
- package/lib/typescript/interfaces/ComponentEvents.d.ts +4 -4
- package/lib/typescript/interfaces/ComponentEvents.d.ts.map +1 -1
- package/lib/typescript/interfaces/Events.d.ts +28 -10
- package/lib/typescript/interfaces/Events.d.ts.map +1 -1
- package/lib/typescript/interfaces/Options.d.ts +1 -1
- package/lib/typescript/interfaces/Options.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/animations.d.ts +80 -22
- package/lib/typescript/interfaces/options/animations.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/bottomTabs.d.ts +21 -7
- package/lib/typescript/interfaces/options/bottomTabs.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/buttons.d.ts +23 -15
- package/lib/typescript/interfaces/options/buttons.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/modals.d.ts +34 -26
- package/lib/typescript/interfaces/options/modals.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/sideMenu.d.ts +23 -6
- package/lib/typescript/interfaces/options/sideMenu.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/stack.d.ts +17 -3
- package/lib/typescript/interfaces/options/stack.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/system.d.ts +18 -11
- package/lib/typescript/interfaces/options/system.d.ts.map +1 -1
- package/lib/typescript/interfaces/options/toolbar.d.ts +2 -2
- package/lib/typescript/interfaces/options/topBar.d.ts +68 -38
- package/lib/typescript/interfaces/options/topBar.d.ts.map +1 -1
- package/metro/acceptPlugin.js +57 -0
- package/metro/babelTransformer.js +45 -0
- package/metro/index.js +36 -0
- package/package.json +3 -1
- package/src/ARCHITECTURE.md +40 -27
- package/src/adapters/NativeANNTurboModule.ts +12 -2
- package/src/api/app/AppRegistry.ts +16 -2
- package/src/api/app/createNavigation.ts +203 -69
- package/src/api/commands/commands.ts +48 -7
- package/src/api/commands/presentation.ts +4 -3
- package/src/api/events/navigationEvents.ts +10 -4
- package/src/api/hooks/useNavigation.ts +9 -4
- package/src/api/hooks/useSafeAreaInsets.ts +4 -3
- package/src/api/index.ts +1 -0
- package/src/api/linking/dispatchedLinks.ts +18 -0
- package/src/api/linking/linking.ts +22 -1
- package/src/api/navigation.ts +4 -1
- package/src/api/options/OptionsChain.ts +2 -2
- package/src/api/screens/arrangement.ts +17 -4
- package/src/api/screens/defineScreen.ts +49 -5
- package/src/api/screens/nativeScreens.ts +40 -4
- package/src/api/screens/registerScreens.tsx +185 -42
- package/src/api/theme/theme.ts +5 -0
- package/src/engine/commands.ts +70 -13
- package/src/engine/layout.ts +27 -11
- package/src/engine/nativeScreens.ts +10 -1
- package/src/engine/options.ts +45 -19
- package/src/engine/optionsChange.ts +107 -0
- package/src/engine/places.ts +65 -7
- package/src/engine/props.ts +30 -1
- package/src/engine/refresh.ts +97 -0
- package/src/engine/rememberedOptions.ts +74 -1
- package/src/engine/screens.tsx +76 -21
- package/src/interfaces/ComponentEvents.ts +4 -4
- package/src/interfaces/Events.ts +29 -10
- package/src/interfaces/Options.ts +1 -0
- package/src/interfaces/contract/commands.json +101 -0
- package/src/interfaces/contract/errors.json +275 -0
- package/src/interfaces/options/animations.ts +81 -22
- package/src/interfaces/options/bottomTabs.ts +21 -7
- package/src/interfaces/options/buttons.ts +23 -15
- package/src/interfaces/options/modals.ts +34 -26
- package/src/interfaces/options/sideMenu.ts +24 -6
- package/src/interfaces/options/stack.ts +17 -3
- package/src/interfaces/options/system.ts +18 -11
- package/src/interfaces/options/toolbar.ts +2 -2
- package/src/interfaces/options/topBar.ts +68 -38
- package/android/src/main/java/dev/apexnative/navigation/react/ArrangementStates.kt +0 -41
- package/android/src/main/java/dev/apexnative/navigation/react/ScreenInsets.kt +0 -69
- package/android/src/main/java/dev/apexnative/navigation/react/events/NavigationStateReporter.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/react/events/StateHold.kt +0 -62
- package/android/src/main/java/dev/apexnative/navigation/viewcontrollers/bottomtabs/CustomTabRowPlacer.kt +0 -223
- package/android/src/main/java/dev/apexnative/navigation/views/element/ElementStub.kt +0 -31
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ImageMatrixAnimator.kt +0 -138
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt +0 -88
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PropertyAnimatorCreator.kt +0 -33
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ReactImageAnimator.kt +0 -66
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/TextChangeAnimator.kt +0 -179
- package/android/src/main/java/dev/apexnative/navigation/views/element/animators/ViewChangeAnimator.kt +0 -139
- package/ios/Layouts/Screen/ANNScreenInsets.h +0 -30
- package/ios/Layouts/Screen/ANNScreenInsets.mm +0 -68
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.h +0 -27
- package/ios/Layouts/Tabs/ANNTabsPreloadWindow.mm +0 -55
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.viewcontrollers.bottomtabs
|
|
2
|
-
|
|
3
|
-
import android.app.Activity
|
|
4
|
-
import android.app.Application
|
|
5
|
-
import android.os.Bundle
|
|
6
|
-
import android.view.View
|
|
7
|
-
import android.view.ViewGroup
|
|
8
|
-
import android.view.ViewTreeObserver
|
|
9
|
-
import androidx.core.view.ViewCompat
|
|
10
|
-
import androidx.core.view.WindowInsetsCompat
|
|
11
|
-
import dev.apexnative.navigation.NavigationActivity
|
|
12
|
-
import dev.apexnative.navigation.utils.UiUtils
|
|
13
|
-
import dev.apexnative.navigation.viewcontrollers.modal.ModalContainer
|
|
14
|
-
import dev.apexnative.navigation.views.bottomtabs.BottomTabsLayout
|
|
15
|
-
import dev.apexnative.navigation.views.bottomtabs.CustomTabRow
|
|
16
|
-
import java.util.WeakHashMap
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Puts the custom rows of the tabs in their place, as it works now: an observer of every activity of the process that
|
|
20
|
-
* touches only the navigation's activities; on each layout pass of such a window it finds the tabs with a row through
|
|
21
|
-
* the view tree, and puts each row in the window's content right above the layer holding its tabs (after the rows
|
|
22
|
-
* already there) — tabs in a modal: in the modal's own view, right above its root's view (or its sheet), so the row
|
|
23
|
-
* moves with the modal and newer modals cover it —, over the bar as [CustomTabRowGeometry] says — applied only when it
|
|
24
|
-
* changed, so UI tests reach idle. A row whose tabs left the window leaves it too, and comes back to its place as they
|
|
25
|
-
* do. Before each frame the row takes its tabs' alpha (a root that waits under the old one is transparent) and the
|
|
26
|
-
* motion of the bar's container, and stays out of accessibility and touches while they wait. Main thread only.
|
|
27
|
-
*/
|
|
28
|
-
internal object CustomTabRowPlacer : Application.ActivityLifecycleCallbacks {
|
|
29
|
-
private var registered = false
|
|
30
|
-
// The listeners of each observed activity's window.
|
|
31
|
-
private val observed = WeakHashMap<Activity, Listeners>()
|
|
32
|
-
// The rows placed at the last layout pass of each activity, with their tabs.
|
|
33
|
-
private val rows = WeakHashMap<CustomTabRow, BottomTabsLayout>()
|
|
34
|
-
|
|
35
|
-
private class Listeners(
|
|
36
|
-
val observer: ViewTreeObserver,
|
|
37
|
-
val layout: ViewTreeObserver.OnGlobalLayoutListener,
|
|
38
|
-
val draw: ViewTreeObserver.OnPreDrawListener,
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
/** [activity] has tabs with a row: its window is observed from now on, and the process's later activities. */
|
|
42
|
-
fun track(activity: Activity) {
|
|
43
|
-
if (!registered) {
|
|
44
|
-
registered = true
|
|
45
|
-
activity.application?.registerActivityLifecycleCallbacks(this)
|
|
46
|
-
}
|
|
47
|
-
observe(activity)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** The tabs of [row] go: the row leaves the window. */
|
|
51
|
-
fun forget(row: CustomTabRow) {
|
|
52
|
-
rows.remove(row)
|
|
53
|
-
(row.parent as? ViewGroup)?.removeView(row)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
override fun onActivityResumed(activity: Activity) = observe(activity)
|
|
57
|
-
|
|
58
|
-
override fun onActivityDestroyed(activity: Activity) {
|
|
59
|
-
val listeners = observed.remove(activity) ?: return
|
|
60
|
-
if (!listeners.observer.isAlive) return
|
|
61
|
-
listeners.observer.removeOnGlobalLayoutListener(listeners.layout)
|
|
62
|
-
listeners.observer.removeOnPreDrawListener(listeners.draw)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) = Unit
|
|
66
|
-
|
|
67
|
-
override fun onActivityStarted(activity: Activity) = Unit
|
|
68
|
-
|
|
69
|
-
override fun onActivityPaused(activity: Activity) = Unit
|
|
70
|
-
|
|
71
|
-
override fun onActivityStopped(activity: Activity) = Unit
|
|
72
|
-
|
|
73
|
-
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
|
|
74
|
-
|
|
75
|
-
// Only the navigation's activities: another activity's views are never looked for.
|
|
76
|
-
private fun observe(activity: Activity) {
|
|
77
|
-
if (activity !is NavigationActivity || observed.containsKey(activity)) return
|
|
78
|
-
val decor = activity.window?.decorView ?: return
|
|
79
|
-
val observer = decor.viewTreeObserver
|
|
80
|
-
val layout = ViewTreeObserver.OnGlobalLayoutListener { place(activity) }
|
|
81
|
-
val draw = ViewTreeObserver.OnPreDrawListener {
|
|
82
|
-
follow(activity)
|
|
83
|
-
true
|
|
84
|
-
}
|
|
85
|
-
observer.addOnGlobalLayoutListener(layout)
|
|
86
|
-
observer.addOnPreDrawListener(draw)
|
|
87
|
-
observed[activity] = Listeners(observer, layout, draw)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private fun contentOf(activity: Activity): ViewGroup? =
|
|
91
|
-
activity.window?.decorView?.findViewById(android.R.id.content)
|
|
92
|
-
|
|
93
|
-
// Each layout pass: the tabs with a row in the content, and the rows in their places.
|
|
94
|
-
private fun place(activity: NavigationActivity) {
|
|
95
|
-
val content = contentOf(activity) ?: return
|
|
96
|
-
val found = ArrayList<BottomTabsLayout>()
|
|
97
|
-
collect(content, found)
|
|
98
|
-
val placed = found.mapNotNull { tabs -> tabs.row?.also { place(activity, content, tabs, it) } }.toSet()
|
|
99
|
-
// A row whose tabs left the window leaves it too.
|
|
100
|
-
rows.entries.filter { (row, tabs) -> row !in placed && tabs.context === activity }.forEach { (row, _) ->
|
|
101
|
-
(row.parent as? ViewGroup)?.removeView(row)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private fun collect(view: View, found: MutableList<BottomTabsLayout>) {
|
|
106
|
-
if (view is CustomTabRow) return
|
|
107
|
-
if (view is BottomTabsLayout && view.row != null) found += view
|
|
108
|
-
if (view is ViewGroup) for (index in 0 until view.childCount) collect(view.getChildAt(index), found)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private fun place(activity: NavigationActivity, content: ViewGroup, tabs: BottomTabsLayout, row: CustomTabRow) {
|
|
112
|
-
rows[row] = tabs
|
|
113
|
-
val (host, layer) = placeIn(content, tabs) ?: return
|
|
114
|
-
if (row.parent !== host) {
|
|
115
|
-
(row.parent as? ViewGroup)?.removeView(row)
|
|
116
|
-
// Margins of the host's own kind: the host converts them (a frame or a coordinator layout).
|
|
117
|
-
host.addView(row, indexAbove(host, layer, row), ViewGroup.MarginLayoutParams(0, 0))
|
|
118
|
-
row.place = null
|
|
119
|
-
} else if (host.indexOfChild(row) != indexAbove(host, layer, row)) {
|
|
120
|
-
val params = row.layoutParams
|
|
121
|
-
host.removeView(row)
|
|
122
|
-
host.addView(row, indexAbove(host, layer, row), params)
|
|
123
|
-
}
|
|
124
|
-
row.showWith(tabs.bar)
|
|
125
|
-
if (tabs.bar.visibility == View.GONE || tabs.bar.width == 0) return
|
|
126
|
-
val place = placeOf(activity, host, tabs, row)
|
|
127
|
-
if (!CustomTabRowGeometry.needsPlacing(row.place, place)) return
|
|
128
|
-
row.place = place
|
|
129
|
-
val params = row.layoutParams as? ViewGroup.MarginLayoutParams ?: return
|
|
130
|
-
params.width = place.right - place.left
|
|
131
|
-
params.height = place.bottom - place.top
|
|
132
|
-
params.leftMargin = place.left
|
|
133
|
-
params.topMargin = place.top
|
|
134
|
-
row.layoutParams = params
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Over the bar: its edges less the margins, its bottom, the height of the content and the margin below it, in the
|
|
138
|
-
// coordinates of the row's [host].
|
|
139
|
-
private fun placeOf(
|
|
140
|
-
activity: Activity,
|
|
141
|
-
host: ViewGroup,
|
|
142
|
-
tabs: BottomTabsLayout,
|
|
143
|
-
row: CustomTabRow,
|
|
144
|
-
): CustomTabRowGeometry.Place {
|
|
145
|
-
val bar = IntArray(2).also(tabs.bar::getLocationInWindow)
|
|
146
|
-
val origin = IntArray(2).also(host::getLocationInWindow)
|
|
147
|
-
val options = row.options
|
|
148
|
-
val margin = UiUtils.dpToPixels(
|
|
149
|
-
activity,
|
|
150
|
-
options.horizontalMargin.get(CustomTabRowGeometry.HORIZONTAL_MARGIN_DP.toDouble()),
|
|
151
|
-
)
|
|
152
|
-
val height = options.height.get(null)?.let { UiUtils.dpToPixels(activity, it) }
|
|
153
|
-
val extra = UiUtils.dpToPixels(activity, CustomTabRowGeometry.EXTRA_HEIGHT_DP.toDouble())
|
|
154
|
-
// Where the bar rests: its container's motion (a ride, a slide, the hide on scroll) the row takes before each
|
|
155
|
-
// frame as its own translation.
|
|
156
|
-
val left = bar[0] - origin[0] - tabs.container.translationX.toInt()
|
|
157
|
-
val top = bar[1] - origin[1] - tabs.container.translationY.toInt()
|
|
158
|
-
// Never over the navigation bar's buttons: the bar is above them, and so is the row.
|
|
159
|
-
val navigationBar = if ((activity as? NavigationActivity)?.isEdgeToEdge == true) navigationBarOf(host) else 0
|
|
160
|
-
return CustomTabRowGeometry.place(
|
|
161
|
-
barLeft = left,
|
|
162
|
-
barRight = left + tabs.bar.width,
|
|
163
|
-
barBottom = minOf(top + tabs.bar.height, host.height - navigationBar),
|
|
164
|
-
margin = margin,
|
|
165
|
-
content = CustomTabRowGeometry.content(tabs.bar.height, height, extra),
|
|
166
|
-
bottomMargin = UiUtils.dpToPixels(activity, options.bottomMargin.get(0.0)),
|
|
167
|
-
)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// The navigation bar at the bottom of the window, through the compat insets on every version.
|
|
171
|
-
private fun navigationBarOf(view: View): Int =
|
|
172
|
-
ViewCompat.getRootWindowInsets(view)?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom ?: 0
|
|
173
|
-
|
|
174
|
-
// Where the row of [tabs] goes, and the child there it goes right above: tabs in a modal, the modal's own view and
|
|
175
|
-
// the view in it that holds them (its root's, or its sheet's container); else the content and the layer of the
|
|
176
|
-
// root or of the overlays. A sheet's drag moves it without a layout: the row doesn't follow a drag.
|
|
177
|
-
private fun placeIn(content: ViewGroup, tabs: View): Pair<ViewGroup, View>? {
|
|
178
|
-
var current: View = tabs
|
|
179
|
-
while (true) {
|
|
180
|
-
val parent = current.parent as? ViewGroup ?: return null
|
|
181
|
-
if (parent is ModalContainer || parent === content) return parent to current
|
|
182
|
-
current = parent
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Right above [layer], after the rows already there.
|
|
187
|
-
private fun indexAbove(host: ViewGroup, layer: View, row: CustomTabRow): Int {
|
|
188
|
-
var index = host.indexOfChild(layer) + 1
|
|
189
|
-
while (index < host.childCount) {
|
|
190
|
-
val child = host.getChildAt(index)
|
|
191
|
-
if (child !is CustomTabRow || child === row) break
|
|
192
|
-
index++
|
|
193
|
-
}
|
|
194
|
-
return index
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Before each frame: the row takes the alpha of its tabs up to the view it is in and the container's translation,
|
|
198
|
-
// and leaves accessibility while they wait to show.
|
|
199
|
-
private fun follow(activity: Activity) {
|
|
200
|
-
val content = contentOf(activity) ?: return
|
|
201
|
-
for ((row, tabs) in rows) {
|
|
202
|
-
val host = row.parent as? View ?: continue
|
|
203
|
-
if (host !== content && host !is ModalContainer) continue
|
|
204
|
-
var alpha = tabs.container.alpha
|
|
205
|
-
var current: View? = tabs
|
|
206
|
-
while (current != null && current !== host) {
|
|
207
|
-
alpha *= current.alpha
|
|
208
|
-
current = current.parent as? View
|
|
209
|
-
}
|
|
210
|
-
if (row.alpha != alpha) row.alpha = alpha
|
|
211
|
-
// The row goes with the bar's container: a ride, a slide, the hide on scroll.
|
|
212
|
-
val container = tabs.container
|
|
213
|
-
if (row.translationX != container.translationX) row.translationX = container.translationX
|
|
214
|
-
if (row.translationY != container.translationY) row.translationY = container.translationY
|
|
215
|
-
val mode = if (row.hiddenFromAccessibility()) {
|
|
216
|
-
View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
|
|
217
|
-
} else {
|
|
218
|
-
View.IMPORTANT_FOR_ACCESSIBILITY_AUTO
|
|
219
|
-
}
|
|
220
|
-
if (row.importantForAccessibility != mode) row.importantForAccessibility = mode
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.views.element
|
|
2
|
-
|
|
3
|
-
import android.annotation.SuppressLint
|
|
4
|
-
import android.content.Context
|
|
5
|
-
import android.graphics.Canvas
|
|
6
|
-
import android.view.MotionEvent
|
|
7
|
-
import android.view.View
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The empty view that stands in an element's place in its parent while the element is in the transition layer: the same
|
|
11
|
-
* id at the same index with the same layout, so Fabric finds the parent's children as it left them; React removing it
|
|
12
|
-
* removes the element for good. It has no `nativeID`, so no search finds it as the element. It draws nothing and takes
|
|
13
|
-
* no touches. Main thread only.
|
|
14
|
-
*/
|
|
15
|
-
@SuppressLint("ViewConstructor")
|
|
16
|
-
internal class ElementStub(context: Context, element: View) : View(context) {
|
|
17
|
-
init {
|
|
18
|
-
id = element.id
|
|
19
|
-
importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_NO
|
|
20
|
-
isClickable = false
|
|
21
|
-
isFocusable = false
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) =
|
|
25
|
-
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec))
|
|
26
|
-
|
|
27
|
-
override fun draw(canvas: Canvas) = Unit
|
|
28
|
-
|
|
29
|
-
@SuppressLint("ClickableViewAccessibility")
|
|
30
|
-
override fun onTouchEvent(event: MotionEvent?): Boolean = false
|
|
31
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.views.element.animators
|
|
2
|
-
|
|
3
|
-
import android.animation.Animator
|
|
4
|
-
import android.graphics.Matrix
|
|
5
|
-
import android.view.View
|
|
6
|
-
import android.view.ViewOutlineProvider
|
|
7
|
-
import android.widget.ImageView
|
|
8
|
-
import androidx.core.animation.doOnEnd
|
|
9
|
-
import androidx.core.animation.doOnStart
|
|
10
|
-
import com.facebook.react.views.view.ReactViewGroup
|
|
11
|
-
import dev.apexnative.navigation.utils.borderRadius
|
|
12
|
-
import dev.apexnative.navigation.views.animations.ValueInterpolation
|
|
13
|
-
import dev.apexnative.navigation.views.element.TransitionLayer
|
|
14
|
-
import kotlin.math.max
|
|
15
|
-
import kotlin.math.min
|
|
16
|
-
import kotlin.math.roundToInt
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A shared image of another kind (an `ImageView` that isn't React Native's): its place by a translation; its image
|
|
20
|
-
* matrix from `from`'s fit (`centerCrop`, `fitXY`, `fitCenter`, `centerInside`) to its own, the part seen from `from`'s
|
|
21
|
-
* size to its own, the corner radius of the parent that clips it (`borderRadius` with `overflow: hidden`) by its
|
|
22
|
-
* outline. Another fit: the pair moves without the change of its matrix, and a line goes to the log. Everything goes
|
|
23
|
-
* back as it was at the end. Main thread only.
|
|
24
|
-
*/
|
|
25
|
-
internal class ImageMatrixAnimator(
|
|
26
|
-
private val from: ImageView,
|
|
27
|
-
private val to: ImageView,
|
|
28
|
-
private val layer: TransitionLayer,
|
|
29
|
-
/** The parents the views are clipped by in their screens: [to]'s is the one it had before the layer. */
|
|
30
|
-
private val fromParent: View?,
|
|
31
|
-
private val toParent: View?,
|
|
32
|
-
private val id: String,
|
|
33
|
-
private val log: (String) -> Unit,
|
|
34
|
-
) {
|
|
35
|
-
/** The animator; none when [to] has no place in the layer. */
|
|
36
|
-
fun create(): Animator? {
|
|
37
|
-
val geometry = FlightGeometry.of(from, to, layer) ?: return null
|
|
38
|
-
val toRect = geometry.to
|
|
39
|
-
val fromFit = from.scaleType
|
|
40
|
-
val toFit = to.scaleType
|
|
41
|
-
// The image whose matrix changes; none when a fit isn't one of the four or there is no image to fit.
|
|
42
|
-
val image = to.drawable?.takeIf {
|
|
43
|
-
fromFit in FITS && toFit in FITS && it.intrinsicWidth > 0 && it.intrinsicHeight > 0
|
|
44
|
-
}
|
|
45
|
-
val fits = image != null
|
|
46
|
-
if (!fits) log("The image '$id' fits by ${fromFit.name} and ${toFit.name}: it moves without a change of fit")
|
|
47
|
-
val fromRadius = clipRadius(fromParent) * geometry.fromScale
|
|
48
|
-
val toRadius = clipRadius(toParent)
|
|
49
|
-
val outline = FlightOutline()
|
|
50
|
-
var savedProvider: ViewOutlineProvider? = null
|
|
51
|
-
var savedClip = false
|
|
52
|
-
val savedMatrix = Matrix(to.imageMatrix)
|
|
53
|
-
val start = FloatArray(MATRIX)
|
|
54
|
-
val end = FloatArray(MATRIX)
|
|
55
|
-
val values = FloatArray(MATRIX)
|
|
56
|
-
val matrix = Matrix()
|
|
57
|
-
return MoveAnimator().apply {
|
|
58
|
-
fun frame(time: Float) {
|
|
59
|
-
val f = curve.getInterpolation(time)
|
|
60
|
-
val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
|
|
61
|
-
val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
|
|
62
|
-
val width = ValueInterpolation.number(geometry.from.width(), toRect.width(), f, time).roundToInt()
|
|
63
|
-
val height = ValueInterpolation.number(geometry.from.height(), toRect.height(), f, time).roundToInt()
|
|
64
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
|
|
65
|
-
to.translationX = left - toRect.left
|
|
66
|
-
to.translationY = top - toRect.top
|
|
67
|
-
outline.width = width
|
|
68
|
-
outline.height = height
|
|
69
|
-
outline.radius = ValueInterpolation.number(fromRadius, toRadius, f, time)
|
|
70
|
-
to.invalidateOutline()
|
|
71
|
-
if (image != null) {
|
|
72
|
-
val imageWidth = image.intrinsicWidth
|
|
73
|
-
val imageHeight = image.intrinsicHeight
|
|
74
|
-
fitMatrix(fromFit, imageWidth, imageHeight, width, height).getValues(start)
|
|
75
|
-
fitMatrix(toFit, imageWidth, imageHeight, width, height).getValues(end)
|
|
76
|
-
for (i in 0 until MATRIX) values[i] = ValueInterpolation.number(start[i], end[i], f, time)
|
|
77
|
-
matrix.setValues(values)
|
|
78
|
-
to.imageMatrix = matrix
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
doOnStart {
|
|
82
|
-
savedProvider = to.outlineProvider
|
|
83
|
-
savedClip = to.clipToOutline
|
|
84
|
-
to.outlineProvider = outline
|
|
85
|
-
to.clipToOutline = true
|
|
86
|
-
if (fits) to.scaleType = ImageView.ScaleType.MATRIX
|
|
87
|
-
frame(0f)
|
|
88
|
-
}
|
|
89
|
-
addUpdateListener { frame(it.animatedFraction) }
|
|
90
|
-
doOnEnd {
|
|
91
|
-
if (fits) {
|
|
92
|
-
to.scaleType = toFit
|
|
93
|
-
to.imageMatrix = savedMatrix
|
|
94
|
-
}
|
|
95
|
-
to.outlineProvider = savedProvider
|
|
96
|
-
to.clipToOutline = savedClip
|
|
97
|
-
to.translationX = 0f
|
|
98
|
-
to.translationY = 0f
|
|
99
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
|
|
100
|
-
toRect.height().toInt())
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// The radius of a React parent that clips what is in it; 0 for another.
|
|
106
|
-
private fun clipRadius(parent: View?): Float =
|
|
107
|
-
(parent as? ReactViewGroup)?.takeIf { it.overflow == HIDDEN }?.borderRadius ?: 0f
|
|
108
|
-
|
|
109
|
-
private companion object {
|
|
110
|
-
const val MATRIX = 9
|
|
111
|
-
const val HIDDEN = "hidden"
|
|
112
|
-
val FITS = setOf(
|
|
113
|
-
ImageView.ScaleType.CENTER_CROP,
|
|
114
|
-
ImageView.ScaleType.FIT_XY,
|
|
115
|
-
ImageView.ScaleType.FIT_CENTER,
|
|
116
|
-
ImageView.ScaleType.CENTER_INSIDE,
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
// The matrix of a fit of an image of [imageWidth] × [imageHeight] into [width] × [height].
|
|
120
|
-
fun fitMatrix(fit: ImageView.ScaleType, imageWidth: Int, imageHeight: Int, width: Int, height: Int): Matrix {
|
|
121
|
-
val sx = width.toFloat() / imageWidth
|
|
122
|
-
val sy = height.toFloat() / imageHeight
|
|
123
|
-
val matrix = Matrix()
|
|
124
|
-
if (fit == ImageView.ScaleType.FIT_XY) {
|
|
125
|
-
matrix.setScale(sx, sy)
|
|
126
|
-
return matrix
|
|
127
|
-
}
|
|
128
|
-
val scale = when (fit) {
|
|
129
|
-
ImageView.ScaleType.CENTER_CROP -> max(sx, sy)
|
|
130
|
-
ImageView.ScaleType.CENTER_INSIDE -> min(1f, min(sx, sy))
|
|
131
|
-
else -> min(sx, sy)
|
|
132
|
-
}
|
|
133
|
-
matrix.setScale(scale, scale)
|
|
134
|
-
matrix.postTranslate((width - imageWidth * scale) / 2f, (height - imageHeight * scale) / 2f)
|
|
135
|
-
return matrix
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
package/android/src/main/java/dev/apexnative/navigation/views/element/animators/PlainViewAnimator.kt
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.views.element.animators
|
|
2
|
-
|
|
3
|
-
import android.animation.Animator
|
|
4
|
-
import android.view.View
|
|
5
|
-
import android.view.ViewOutlineProvider
|
|
6
|
-
import androidx.core.animation.doOnEnd
|
|
7
|
-
import androidx.core.animation.doOnStart
|
|
8
|
-
import com.facebook.react.uimanager.BackgroundStyleApplicator
|
|
9
|
-
import com.facebook.react.uimanager.style.BorderRadiusProp
|
|
10
|
-
import dev.apexnative.navigation.utils.borderRadius
|
|
11
|
-
import dev.apexnative.navigation.views.animations.ValueInterpolation
|
|
12
|
-
import dev.apexnative.navigation.views.element.TransitionLayer
|
|
13
|
-
import kotlin.math.roundToInt
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A shared React view without children moves itself: from `from`'s place on the screen to its own by a translation; its
|
|
17
|
-
* size and corner radius by an outline that grows from `from`'s (at the scale of its parents) to its own while it is
|
|
18
|
-
* laid out at the larger of the two sizes; its own radius taken off meanwhile and put back as it was; its background
|
|
19
|
-
* color from `from`'s to its own in Lab, ending exactly on its own (`BackgroundStyleApplicator`); its rotation from
|
|
20
|
-
* `from`'s to its own. Main thread only.
|
|
21
|
-
*/
|
|
22
|
-
internal class PlainViewAnimator(
|
|
23
|
-
private val from: View,
|
|
24
|
-
private val to: View,
|
|
25
|
-
private val layer: TransitionLayer,
|
|
26
|
-
) {
|
|
27
|
-
/** The animator; none when [to] has no place in the layer. */
|
|
28
|
-
fun create(): Animator? {
|
|
29
|
-
val geometry = FlightGeometry.of(from, to, layer) ?: return null
|
|
30
|
-
val fromRadius = from.borderRadius * geometry.fromScale
|
|
31
|
-
val toRadius = to.borderRadius
|
|
32
|
-
val fromColor = BackgroundStyleApplicator.getBackgroundColor(from)
|
|
33
|
-
val toColor = BackgroundStyleApplicator.getBackgroundColor(to)
|
|
34
|
-
val fromRotation = from.rotation
|
|
35
|
-
val toRotation = to.rotation
|
|
36
|
-
val ownRadius = BackgroundStyleApplicator.getBorderRadius(to, RADIUS)
|
|
37
|
-
val outline = FlightOutline()
|
|
38
|
-
var savedProvider: ViewOutlineProvider? = null
|
|
39
|
-
var savedClip = false
|
|
40
|
-
val (width, height) = geometry.largest
|
|
41
|
-
val toRect = geometry.to
|
|
42
|
-
return MoveAnimator().apply {
|
|
43
|
-
fun frame(time: Float) {
|
|
44
|
-
val f = curve.getInterpolation(time)
|
|
45
|
-
val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
|
|
46
|
-
val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
|
|
47
|
-
to.translationX = left - toRect.left
|
|
48
|
-
to.translationY = top - toRect.top
|
|
49
|
-
val from = geometry.from
|
|
50
|
-
outline.width = ValueInterpolation.number(from.width(), toRect.width(), f, time).roundToInt()
|
|
51
|
-
outline.height = ValueInterpolation.number(from.height(), toRect.height(), f, time).roundToInt()
|
|
52
|
-
outline.radius = ValueInterpolation.number(fromRadius, toRadius, f, time)
|
|
53
|
-
to.invalidateOutline()
|
|
54
|
-
if (fromColor != toColor) {
|
|
55
|
-
val color = ValueInterpolation.color(fromColor, toColor, f, time)
|
|
56
|
-
BackgroundStyleApplicator.setBackgroundColor(to, color)
|
|
57
|
-
}
|
|
58
|
-
to.rotation = ValueInterpolation.number(fromRotation, toRotation, f, time)
|
|
59
|
-
}
|
|
60
|
-
doOnStart {
|
|
61
|
-
savedProvider = to.outlineProvider
|
|
62
|
-
savedClip = to.clipToOutline
|
|
63
|
-
if (ownRadius != null) BackgroundStyleApplicator.setBorderRadius(to, RADIUS, null)
|
|
64
|
-
to.outlineProvider = outline
|
|
65
|
-
to.clipToOutline = true
|
|
66
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
|
|
67
|
-
frame(0f)
|
|
68
|
-
}
|
|
69
|
-
addUpdateListener { frame(it.animatedFraction) }
|
|
70
|
-
// A cancelled flight ends too: the view goes back whole.
|
|
71
|
-
doOnEnd {
|
|
72
|
-
to.translationX = 0f
|
|
73
|
-
to.translationY = 0f
|
|
74
|
-
to.rotation = toRotation
|
|
75
|
-
if (fromColor != toColor) BackgroundStyleApplicator.setBackgroundColor(to, toColor)
|
|
76
|
-
if (ownRadius != null) BackgroundStyleApplicator.setBorderRadius(to, RADIUS, ownRadius)
|
|
77
|
-
to.outlineProvider = savedProvider
|
|
78
|
-
to.clipToOutline = savedClip
|
|
79
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
|
|
80
|
-
toRect.height().toInt())
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private companion object {
|
|
86
|
-
val RADIUS = BorderRadiusProp.BORDER_RADIUS
|
|
87
|
-
}
|
|
88
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.views.element.animators
|
|
2
|
-
|
|
3
|
-
import android.animation.Animator
|
|
4
|
-
import android.view.View
|
|
5
|
-
import dev.apexnative.navigation.options.SharedElementTransitionOptions
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* One animator of a shared element: how [from], on the screen that goes, becomes [to], on the screen that comes, when
|
|
9
|
-
* both are of [type]. The core picks one by the views' classes (`SharedAnimatorFactory`) and runs it in the
|
|
10
|
-
* transition's layer.
|
|
11
|
-
*/
|
|
12
|
-
abstract class PropertyAnimatorCreator<T : View>(
|
|
13
|
-
protected val from: View,
|
|
14
|
-
protected val to: View,
|
|
15
|
-
private val type: Class<T>,
|
|
16
|
-
) {
|
|
17
|
-
/** Whether this animator takes part: both views are of its type and differ in what it animates. */
|
|
18
|
-
fun shouldAnimate(): Boolean {
|
|
19
|
-
if (!type.isInstance(from) || !type.isInstance(to)) return false
|
|
20
|
-
val fromChild = type.cast(from) ?: return false
|
|
21
|
-
val toChild = type.cast(to) ?: return false
|
|
22
|
-
return shouldAnimateProperty(fromChild, toChild)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Whether [fromChild] and [toChild] differ in what this animator animates. */
|
|
26
|
-
abstract fun shouldAnimateProperty(fromChild: T, toChild: T): Boolean
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The animator of the pair for [options]; the core gives it the pair's duration, delay and curve (each animator
|
|
30
|
-
* its own, never through a set around it).
|
|
31
|
-
*/
|
|
32
|
-
abstract fun create(options: SharedElementTransitionOptions): Animator
|
|
33
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
package dev.apexnative.navigation.views.element.animators
|
|
2
|
-
|
|
3
|
-
import android.animation.Animator
|
|
4
|
-
import androidx.core.animation.doOnEnd
|
|
5
|
-
import androidx.core.animation.doOnStart
|
|
6
|
-
import com.facebook.drawee.drawable.ScalingUtils
|
|
7
|
-
import com.facebook.react.views.image.ReactImageView
|
|
8
|
-
import dev.apexnative.navigation.views.animations.ValueInterpolation
|
|
9
|
-
import dev.apexnative.navigation.views.element.TransitionLayer
|
|
10
|
-
import kotlin.math.roundToInt
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A shared React image: its place by a translation from `from`'s on the screen; its content by Fresco's scale type
|
|
14
|
-
* going from `from`'s fit to its own (`ScalingUtils.InterpolatingScaleType`); the part seen from `from`'s size to its
|
|
15
|
-
* own (it is laid out at the size of each frame); its rotation from `from`'s to its own; Fresco's own fade off
|
|
16
|
-
* meanwhile. Everything goes back as it was at the end. Main thread only.
|
|
17
|
-
*/
|
|
18
|
-
internal class ReactImageAnimator(
|
|
19
|
-
private val from: ReactImageView,
|
|
20
|
-
private val to: ReactImageView,
|
|
21
|
-
private val layer: TransitionLayer,
|
|
22
|
-
) {
|
|
23
|
-
/** The animator; none when [to] has no place in the layer or no hierarchy. */
|
|
24
|
-
fun create(): Animator? {
|
|
25
|
-
if (!from.hasHierarchy() || !to.hasHierarchy()) return null
|
|
26
|
-
val geometry = FlightGeometry.of(from, to, layer) ?: return null
|
|
27
|
-
val toRect = geometry.to
|
|
28
|
-
val toType = to.hierarchy.actualImageScaleType ?: ScalingUtils.ScaleType.CENTER_CROP
|
|
29
|
-
val fromType = from.hierarchy.actualImageScaleType ?: ScalingUtils.ScaleType.CENTER_CROP
|
|
30
|
-
val scale = ScalingUtils.InterpolatingScaleType(fromType, toType)
|
|
31
|
-
val fromRotation = from.rotation
|
|
32
|
-
val toRotation = to.rotation
|
|
33
|
-
var savedFade = 0
|
|
34
|
-
return MoveAnimator().apply {
|
|
35
|
-
fun frame(time: Float) {
|
|
36
|
-
val f = curve.getInterpolation(time)
|
|
37
|
-
val left = ValueInterpolation.number(geometry.from.left, toRect.left, f, time)
|
|
38
|
-
val top = ValueInterpolation.number(geometry.from.top, toRect.top, f, time)
|
|
39
|
-
val width = ValueInterpolation.number(geometry.from.width(), toRect.width(), f, time).roundToInt()
|
|
40
|
-
val height = ValueInterpolation.number(geometry.from.height(), toRect.height(), f, time).roundToInt()
|
|
41
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), width, height)
|
|
42
|
-
to.translationX = left - toRect.left
|
|
43
|
-
to.translationY = top - toRect.top
|
|
44
|
-
scale.setValue(if (time >= 1f) 1f else f)
|
|
45
|
-
to.rotation = ValueInterpolation.number(fromRotation, toRotation, f, time)
|
|
46
|
-
to.invalidate()
|
|
47
|
-
}
|
|
48
|
-
doOnStart {
|
|
49
|
-
savedFade = to.hierarchy.fadeDuration
|
|
50
|
-
to.hierarchy.fadeDuration = 0
|
|
51
|
-
to.hierarchy.setActualImageScaleType(scale)
|
|
52
|
-
frame(0f)
|
|
53
|
-
}
|
|
54
|
-
addUpdateListener { frame(it.animatedFraction) }
|
|
55
|
-
doOnEnd {
|
|
56
|
-
to.hierarchy.setActualImageScaleType(toType)
|
|
57
|
-
to.hierarchy.fadeDuration = savedFade
|
|
58
|
-
to.translationX = 0f
|
|
59
|
-
to.translationY = 0f
|
|
60
|
-
to.rotation = toRotation
|
|
61
|
-
layer.place(to, toRect.left.toInt(), toRect.top.toInt(), toRect.width().toInt(),
|
|
62
|
-
toRect.height().toInt())
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|