diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 2166e4b6..bca47cf1 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -17,8 +17,9 @@ import ObjectiveC.runtime } @objc public static var mapping: [Int16:OnScreenWidgetView] = [:] - @objc public static var isRestoring: Bool = false - @objc public static var hasRestoredFromAutoDock: Bool = false + @objc public static var isRestoringFolderStates: Bool = false + @objc public static var deferSlideGestureDueToAutoDockRestore: Bool = false + @objc public static var deferScreenEdgeSysGesturesDueToOnScreenWidgets: Bool = false @objc public static var autoDockRestoreInitByViewResize: Bool = false @objc public static func set(widget:OnScreenWidgetView, for key:Int16) { mapping[key] = widget @@ -3296,9 +3297,9 @@ import ObjectiveC.runtime @objc private func vl_autoDock_touchesEnded(_ touches: Set, with event: UIEvent?) { OnScreenWidgetView.autoDockOriginalTouchesEndedIMP?(self, #selector(OnScreenWidgetView.touchesEnded(_:with:)), touches, event) guard autoDockEnabled else { return } - if OnScreenWidgetView.hasRestoredFromAutoDock { + if OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore { DispatchQueue.global().asyncAfter(deadline: .now() + 0.02){ - OnScreenWidgetView.hasRestoredFromAutoDock = false + OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = false } } autoDockRestartCountdownIfNeeded() @@ -3459,6 +3460,11 @@ import ObjectiveC.runtime ) { self.frame = targetFrame self.transform = CGAffineTransform(scaleX: 0.985, y: 0.985) + + if ControllerUtil.activeGCControllers.count > 0, !GenericUtils.iOS26Available { + self.parentViewController?.setNeedsUpdateOfHomeIndicatorAutoHidden() + } + } completion: { _ in UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveEaseOut]) { self.autoDockApplyTemporarySize() @@ -3480,12 +3486,14 @@ import ObjectiveC.runtime } private func autoDockRestoreWidget(animated: Bool) { + OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets = true + self.parentViewController?.setNeedsUpdateOfHomeIndicatorAutoHidden() guard autoDockIsDocked else { restartAutoDockCountdown() return } let restoreCenter = storedCenter - OnScreenWidgetView.hasRestoredFromAutoDock = true + OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = true autoDockStopCountdown() autoDockStopSettledAlphaTimer() autoDockRestoreOriginalSize() @@ -3515,8 +3523,9 @@ import ObjectiveC.runtime self.restartAutoDockCountdown() if OnScreenWidgetView.autoDockRestoreInitByViewResize { OnScreenWidgetView.autoDockRestoreInitByViewResize = false - OnScreenWidgetView.hasRestoredFromAutoDock = false + OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = false } + OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets = false } ) } @@ -3647,7 +3656,7 @@ import ObjectiveC.runtime setCollection(hidden: folded, for: folder) if !folded, folder.revealMode == .exclusive { OnScreenWidgetView.unfoldedExclusiveFolderSequence = folder.sequence - if(!isRestoring) {OnScreenWidgetView.postExclusiveUnfoldedSequences.removeAll()} + if(!isRestoringFolderStates) {OnScreenWidgetView.postExclusiveUnfoldedSequences.removeAll()} let currentRootFolder = OnScreenWidgetView.getRootFolder(of: folder) ?? folder var offshootRootFolders:Set = Set() folder.forEachWidget{ widget in @@ -3709,6 +3718,25 @@ import ObjectiveC.runtime } return false } + + @objc static var onlyRootFolderVisible: Bool { + var visibleNonFolerCount:Int = 0 + var visibleFolderCount:Int = 0 + for widget in OnScreenWidgetView.mapping.values { + if widget.isHidden {continue} + if widget.isFolder { + visibleFolderCount += 1 + if visibleFolderCount > 1 {return false} + continue + } + else { + visibleNonFolerCount += 1 + if visibleNonFolerCount > 0 {return false} + continue + } + } + return true + } private static func putWidget(_ widget:OnScreenWidgetView, into folder:OnScreenWidgetView){ guard !OnScreenWidgetView.getParentFolders(of: folder).contains(widget), !folder.isHidden else { return } @@ -3744,7 +3772,7 @@ import ObjectiveC.runtime } @objc static func restoreFoldedStates(){ - isRestoring = true + isRestoringFolderStates = true var unfoldedExclusiveFolder: OnScreenWidgetView? if unfoldedExclusiveFolderSequence != -1 { unfoldedExclusiveFolder = OnScreenWidgetView.mapping[unfoldedExclusiveFolderSequence] @@ -3767,7 +3795,7 @@ import ObjectiveC.runtime OnScreenWidgetView.set(folded: false, for: folder) } - isRestoring = false + isRestoringFolderStates = false } @objc static func getMaxSequence() -> Int16{ diff --git a/VoidLink/Utility/GenericUtils.swift b/VoidLink/Utility/GenericUtils.swift index 876c46dd..22e2d998 100644 --- a/VoidLink/Utility/GenericUtils.swift +++ b/VoidLink/Utility/GenericUtils.swift @@ -417,6 +417,14 @@ import UIKit } return false } + + @objc static let iOS26Available: Bool = { + if #available(iOS 26.0, tvOS 26.0, *) { + return true + } else { + return false + } + }() @objc static let liquidGlassEnabled: Bool = { if #available(iOS 26.0, tvOS 26.0, *) { diff --git a/VoidLink/ViewControllers/CustomEdgeSlideGestureRecognizer.m b/VoidLink/ViewControllers/CustomEdgeSlideGestureRecognizer.m index 26205d72..f445b35a 100644 --- a/VoidLink/ViewControllers/CustomEdgeSlideGestureRecognizer.m +++ b/VoidLink/ViewControllers/CustomEdgeSlideGestureRecognizer.m @@ -53,7 +53,7 @@ CGFloat startPointX; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // [super touchesEnded:touches withEvent:event]; if(_excludePencilEvent && touches.anyObject.type != UITouchTypeDirect) return; - if(OnScreenWidgetView.hasRestoredFromAutoDock) return; + if(OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore) return; if([touches containsObject:capturedUITouch]){ CGFloat _endPointX = [capturedUITouch locationInView:self.view].x; CGFloat screenWidthInPoints = self.view.frame.size.width; diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index eb857da6..9258c491 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -2029,7 +2029,8 @@ } - (BOOL)prefersHomeIndicatorAutoHidden { - if ( [_controllerSupport getConnectedGamepadCount] > 0 && [_streamView getCurrentOscState] == OnScreenControlsLevelOff && + if(OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets) return NO; + if ( [_controllerSupport getConnectedGamepadCount] > 0 && _userIsInteracting == NO) { // Autohide the home bar when a gamepad is connected // and the on-screen controls are disabled. We can't