@apexnative/navigation 1.0.0-alpha.0 → 1.0.0-alpha.10
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 +128 -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/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/cli/upgrade/changelog.js +2 -2
- 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/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 +57 -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 +10 -8
- 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 +32 -0
- package/ios/Layouts/Screen/ANNScreenSettling.mm +137 -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/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/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 +4 -25
- 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/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,12 +1,26 @@
|
|
|
1
1
|
#import "ANNRenderWait.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
3
|
#import "ANNComponentViewController.h"
|
|
4
|
+
#import "ANNJavaScriptCalls.h"
|
|
4
5
|
#import "ANNScreenReadiness.h"
|
|
5
6
|
#import "UIViewController+LayoutProtocol.h"
|
|
7
|
+
#import <QuartzCore/QuartzCore.h>
|
|
6
8
|
|
|
7
9
|
// A screen whose rendered state stays unknown counts as ready after this, with `unknownContentRule`.
|
|
8
10
|
static const NSTimeInterval ANNUnknownContentLimit = 1;
|
|
9
11
|
|
|
12
|
+
// What a kind of the bar whose limit passed in the content phase still gets, with `barLimitsFromStart`: a limit of 0
|
|
13
|
+
// would mean none of its own.
|
|
14
|
+
static const NSTimeInterval ANNPassedBarLimit = 0.001;
|
|
15
|
+
|
|
16
|
+
// What is left of a bar kind's `limit` after `spent`; no limit of its own stays none.
|
|
17
|
+
static NSTimeInterval ANNBarLimitLeft(NSTimeInterval limit, NSTimeInterval spent) {
|
|
18
|
+
if (limit <= 0) {
|
|
19
|
+
return limit;
|
|
20
|
+
}
|
|
21
|
+
return MAX(limit - spent, ANNPassedBarLimit);
|
|
22
|
+
}
|
|
23
|
+
|
|
10
24
|
// The number of the last wait made: each wait listens under a key of its own.
|
|
11
25
|
static NSUInteger ANNRenderWaitCount;
|
|
12
26
|
|
|
@@ -18,19 +32,25 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
18
32
|
ANNRenderWaitBar _bar;
|
|
19
33
|
ANNBarWaitLimits _barLimits;
|
|
20
34
|
NSString *_key;
|
|
35
|
+
// When the running wait started (`barLimitsFromStart`).
|
|
36
|
+
CFTimeInterval _startTime;
|
|
21
37
|
// The token: each start, phase and end takes the next one, so that what an earlier one set up does nothing.
|
|
22
38
|
NSUInteger _number;
|
|
23
39
|
// Inside `start`: a step runs as it is, under the caller's protection.
|
|
24
40
|
BOOL _starting;
|
|
25
41
|
// Inside `setUp`: a ready handler leaves the node to the readiness test after it.
|
|
26
42
|
BOOL _settingUp;
|
|
43
|
+
// The content is there and the phase waits for the calls JavaScript made by then (`settlesThroughJavaScript`); the
|
|
44
|
+
// number of that settle, so that one of an earlier take does nothing.
|
|
45
|
+
BOOL _settling;
|
|
46
|
+
NSUInteger _settleNumber;
|
|
27
47
|
// The content nodes still waited, and every node the wait set its ready handler on.
|
|
28
48
|
NSHashTable<UIViewController *> *_waited;
|
|
29
49
|
NSHashTable<UIViewController *> *_listened;
|
|
30
|
-
// The waited screens of the "
|
|
31
|
-
//
|
|
32
|
-
NSHashTable<UIViewController *> *
|
|
33
|
-
BOOL
|
|
50
|
+
// The waited screens of the "unseen" kind (a subset of `_waited`), and whether their limit passed in this start (a
|
|
51
|
+
// retake waits for them no more then).
|
|
52
|
+
NSHashTable<UIViewController *> *_unseenWaited;
|
|
53
|
+
BOOL _unseenLimitPassed;
|
|
34
54
|
ANNBarComponentsWait *_barWait;
|
|
35
55
|
// What the last take of the running phase took: its screens (weakly) and, in the content phase, what the take read
|
|
36
56
|
// of each to decide what it waits for (`takeStateOfScreens:`). A retake that would take the same does nothing.
|
|
@@ -55,7 +75,7 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
55
75
|
stringWithFormat:@"ApexNavigation.renderWait.%lu", (unsigned long)++ANNRenderWaitCount];
|
|
56
76
|
_waited = [NSHashTable weakObjectsHashTable];
|
|
57
77
|
_listened = [NSHashTable weakObjectsHashTable];
|
|
58
|
-
|
|
78
|
+
_unseenWaited = [NSHashTable weakObjectsHashTable];
|
|
59
79
|
}
|
|
60
80
|
return self;
|
|
61
81
|
}
|
|
@@ -69,7 +89,8 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
69
89
|
}
|
|
70
90
|
_isWaiting = YES;
|
|
71
91
|
_isInBarPhase = NO;
|
|
72
|
-
|
|
92
|
+
_unseenLimitPassed = NO;
|
|
93
|
+
_startTime = CACurrentMediaTime();
|
|
73
94
|
NSUInteger number = ++_number;
|
|
74
95
|
_starting = YES;
|
|
75
96
|
@try {
|
|
@@ -87,10 +108,10 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
87
108
|
[weakSelf limitOfNumber:number];
|
|
88
109
|
});
|
|
89
110
|
}
|
|
90
|
-
if (
|
|
91
|
-
int64_t delay = (int64_t)(
|
|
111
|
+
if (_unseenLimit > 0) {
|
|
112
|
+
int64_t delay = (int64_t)(_unseenLimit * NSEC_PER_SEC);
|
|
92
113
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay), dispatch_get_main_queue(), ^{
|
|
93
|
-
[weakSelf
|
|
114
|
+
[weakSelf unseenLimitOfNumber:number];
|
|
94
115
|
});
|
|
95
116
|
}
|
|
96
117
|
if (_unknownContentRule) {
|
|
@@ -117,11 +138,9 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
117
138
|
if (![self runs:number]) {
|
|
118
139
|
return;
|
|
119
140
|
}
|
|
120
|
-
|
|
121
|
-
[_waited removeObject:_node];
|
|
122
|
-
}
|
|
141
|
+
[self testNode];
|
|
123
142
|
if (_waited.count == 0 && !_barWait) {
|
|
124
|
-
[self
|
|
143
|
+
[self contentOfNumber:number];
|
|
125
144
|
}
|
|
126
145
|
}
|
|
127
146
|
|
|
@@ -143,8 +162,8 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
143
162
|
case ANNRenderWaitContentNone:
|
|
144
163
|
break;
|
|
145
164
|
case ANNRenderWaitContentEachScreen:
|
|
146
|
-
// Each screen by
|
|
147
|
-
//
|
|
165
|
+
// Each screen by its content; an unselected tab's to the unseen limit. A screen with no content to wait
|
|
166
|
+
// for (a native screen) is ready.
|
|
148
167
|
for (UIViewController *node in screens) {
|
|
149
168
|
if (![node isKindOfClass:ANNComponentViewController.class]) {
|
|
150
169
|
continue;
|
|
@@ -158,25 +177,11 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
158
177
|
[self listenTo:screen number:number];
|
|
159
178
|
continue;
|
|
160
179
|
}
|
|
161
|
-
if (
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
[_mountWaited addObject:screen];
|
|
165
|
-
// A slot screen's readiness is its mount: its ready handler serves.
|
|
166
|
-
if (![content respondsToSelector:@selector(whenMounted:)]) {
|
|
167
|
-
[self listenTo:screen number:number];
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
if (content.hasMounted) {
|
|
171
|
-
[_mountWaited removeObject:screen];
|
|
180
|
+
if (_unseenLimitPassed) {
|
|
172
181
|
continue;
|
|
173
182
|
}
|
|
174
|
-
[
|
|
175
|
-
|
|
176
|
-
__weak UIViewController *weakScreen = screen;
|
|
177
|
-
[content whenMounted:^{
|
|
178
|
-
[weakSelf node:weakScreen readyOfNumber:number];
|
|
179
|
-
}];
|
|
183
|
+
[_unseenWaited addObject:screen];
|
|
184
|
+
[self listenTo:screen number:number];
|
|
180
185
|
}
|
|
181
186
|
break;
|
|
182
187
|
case ANNRenderWaitContentNode:
|
|
@@ -206,7 +211,7 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
206
211
|
}
|
|
207
212
|
[_waited removeObject:node];
|
|
208
213
|
if (_waited.count == 0 && !_barWait) {
|
|
209
|
-
[self
|
|
214
|
+
[self contentOfNumber:number];
|
|
210
215
|
}
|
|
211
216
|
}
|
|
212
217
|
|
|
@@ -219,30 +224,69 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
219
224
|
if (_waited.count > 0) {
|
|
220
225
|
return;
|
|
221
226
|
}
|
|
227
|
+
[self contentOfNumber:number];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// What the running phase waited for came by its signals, or was there already. The content phase with
|
|
231
|
+
// `settlesThroughJavaScript` ends once the calls JavaScript made by now are applied: the commit that mounted the content
|
|
232
|
+
// ran its layout effects (`useScreenOptions`) in the same task of the JavaScript thread, so their `mergeOptions` are on
|
|
233
|
+
// their way to the main queue ahead of the settle. Content that was there already (as the wait starts or takes its
|
|
234
|
+
// screens again) may have mounted in a commit that ran just now: it settles too. The bar phase, and screens without
|
|
235
|
+
// React content (a native screen), end at once.
|
|
236
|
+
- (void)contentOfNumber:(NSUInteger)number {
|
|
237
|
+
if (!_settlesThroughJavaScript || _isInBarPhase || ![self hasReactScreen]) {
|
|
238
|
+
[self phaseOfNumber:number endedMarkingReady:NO];
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (_settling) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
_settling = YES;
|
|
245
|
+
NSUInteger settle = ++_settleNumber;
|
|
246
|
+
__weak ANNRenderWait *weakSelf = self;
|
|
247
|
+
[ANNJavaScriptCalls afterCallsMadeSoFar:^{
|
|
248
|
+
[weakSelf settleOfNumber:number settle:settle];
|
|
249
|
+
}];
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
- (void)settleOfNumber:(NSUInteger)number settle:(NSUInteger)settle {
|
|
253
|
+
if (![self runs:number] || !_settling || settle != _settleNumber) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
_settling = NO;
|
|
222
257
|
[self phaseOfNumber:number endedMarkingReady:NO];
|
|
223
258
|
}
|
|
224
259
|
|
|
225
|
-
// The screens of the "
|
|
226
|
-
- (void)
|
|
260
|
+
// The screens of the "unseen" kind are waited no longer: nobody sees them, nothing of theirs is held.
|
|
261
|
+
- (void)unseenLimitOfNumber:(NSUInteger)number {
|
|
227
262
|
if (![self runs:number]) {
|
|
228
263
|
return;
|
|
229
264
|
}
|
|
230
|
-
|
|
231
|
-
if (
|
|
265
|
+
_unseenLimitPassed = YES;
|
|
266
|
+
if (_unseenWaited.count == 0) {
|
|
232
267
|
return;
|
|
233
268
|
}
|
|
234
|
-
for (UIViewController *node in
|
|
269
|
+
for (UIViewController *node in _unseenWaited.allObjects) {
|
|
235
270
|
[_waited removeObject:node];
|
|
236
271
|
}
|
|
237
|
-
[
|
|
272
|
+
[_unseenWaited removeAllObjects];
|
|
238
273
|
if (_waited.count == 0 && !_barWait) {
|
|
239
274
|
[self phaseOfNumber:number endedMarkingReady:NO];
|
|
240
275
|
}
|
|
241
276
|
}
|
|
242
277
|
|
|
243
|
-
// The limit: what is still waited counts as rendered from now on, its held events go at once.
|
|
278
|
+
// The limit: what is still waited counts as rendered from now on, its held events go at once. A phase that only waits
|
|
279
|
+
// for the calls of JavaScript (its content is there) ends without marking anything.
|
|
244
280
|
- (void)limitOfNumber:(NSUInteger)number {
|
|
245
|
-
if (![self runs:number]
|
|
281
|
+
if (![self runs:number]) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (_settling) {
|
|
285
|
+
[self stopSettling];
|
|
286
|
+
[self phaseOfNumber:number endedMarkingReady:NO];
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (_waited.count == 0 && !_barWait) {
|
|
246
290
|
return;
|
|
247
291
|
}
|
|
248
292
|
[self phaseOfNumber:number endedMarkingReady:YES];
|
|
@@ -288,7 +332,7 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
288
332
|
[self markContentReady];
|
|
289
333
|
}
|
|
290
334
|
if (self->_bar == ANNRenderWaitBarAfterContent && !self->_isInBarPhase) {
|
|
291
|
-
[self
|
|
335
|
+
[self startBarPhaseWithLimits:[self barLimitsAfterContent]];
|
|
292
336
|
return;
|
|
293
337
|
}
|
|
294
338
|
[self finish];
|
|
@@ -309,9 +353,10 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
309
353
|
|
|
310
354
|
#pragma mark - The bar phase
|
|
311
355
|
|
|
312
|
-
// The content is there: the bar components of the screens now, each kind to its
|
|
313
|
-
// for ends the wait at once.
|
|
314
|
-
- (void)
|
|
356
|
+
// The content is there: the bar components of the screens now, each kind to its limit in `limits` from now. Nothing to
|
|
357
|
+
// wait for ends the wait at once.
|
|
358
|
+
- (void)startBarPhaseWithLimits:(ANNBarWaitLimits)limits {
|
|
359
|
+
[self stopSettling];
|
|
315
360
|
[_barWait cancel];
|
|
316
361
|
_barWait = nil;
|
|
317
362
|
[self releaseContent];
|
|
@@ -321,7 +366,7 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
321
366
|
NSArray<UIViewController *> *barScreens = [self barScreens];
|
|
322
367
|
[self rememberTakenScreens:barScreens states:nil];
|
|
323
368
|
ANNBarComponentsWait *barWait = [ANNBarComponentsWait waitForScreens:barScreens
|
|
324
|
-
limits:
|
|
369
|
+
limits:limits
|
|
325
370
|
done:^{
|
|
326
371
|
[weakSelf barOfNumber:number];
|
|
327
372
|
}];
|
|
@@ -344,23 +389,28 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
344
389
|
}
|
|
345
390
|
if (_isInBarPhase) {
|
|
346
391
|
[self runStep:^{
|
|
347
|
-
[self
|
|
392
|
+
[self startBarPhaseWithLimits:self->_barLimits];
|
|
348
393
|
}];
|
|
349
394
|
return;
|
|
350
395
|
}
|
|
351
396
|
// The same token: the limit set at the start stays.
|
|
352
397
|
NSUInteger number = _number;
|
|
398
|
+
[self stopSettling];
|
|
353
399
|
[self releaseContent];
|
|
354
400
|
[_barWait cancel];
|
|
355
401
|
_barWait = nil;
|
|
356
|
-
if (take) {
|
|
357
|
-
[self takeScreensOfNumber:number];
|
|
358
|
-
} else {
|
|
402
|
+
if (!take) {
|
|
359
403
|
_takenScreens = nil;
|
|
360
404
|
_takenStates = nil;
|
|
405
|
+
[self phaseOfNumber:number endedMarkingReady:NO];
|
|
406
|
+
return;
|
|
361
407
|
}
|
|
408
|
+
// As at the start: a node ready already counts at once (its ready handler waits for the next time), and content
|
|
409
|
+
// that is there settles again, the settle of the last take having stopped.
|
|
410
|
+
[self takeScreensOfNumber:number];
|
|
411
|
+
[self testNode];
|
|
362
412
|
if (_waited.count == 0 && !_barWait) {
|
|
363
|
-
[self
|
|
413
|
+
[self contentOfNumber:number];
|
|
364
414
|
}
|
|
365
415
|
}
|
|
366
416
|
|
|
@@ -382,6 +432,7 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
382
432
|
|
|
383
433
|
// The wait lets go of everything: its handlers, its bar wait; its limits find another token.
|
|
384
434
|
- (void)stop {
|
|
435
|
+
[self stopSettling];
|
|
385
436
|
_isWaiting = NO;
|
|
386
437
|
_isInBarPhase = NO;
|
|
387
438
|
_takenScreens = nil;
|
|
@@ -399,21 +450,26 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
399
450
|
}
|
|
400
451
|
[_listened removeAllObjects];
|
|
401
452
|
[_waited removeAllObjects];
|
|
402
|
-
[
|
|
453
|
+
[_unseenWaited removeAllObjects];
|
|
403
454
|
}
|
|
404
455
|
|
|
405
456
|
#pragma mark - Helpers
|
|
406
457
|
|
|
458
|
+
// A settle on its way does nothing from now on.
|
|
459
|
+
- (void)stopSettling {
|
|
460
|
+
_settling = NO;
|
|
461
|
+
_settleNumber++;
|
|
462
|
+
}
|
|
463
|
+
|
|
407
464
|
// What the content phase's take reads of each screen to decide what it waits for: the readiness it needs, whether it
|
|
408
|
-
// has its content yet, whether that content is ready
|
|
465
|
+
// has its content yet, and whether that content is ready.
|
|
409
466
|
- (NSArray<NSNumber *> *)takeStateOfScreens:(NSArray<UIViewController *> *)screens {
|
|
410
467
|
NSMutableArray<NSNumber *> *states = [NSMutableArray arrayWithCapacity:screens.count];
|
|
411
468
|
for (UIViewController *node in screens) {
|
|
412
|
-
NSUInteger state = (NSUInteger)ANNWaitedReadinessOf(node) <<
|
|
469
|
+
NSUInteger state = (NSUInteger)ANNWaitedReadinessOf(node) << 2;
|
|
413
470
|
if ([node isKindOfClass:ANNComponentViewController.class]) {
|
|
414
471
|
UIView<ANNComponentProtocol> *content = ((ANNComponentViewController *)node).reactView;
|
|
415
|
-
|
|
416
|
-
state |= (content ? 1 : 0) | (content.isReady ? 2 : 0) | (mounted ? 4 : 0);
|
|
472
|
+
state |= (content ? 1 : 0) | (content.isReady ? 2 : 0);
|
|
417
473
|
}
|
|
418
474
|
[states addObject:@(state)];
|
|
419
475
|
}
|
|
@@ -470,6 +526,37 @@ static NSUInteger ANNRenderWaitCount;
|
|
|
470
526
|
return screens;
|
|
471
527
|
}
|
|
472
528
|
|
|
529
|
+
// With `ANNRenderWaitContentNode`, the node counts as ready when every screen of it is.
|
|
530
|
+
- (void)testNode {
|
|
531
|
+
if (_content == ANNRenderWaitContentNode && _node && [self screensAreReady]) {
|
|
532
|
+
[_waited removeObject:_node];
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// The limits of the bar phase that follows the content phase: with `barLimitsFromStart`, what is left of each since the
|
|
537
|
+
// wait started.
|
|
538
|
+
- (ANNBarWaitLimits)barLimitsAfterContent {
|
|
539
|
+
ANNBarWaitLimits limits = _barLimits;
|
|
540
|
+
if (!_barLimitsFromStart) {
|
|
541
|
+
return limits;
|
|
542
|
+
}
|
|
543
|
+
NSTimeInterval spent = CACurrentMediaTime() - _startTime;
|
|
544
|
+
limits.titleAndBackground = ANNBarLimitLeft(limits.titleAndBackground, spent);
|
|
545
|
+
limits.buttons = ANNBarLimitLeft(limits.buttons, spent);
|
|
546
|
+
return limits;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// A screen with React content is among the screens: a commit of React mounted it.
|
|
550
|
+
- (BOOL)hasReactScreen {
|
|
551
|
+
for (UIViewController *node in [self screens]) {
|
|
552
|
+
if ([node isKindOfClass:ANNComponentViewController.class] &&
|
|
553
|
+
((ANNComponentViewController *)node).reactView) {
|
|
554
|
+
return YES;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return NO;
|
|
558
|
+
}
|
|
559
|
+
|
|
473
560
|
// Every screen has no content to wait for (a native screen) or its content is ready.
|
|
474
561
|
- (BOOL)screensAreReady {
|
|
475
562
|
for (UIViewController *node in [self screens]) {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#import "ANNSceneDelegate.h"
|
|
2
|
+
#import "ANNDeepLinkQueue.h"
|
|
2
3
|
#import "ApexNavigation.h"
|
|
3
|
-
#import <React/RCTLinkingManager.h>
|
|
4
4
|
|
|
5
5
|
// On the scene life cycle UIKit stops calling the app delegate's URL, user activity and foreground/background
|
|
6
|
-
// methods. The scene forwards them, so AppDelegate overrides (and the deep links of ANNDeepLinkQueue) keep working
|
|
6
|
+
// methods. The scene forwards them, so AppDelegate overrides (and the deep links of ANNDeepLinkQueue) keep working; the
|
|
7
|
+
// links keep their scene, through which React Native 0.88 and newer take them.
|
|
7
8
|
@implementation ANNSceneDelegate
|
|
8
9
|
|
|
9
10
|
- (void)scene:(UIScene *)scene
|
|
@@ -15,21 +16,21 @@
|
|
|
15
16
|
self.window = [ApexNavigation attachToWindowScene:(UIWindowScene *)scene];
|
|
16
17
|
|
|
17
18
|
for (UIOpenURLContext *context in connectionOptions.URLContexts) {
|
|
18
|
-
[self ann_openURLContext:context];
|
|
19
|
+
[self ann_openURLContext:context ofScene:scene];
|
|
19
20
|
}
|
|
20
21
|
for (NSUserActivity *activity in connectionOptions.userActivities) {
|
|
21
|
-
[self ann_continueUserActivity:activity];
|
|
22
|
+
[self ann_continueUserActivity:activity ofScene:scene];
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
|
|
26
27
|
for (UIOpenURLContext *context in URLContexts) {
|
|
27
|
-
[self ann_openURLContext:context];
|
|
28
|
+
[self ann_openURLContext:context ofScene:scene];
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
|
|
32
|
-
[self ann_continueUserActivity:userActivity];
|
|
33
|
+
[self ann_continueUserActivity:userActivity ofScene:scene];
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
- (void)sceneDidBecomeActive:(UIScene *)scene {
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
|
|
63
64
|
#pragma mark - private
|
|
64
65
|
|
|
65
|
-
- (void)ann_openURLContext:(UIOpenURLContext *)context {
|
|
66
|
+
- (void)ann_openURLContext:(UIOpenURLContext *)context ofScene:(UIScene *)scene {
|
|
66
67
|
UIApplication *application = UIApplication.sharedApplication;
|
|
67
68
|
id<UIApplicationDelegate> appDelegate = application.delegate;
|
|
68
69
|
if ([appDelegate respondsToSelector:@selector(application:openURL:options:)]) {
|
|
@@ -70,22 +71,31 @@
|
|
|
70
71
|
options[UIApplicationOpenURLOptionsSourceApplicationKey] = context.options.sourceApplication;
|
|
71
72
|
options[UIApplicationOpenURLOptionsAnnotationKey] = context.options.annotation;
|
|
72
73
|
options[UIApplicationOpenURLOptionsOpenInPlaceKey] = @(context.options.openInPlace);
|
|
73
|
-
[
|
|
74
|
+
[ANNDeepLinkQueue forwardURLContext:context
|
|
75
|
+
ofScene:scene
|
|
76
|
+
through:^{
|
|
77
|
+
[appDelegate application:application openURL:context.URL options:options];
|
|
78
|
+
}];
|
|
74
79
|
} else {
|
|
75
|
-
[
|
|
80
|
+
[ANNDeepLinkQueue dispatchURLContext:context ofScene:scene];
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
- (void)ann_continueUserActivity:(NSUserActivity *)activity {
|
|
84
|
+
- (void)ann_continueUserActivity:(NSUserActivity *)activity ofScene:(UIScene *)scene {
|
|
80
85
|
UIApplication *application = UIApplication.sharedApplication;
|
|
81
86
|
id<UIApplicationDelegate> appDelegate = application.delegate;
|
|
82
87
|
if ([appDelegate respondsToSelector:@selector(application:continueUserActivity:restorationHandler:)]) {
|
|
83
|
-
[
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
88
|
+
[ANNDeepLinkQueue forwardUserActivity:activity
|
|
89
|
+
ofScene:scene
|
|
90
|
+
through:^{
|
|
91
|
+
[appDelegate application:application
|
|
92
|
+
continueUserActivity:activity
|
|
93
|
+
restorationHandler:^(
|
|
94
|
+
NSArray<id<UIUserActivityRestoring>> *restorableObjects){
|
|
95
|
+
}];
|
|
96
|
+
}];
|
|
87
97
|
} else if ([activity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
|
|
88
|
-
[
|
|
98
|
+
[ANNDeepLinkQueue dispatchUserActivity:activity ofScene:scene];
|
|
89
99
|
}
|
|
90
100
|
}
|
|
91
101
|
|
package/ios/Core/ANNSystemUI.h
CHANGED
|
@@ -36,8 +36,9 @@ typedef NS_ENUM(NSInteger, ANNSystemUIQuestion) {
|
|
|
36
36
|
/// The owner adds the asks UIKit doesn't make — a merge, a side menu at rest, an overlay, a root replaced, the bar of a
|
|
37
37
|
/// stack shown or hidden, the orientation after an appearance — and makes them once per turn of the main queue: a
|
|
38
38
|
/// trigger marks groups, the marks of a turn are coalesced, and at its end UIKit is asked again for each marked group
|
|
39
|
-
/// in the main window and every overlay window.
|
|
40
|
-
///
|
|
39
|
+
/// in the main window and every overlay window. Each ask of the status bar also lays out the screens' blurs under it
|
|
40
|
+
/// (`statusBar.blur`), then and on the next turn. It keeps no values but the last status bar of each window, which
|
|
41
|
+
/// only chooses whether a change of the style animates. Never a wait. Main queue.
|
|
41
42
|
@interface ANNSystemUI : NSObject
|
|
42
43
|
|
|
43
44
|
- (instancetype)init NS_UNAVAILABLE;
|
package/ios/Core/ANNSystemUI.mm
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#import "ANNSystemUI.h"
|
|
2
2
|
#import "ANNAssert.h"
|
|
3
|
+
#import "ANNComponentPresenter.h"
|
|
3
4
|
#import "ANNComponentViewController.h"
|
|
4
5
|
#import "ANNDefaultOptions.h"
|
|
5
6
|
#import "ANNOverlayCoordinator.h"
|
|
@@ -280,6 +281,12 @@ static NSArray<UIViewController *> *ANNChainOf(UIWindow *window) {
|
|
|
280
281
|
ask();
|
|
281
282
|
}
|
|
282
283
|
}
|
|
284
|
+
// The status bar hidden or shown moves no view where the safe area stays (a device with a notch): the blurs under
|
|
285
|
+
// it take its frame now, and once more on the next turn of the main queue, in case UIKit settles it after the ask.
|
|
286
|
+
[ANNComponentPresenter statusBarDidChange];
|
|
287
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
288
|
+
[ANNComponentPresenter statusBarDidChange];
|
|
289
|
+
});
|
|
283
290
|
}
|
|
284
291
|
|
|
285
292
|
// A controller that is no node of the layout (React Native's `<Modal>`, an alert, the splash) animates as UIKit's
|
package/ios/Core/ANNUtils.h
CHANGED
|
@@ -23,6 +23,13 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
23
23
|
/// The key window of `scene`; nil when none of its windows is key.
|
|
24
24
|
+ (nullable UIWindow *)keyWindowOfScene:(nullable UIWindowScene *)scene;
|
|
25
25
|
|
|
26
|
+
/// A new window of `windowClass` (`UIWindow` or a subclass) for the core: in the navigation window's scene, or at the
|
|
27
|
+
/// size of `mainScreen` before that window has one. It takes the navigation window's `overrideUserInterfaceStyle`:
|
|
28
|
+
/// React Native's `Appearance.setColorScheme` sets the style once, on the windows there are at that moment, and a
|
|
29
|
+
/// window of the system's style would show its screens in the other theme and switch the app's theme in JS when its
|
|
30
|
+
/// hosting views move in. Every window the core makes but the main window, the style's source, comes from here.
|
|
31
|
+
+ (__kindof UIWindow *)makeWindowOfClass:(Class)windowClass;
|
|
32
|
+
|
|
26
33
|
/// The status bar's frame in the navigation window's scene (its status bar manager); `CGRectZero` without a scene.
|
|
27
34
|
@property(class, nonatomic, readonly) CGRect statusBarFrame;
|
|
28
35
|
|
package/ios/Core/ANNUtils.mm
CHANGED
|
@@ -26,6 +26,16 @@
|
|
|
26
26
|
return windows;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
+ (UIWindow *)makeWindowOfClass:(Class)windowClass {
|
|
30
|
+
UIWindowScene *scene = self.mainWindow.windowScene;
|
|
31
|
+
// `initWithFrame:` is deprecated from iOS 26 on and warns only with a deployment target from 26: a window without a
|
|
32
|
+
// scene is made so, and joins the scene as the main window gets it.
|
|
33
|
+
UIWindow *window = scene ? [[windowClass alloc] initWithWindowScene:scene]
|
|
34
|
+
: [[windowClass alloc] initWithFrame:self.mainScreen.bounds];
|
|
35
|
+
window.overrideUserInterfaceStyle = self.mainWindow.overrideUserInterfaceStyle;
|
|
36
|
+
return window;
|
|
37
|
+
}
|
|
38
|
+
|
|
29
39
|
+ (UIWindow *)keyWindowOfScene:(UIWindowScene *)scene {
|
|
30
40
|
for (UIWindow *window in scene.windows) {
|
|
31
41
|
if (window.isKeyWindow) {
|
|
@@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
18
18
|
+ (nullable ANNNativeScreenCreator)nativeScreenCreatorForName:(NSString *)name;
|
|
19
19
|
|
|
20
20
|
/// Whether a native screen is registered under the name by `registerNativeScreen:creator:` (the registration of 8.x is
|
|
21
|
-
/// gone). Any thread
|
|
21
|
+
/// gone). Any thread (the layout check of a command reads it on the main queue).
|
|
22
22
|
+ (BOOL)hasNativeScreenNamed:(NSString *)name;
|
|
23
23
|
|
|
24
24
|
@end
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
#import "ANNReloadCoordinator.h"
|
|
10
10
|
#import "ANNSlotHost.h"
|
|
11
11
|
#import "ANNSplashViewController.h"
|
|
12
|
-
#import "ANNTabsPreloadWindow.h"
|
|
13
12
|
#import "ANNUtils.h"
|
|
14
13
|
#import <React/RCTLog.h>
|
|
15
14
|
#import <ReactCommon/RCTHost.h>
|
|
@@ -45,8 +44,9 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
|
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
// Once, on the main queue: the generated native screens before any other part, then the core's parts, the
|
|
49
|
-
// replacement before any React content, the window with the copy of the launch screen, and the
|
|
47
|
+
// Once, on the main queue: the generated native screens before any other part, then the core's parts, the queue of the
|
|
48
|
+
// links, the `<Modal>` replacement before any React content, the window with the copy of the launch screen, and the
|
|
49
|
+
// watch of the bundles.
|
|
50
50
|
+ (void)bootstrapWithHost:(RCTHost *)host {
|
|
51
51
|
ANNAssertMainQueue();
|
|
52
52
|
if (ANNBootstrapped) {
|
|
@@ -55,6 +55,9 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
|
|
|
55
55
|
ANNBootstrapped = YES;
|
|
56
56
|
[self registerGeneratedScreens];
|
|
57
57
|
ANNHost = host;
|
|
58
|
+
// The links that come before React content wait for it; the launch link waits for the scene. Here, not in
|
|
59
|
+
// `ANNAppDelegate`, so an app delegate of the app's own keeps its launch link.
|
|
60
|
+
[ANNDeepLinkQueue start];
|
|
58
61
|
// React Native lets a class with the descriptor of `ModalHostView` stand in for its own.
|
|
59
62
|
[ANNModalHostViewComponentView registerForModalHostView];
|
|
60
63
|
[self makeMainWindowInScene:nil];
|
|
@@ -145,9 +148,7 @@ static UIWindowScene *ANNConnectedWindowScene(void) {
|
|
|
145
148
|
ANNMainWindow.windowScene = windowScene;
|
|
146
149
|
ANNMainWindow.frame = windowScene.coordinateSpace.bounds;
|
|
147
150
|
[ANNMainWindow makeKeyAndVisible];
|
|
148
|
-
// The
|
|
149
|
-
// main window is.
|
|
150
|
-
[ANNTabsPreloadWindow mainWindowSceneDidConnect:windowScene];
|
|
151
|
+
// The overlay windows and the slot host's window made before the scene go where the main window is.
|
|
151
152
|
[ANNOverlayCoordinator mainWindowSceneDidConnect:windowScene];
|
|
152
153
|
[ANNSlotHost mainWindowSceneDidConnect:windowScene];
|
|
153
154
|
// A direction the app set before the window had a scene takes the scene now.
|
|
@@ -64,10 +64,17 @@ FOUNDATION_EXPORT ANNWaitedReadiness ANNWaitedReadinessOf(UIViewController *scre
|
|
|
64
64
|
/// The own options merged with `options` (`ANNNodeHelper mergeOwnOptions:`).
|
|
65
65
|
- (void)mergeOwnOptions:(ANNNavigationOptions *)options;
|
|
66
66
|
|
|
67
|
-
/// A change of the own options on a copy (`ANNNodeHelper changeOwnOptions:`): the
|
|
68
|
-
/// choice of the user (a scope, tokens, a checked menu item, a toggled button).
|
|
67
|
+
/// A change of the own options on a copy (`ANNNodeHelper changeOwnOptions:`): what the core keeps of the app's merges.
|
|
69
68
|
- (void)changeOwnOptions:(void (^)(ANNNavigationOptions *options))change;
|
|
70
69
|
|
|
70
|
+
/// A choice of the user in the node's user layer (`ANNNodeHelper setUserChoice:forKey:`): the way a presenter or a
|
|
71
|
+
/// module keeps what the user did (a scope, tokens, a checked menu item, a toggled button, a renamed title). Nil
|
|
72
|
+
/// removes it.
|
|
73
|
+
- (void)setUserChoice:(nullable ANNUserChoice *)choice forKey:(NSString *)key;
|
|
74
|
+
|
|
75
|
+
/// The choice of the user layer under `key`, or nil (`ANNNodeHelper userChoiceForKey:`).
|
|
76
|
+
- (nullable ANNUserChoice *)userChoiceForKey:(NSString *)key;
|
|
77
|
+
|
|
71
78
|
#pragma mark - Readiness
|
|
72
79
|
|
|
73
80
|
/// A ready handler of the node under the waiter's own key (`ANNNodeHelper setReadyHandler:forKey:`): it runs once, the
|
|
@@ -125,6 +125,14 @@ ANNWaitedReadiness ANNWaitedReadinessOf(UIViewController *screen) {
|
|
|
125
125
|
[self.nodeHelper changeOwnOptions:change];
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
+
- (void)setUserChoice:(ANNUserChoice *)choice forKey:(NSString *)key {
|
|
129
|
+
[self.nodeHelper setUserChoice:choice forKey:key];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
- (ANNUserChoice *)userChoiceForKey:(NSString *)key {
|
|
133
|
+
return [self.nodeHelper userChoiceForKey:key];
|
|
134
|
+
}
|
|
135
|
+
|
|
128
136
|
#pragma mark - Readiness
|
|
129
137
|
|
|
130
138
|
- (void)setReadyHandler:(dispatch_block_t)handler forKey:(NSString *)key {
|
|
@@ -1,30 +1,15 @@
|
|
|
1
|
-
#import "ANNEventEmitter.h"
|
|
2
1
|
#import <UIKit/UIKit.h>
|
|
3
2
|
|
|
4
3
|
NS_ASSUME_NONNULL_BEGIN
|
|
5
4
|
|
|
6
|
-
/// The state of each screen of
|
|
7
|
-
///
|
|
8
|
-
/// thread for a screen's first render, and gets every change as `ANN.ArrangementChanged`.
|
|
5
|
+
/// Whether the app can show pairs at all. The state of each screen of a pair (`useArrangement`) is kept for JavaScript
|
|
6
|
+
/// by `ANNScreenEnvironment`.
|
|
9
7
|
@interface ANNArrangementState : NSObject
|
|
10
8
|
|
|
11
9
|
/// Whether the app shows arrangements (`getStartInfo().arrangements`): built with the iOS 27.1 SDK and running on
|
|
12
10
|
/// iOS 27.1 or later. Without them JavaScript sends only the primary, as a screen. Any thread.
|
|
13
11
|
+ (BOOL)canShowArrangements;
|
|
14
12
|
|
|
15
|
-
/// Keeps the screen's state and tells when it changed; nothing goes without an emitter. Main queue.
|
|
16
|
-
+ (void)setState:(NSDictionary<NSString *, id> *)state
|
|
17
|
-
forScreenId:(NSString *)screenId
|
|
18
|
-
eventEmitter:(nullable ANNEventEmitter *)eventEmitter;
|
|
19
|
-
|
|
20
|
-
/// The screen's state, or nil for a screen outside a pair. Any thread.
|
|
21
|
-
+ (nullable NSDictionary<NSString *, id> *)stateForScreenId:(NSString *)screenId;
|
|
22
|
-
|
|
23
|
-
+ (void)removeScreenId:(NSString *)screenId;
|
|
24
|
-
|
|
25
|
-
/// Forgets every screen: after a reload the new JavaScript counts its ids anew. Main queue.
|
|
26
|
-
+ (void)removeAll;
|
|
27
|
-
|
|
28
13
|
@end
|
|
29
14
|
|
|
30
15
|
NS_ASSUME_NONNULL_END
|