diff --git a/submodules/Display/Display/ChildWindowHostView.swift b/submodules/Display/Display/ChildWindowHostView.swift index 6cb11063a1..1e8a970f0a 100644 --- a/submodules/Display/Display/ChildWindowHostView.swift +++ b/submodules/Display/Display/ChildWindowHostView.swift @@ -7,7 +7,7 @@ private final class ChildWindowHostView: UIView, WindowHost { var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)? var presentController: ((ContainableController, PresentationSurfaceLevel, Bool, @escaping () -> Void) -> Void)? var invalidateDeferScreenEdgeGestureImpl: (() -> Void)? - var invalidatePreferNavigationUIHiddenImpl: (() -> Void)? + var invalidatePrefersOnScreenNavigationHiddenImpl: (() -> Void)? var invalidateSupportedOrientationsImpl: (() -> Void)? var cancelInteractiveKeyboardGesturesImpl: (() -> Void)? var forEachControllerImpl: (((ContainableController) -> Void) -> Void)? @@ -35,8 +35,8 @@ private final class ChildWindowHostView: UIView, WindowHost { self.invalidateDeferScreenEdgeGestureImpl?() } - func invalidatePreferNavigationUIHidden() { - self.invalidatePreferNavigationUIHiddenImpl?() + func invalidatePrefersOnScreenNavigationHidden() { + self.invalidatePrefersOnScreenNavigationHiddenImpl?() } func invalidateSupportedOrientations() { @@ -67,7 +67,7 @@ public func childWindowHostView(parent: UIView) -> WindowHostView { return false }, updateSupportedInterfaceOrientations: { orientations in }, updateDeferScreenEdgeGestures: { edges in - }, updatePreferNavigationUIHidden: { value in + }, updatePrefersOnScreenNavigationHidden: { value in }) view.updateSize = { [weak hostView] size in @@ -102,8 +102,8 @@ public func childWindowHostView(parent: UIView) -> WindowHostView { return hostView?.invalidateDeferScreenEdgeGesture?() } - view.invalidatePreferNavigationUIHiddenImpl = { [weak hostView] in - return hostView?.invalidatePreferNavigationUIHidden?() + view.invalidatePrefersOnScreenNavigationHiddenImpl = { [weak hostView] in + return hostView?.invalidatePrefersOnScreenNavigationHidden?() } view.invalidateSupportedOrientationsImpl = { [weak hostView] in diff --git a/submodules/Display/Display/NativeWindowHostView.swift b/submodules/Display/Display/NativeWindowHostView.swift index 99f67a6a1b..e0345057d5 100644 --- a/submodules/Display/Display/NativeWindowHostView.swift +++ b/submodules/Display/Display/NativeWindowHostView.swift @@ -84,9 +84,9 @@ private final class WindowRootViewController: UIViewController, UIViewController } } - var preferNavigationUIHidden: Bool = false { + var prefersOnScreenNavigationHidden: Bool = false { didSet { - if oldValue != self.preferNavigationUIHidden { + if oldValue != self.prefersOnScreenNavigationHidden { if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { self.setNeedsUpdateOfHomeIndicatorAutoHidden() } @@ -135,7 +135,7 @@ private final class WindowRootViewController: UIViewController, UIViewController } override var prefersHomeIndicatorAutoHidden: Bool { - return self.preferNavigationUIHidden + return self.prefersOnScreenNavigationHidden } override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { @@ -226,7 +226,7 @@ private final class NativeWindow: UIWindow, WindowHost { var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)? var presentNativeImpl: ((UIViewController) -> Void)? var invalidateDeferScreenEdgeGestureImpl: (() -> Void)? - var invalidatePreferNavigationUIHiddenImpl: (() -> Void)? + var invalidatePrefersOnScreenNavigationHiddenImpl: (() -> Void)? var invalidateSupportedOrientationsImpl: (() -> Void)? var cancelInteractiveKeyboardGesturesImpl: (() -> Void)? var forEachControllerImpl: (((ContainableController) -> Void) -> Void)? @@ -322,8 +322,8 @@ private final class NativeWindow: UIWindow, WindowHost { self.invalidateDeferScreenEdgeGestureImpl?() } - func invalidatePreferNavigationUIHidden() { - self.invalidatePreferNavigationUIHiddenImpl?() + func invalidatePrefersOnScreenNavigationHidden() { + self.invalidatePrefersOnScreenNavigationHiddenImpl?() } func invalidateSupportedOrientations() { @@ -363,8 +363,8 @@ public func nativeWindowHostView() -> (UIWindow & WindowHost, WindowHostView, UI rootViewController.orientations = orientations }, updateDeferScreenEdgeGestures: { edges in rootViewController.gestureEdges = edges - }, updatePreferNavigationUIHidden: { value in - rootViewController.preferNavigationUIHidden = value + }, updatePrefersOnScreenNavigationHidden: { value in + rootViewController.prefersOnScreenNavigationHidden = value }) rootViewController.transitionToSize = { [weak hostView] size, duration in @@ -406,8 +406,8 @@ public func nativeWindowHostView() -> (UIWindow & WindowHost, WindowHostView, UI return hostView?.invalidateDeferScreenEdgeGesture?() } - window.invalidatePreferNavigationUIHiddenImpl = { [weak hostView] in - return hostView?.invalidatePreferNavigationUIHidden?() + window.invalidatePrefersOnScreenNavigationHiddenImpl = { [weak hostView] in + return hostView?.invalidatePrefersOnScreenNavigationHidden?() } window.invalidateSupportedOrientationsImpl = { [weak hostView] in diff --git a/submodules/Display/Display/PresentationContext.swift b/submodules/Display/Display/PresentationContext.swift index 34d49df4cc..269492ab0e 100644 --- a/submodules/Display/Display/PresentationContext.swift +++ b/submodules/Display/Display/PresentationContext.swift @@ -445,4 +445,16 @@ public final class PresentationContext { return edges } + + func combinedPrefersOnScreenNavigationHidden() -> Bool { + var hidden: Bool = false + + for (controller, _) in self.controllers { + if let controller = controller as? ViewController { + hidden = hidden || controller.prefersOnScreenNavigationHidden + } + } + + return hidden + } } diff --git a/submodules/Display/Display/TabBarNode.swift b/submodules/Display/Display/TabBarNode.swift index 3df984b58b..65fe8636f9 100644 --- a/submodules/Display/Display/TabBarNode.swift +++ b/submodules/Display/Display/TabBarNode.swift @@ -182,10 +182,10 @@ private final class TabBarNodeContainer { } deinit { - item.removeSetBadgeListener(self.updateBadgeListenerIndex) - item.removeSetTitleListener(self.updateTitleListenerIndex) - item.removeSetImageListener(self.updateImageListenerIndex) - item.removeSetSelectedImageListener(self.updateSelectedImageListenerIndex) + self.item.removeSetBadgeListener(self.updateBadgeListenerIndex) + self.item.removeSetTitleListener(self.updateTitleListenerIndex) + self.item.removeSetImageListener(self.updateImageListenerIndex) + self.item.removeSetSelectedImageListener(self.updateSelectedImageListenerIndex) } } diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index c3764f6e03..72415458c4 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -110,16 +110,16 @@ public enum ViewControllerNavigationPresentation { } } - public final var preferNavigationUIHidden: Bool = false { + public final var prefersOnScreenNavigationHidden: Bool = false { didSet { - if self.preferNavigationUIHidden != oldValue { - self.window?.invalidatePreferNavigationUIHidden() + if self.prefersOnScreenNavigationHidden != oldValue { + self.window?.invalidatePrefersOnScreenNavigationHidden() } } } override open var prefersHomeIndicatorAutoHidden: Bool { - return self.preferNavigationUIHidden + return self.prefersOnScreenNavigationHidden } open var navigationPresentation: ViewControllerNavigationPresentation = .default diff --git a/submodules/Display/Display/WindowContent.swift b/submodules/Display/Display/WindowContent.swift index c8123d4b00..e7b5841fbd 100644 --- a/submodules/Display/Display/WindowContent.swift +++ b/submodules/Display/Display/WindowContent.swift @@ -204,7 +204,7 @@ public final class WindowHostView { let updateSupportedInterfaceOrientations: (UIInterfaceOrientationMask) -> Void let updateDeferScreenEdgeGestures: (UIRectEdge) -> Void - let updatePreferNavigationUIHidden: (Bool) -> Void + let updatePrefersOnScreenNavigationHidden: (Bool) -> Void var present: ((ContainableController, PresentationSurfaceLevel, Bool, @escaping () -> Void) -> Void)? var presentInGlobalOverlay: ((_ controller: ContainableController) -> Void)? @@ -215,20 +215,20 @@ public final class WindowHostView { var isUpdatingOrientationLayout = false var hitTest: ((CGPoint, UIEvent?) -> UIView?)? var invalidateDeferScreenEdgeGesture: (() -> Void)? - var invalidatePreferNavigationUIHidden: (() -> Void)? + var invalidatePrefersOnScreenNavigationHidden: (() -> Void)? var invalidateSupportedOrientations: (() -> Void)? var cancelInteractiveKeyboardGestures: (() -> Void)? var forEachController: (((ContainableController) -> Void) -> Void)? var getAccessibilityElements: (() -> [Any]?)? - init(containerView: UIView, eventView: UIView, aboveStatusBarView: UIView, isRotating: @escaping () -> Bool, updateSupportedInterfaceOrientations: @escaping (UIInterfaceOrientationMask) -> Void, updateDeferScreenEdgeGestures: @escaping (UIRectEdge) -> Void, updatePreferNavigationUIHidden: @escaping (Bool) -> Void) { + init(containerView: UIView, eventView: UIView, aboveStatusBarView: UIView, isRotating: @escaping () -> Bool, updateSupportedInterfaceOrientations: @escaping (UIInterfaceOrientationMask) -> Void, updateDeferScreenEdgeGestures: @escaping (UIRectEdge) -> Void, updatePrefersOnScreenNavigationHidden: @escaping (Bool) -> Void) { self.containerView = containerView self.eventView = eventView self.aboveStatusBarView = aboveStatusBarView self.isRotating = isRotating self.updateSupportedInterfaceOrientations = updateSupportedInterfaceOrientations self.updateDeferScreenEdgeGestures = updateDeferScreenEdgeGestures - self.updatePreferNavigationUIHidden = updatePreferNavigationUIHidden + self.updatePrefersOnScreenNavigationHidden = updatePrefersOnScreenNavigationHidden } fileprivate var onScreenNavigationHeight: CGFloat? { @@ -250,7 +250,7 @@ public protocol WindowHost { func present(_ controller: ContainableController, on level: PresentationSurfaceLevel, blockInteraction: Bool, completion: @escaping () -> Void) func presentInGlobalOverlay(_ controller: ContainableController) func invalidateDeferScreenEdgeGestures() - func invalidatePreferNavigationUIHidden() + func invalidatePrefersOnScreenNavigationHidden() func invalidateSupportedOrientations() func cancelInteractiveKeyboardGestures() } @@ -299,7 +299,7 @@ public class Window1 { private var tracingStatusBarsInvalidated = false private var shouldUpdateDeferScreenEdgeGestures = false - private var shouldInvalidatePreferNavigationUIHidden = false + private var shouldInvalidatePrefersOnScreenNavigationHidden = false private var shouldInvalidateSupportedOrientations = false private var statusBarHidden = false @@ -405,8 +405,8 @@ public class Window1 { self?.invalidateDeferScreenEdgeGestures() } - self.hostView.invalidatePreferNavigationUIHidden = { [weak self] in - self?.invalidatePreferNavigationUIHidden() + self.hostView.invalidatePrefersOnScreenNavigationHidden = { [weak self] in + self?.invalidatePrefersOnScreenNavigationHidden() } self.hostView.invalidateSupportedOrientations = { [weak self] in @@ -613,8 +613,8 @@ public class Window1 { self.hostView.eventView.setNeedsLayout() } - public func invalidatePreferNavigationUIHidden() { - self.shouldInvalidatePreferNavigationUIHidden = true + public func invalidatePrefersOnScreenNavigationHidden() { + self.shouldInvalidatePrefersOnScreenNavigationHidden = true self.hostView.eventView.setNeedsLayout() } @@ -831,17 +831,17 @@ public class Window1 { self.hostView.updateSupportedInterfaceOrientations(resolvedOrientations) self.hostView.updateDeferScreenEdgeGestures(self.collectScreenEdgeGestures()) - self.hostView.updatePreferNavigationUIHidden(self.collectPreferNavigationUIHidden()) + self.hostView.updatePrefersOnScreenNavigationHidden(self.collectPrefersOnScreenNavigationHidden()) self.shouldUpdateDeferScreenEdgeGestures = false - self.shouldInvalidatePreferNavigationUIHidden = false + self.shouldInvalidatePrefersOnScreenNavigationHidden = false self.shouldInvalidateSupportedOrientations = false - } else if self.shouldUpdateDeferScreenEdgeGestures || self.shouldInvalidatePreferNavigationUIHidden || self.shouldInvalidateSupportedOrientations { + } else if self.shouldUpdateDeferScreenEdgeGestures || self.shouldInvalidatePrefersOnScreenNavigationHidden || self.shouldInvalidateSupportedOrientations { self.hostView.updateDeferScreenEdgeGestures(self.collectScreenEdgeGestures()) - self.hostView.updatePreferNavigationUIHidden(self.collectPreferNavigationUIHidden()) + self.hostView.updatePrefersOnScreenNavigationHidden(self.collectPrefersOnScreenNavigationHidden()) self.shouldUpdateDeferScreenEdgeGestures = false - self.shouldInvalidatePreferNavigationUIHidden = false + self.shouldInvalidatePrefersOnScreenNavigationHidden = false if self.shouldInvalidateSupportedOrientations { var supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .all) @@ -859,10 +859,10 @@ public class Window1 { var resolvedOrientations: UIInterfaceOrientationMask switch self.windowLayout.metrics.widthClass { - case .regular: - resolvedOrientations = supportedOrientations.regularSize - case .compact: - resolvedOrientations = supportedOrientations.compactSize + case .regular: + resolvedOrientations = supportedOrientations.regularSize + case .compact: + resolvedOrientations = supportedOrientations.compactSize } if resolvedOrientations.isEmpty { resolvedOrientations = [.portrait] @@ -1126,8 +1126,16 @@ public class Window1 { return edges } - private func collectPreferNavigationUIHidden() -> Bool { - return false + private func collectPrefersOnScreenNavigationHidden() -> Bool { + var hidden = self.presentationContext.combinedPrefersOnScreenNavigationHidden() + + for controller in self.topLevelOverlayControllers { + if let controller = controller as? ViewController { + hidden = hidden || controller.prefersOnScreenNavigationHidden + } + } + + return hidden } public func forEachViewController(_ f: (ContainableController) -> Bool) { diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index a5b146553a..9bc6f47595 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -837,6 +837,10 @@ public class GalleryController: ViewController { self?.presentingViewController?.dismiss(animated: false, completion: nil) } + self.galleryNode.controlsVisibilityChanged = { [weak self] visible in + self?.prefersOnScreenNavigationHidden = !visible + } + let baseNavigationController = self.baseNavigationController self.galleryNode.baseNavigationController = { [weak baseNavigationController] in return baseNavigationController diff --git a/submodules/GalleryUI/Sources/GalleryControllerNode.swift b/submodules/GalleryUI/Sources/GalleryControllerNode.swift index ef304d0504..92d0f0f082 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerNode.swift @@ -28,6 +28,8 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture private var isDismissed = false public var areControlsHidden = false + public var controlsVisibilityChanged: ((Bool) -> Void)? + public var isBackgroundExtendedOverNavigationBar = true { didSet { if let (navigationBarHeight, layout) = self.containerLayout { @@ -268,6 +270,7 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture open func setControlsHidden(_ hidden: Bool, animated: Bool) { self.areControlsHidden = hidden + self.controlsVisibilityChanged?(!hidden) if animated { UIView.animate(withDuration: 0.3, animations: { let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0