diff --git a/submodules/BrowserUI/Sources/BrowserContent.swift b/submodules/BrowserUI/Sources/BrowserContent.swift index 931103bc78..7a6427c01d 100644 --- a/submodules/BrowserUI/Sources/BrowserContent.swift +++ b/submodules/BrowserUI/Sources/BrowserContent.swift @@ -153,6 +153,7 @@ protocol BrowserContent: UIView { var getNavigationController: () -> NavigationController? { get set } var minimize: () -> Void { get set } + var close: () -> Void { get set } var onScrollingUpdate: (ContentScrollingUpdate) -> Void { get set } diff --git a/submodules/BrowserUI/Sources/BrowserInstantPageContent.swift b/submodules/BrowserUI/Sources/BrowserInstantPageContent.swift index 2490767e14..f9e9e721ef 100644 --- a/submodules/BrowserUI/Sources/BrowserInstantPageContent.swift +++ b/submodules/BrowserUI/Sources/BrowserInstantPageContent.swift @@ -67,6 +67,7 @@ final class BrowserInstantPageContent: UIView, BrowserContent, UIScrollViewDeleg var pushContent: (BrowserScreen.Subject) -> Void = { _ in } var onScrollingUpdate: (ContentScrollingUpdate) -> Void = { _ in } var minimize: () -> Void = { } + var close: () -> Void = { } var openPeer: (EnginePeer) -> Void = { _ in } diff --git a/submodules/BrowserUI/Sources/BrowserScreen.swift b/submodules/BrowserUI/Sources/BrowserScreen.swift index 2d9bd49d46..78637c1ba6 100644 --- a/submodules/BrowserUI/Sources/BrowserScreen.swift +++ b/submodules/BrowserUI/Sources/BrowserScreen.swift @@ -521,6 +521,16 @@ public class BrowserScreen: ViewController, MinimizableController { } self.minimize() } + browserContent.close = { [weak self] in + guard let self, let controller = self.controller else { + return + } + if controller.isMinimized { + + } else { + controller.dismiss() + } + } self.content.append(browserContent) self.requestLayout(transition: transition) @@ -952,6 +962,9 @@ public class BrowserScreen: ViewController, MinimizableController { private let context: AccountContext private let subject: Subject + + var openPreviousOnClose = false + public init(context: AccountContext, subject: Subject) { self.context = context self.subject = subject diff --git a/submodules/BrowserUI/Sources/BrowserWebContent.swift b/submodules/BrowserUI/Sources/BrowserWebContent.swift index 2994d76f27..ae9d4be11a 100644 --- a/submodules/BrowserUI/Sources/BrowserWebContent.swift +++ b/submodules/BrowserUI/Sources/BrowserWebContent.swift @@ -125,6 +125,7 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU var pushContent: (BrowserScreen.Subject) -> Void = { _ in } var onScrollingUpdate: (ContentScrollingUpdate) -> Void = { _ in } var minimize: () -> Void = { } + var close: () -> Void = { } var present: (ViewController, Any?) -> Void = { _, _ in } var presentInGlobalOverlay: (ViewController) -> Void = { _ in } var getNavigationController: () -> NavigationController? = { return nil } @@ -176,6 +177,9 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU if #available(iOS 15.0, *) { self.webView.underPageBackgroundColor = presentationData.theme.list.plainBackgroundColor } + if #available(iOS 16.4, *) { + self.webView.isInspectable = true + } self.addSubview(self.webView) } @@ -202,35 +206,54 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU self.updateLayout(size: size, insets: insets, transition: .immediate) } } + + private let setupFontFunctions = """ + (function() { + const styleId = 'telegram-font-overrides'; + + function setTelegramFontOverrides(font, textSizeAdjust) { + let style = document.getElementById(styleId); + + if (!style) { + style = document.createElement('style'); + style.id = styleId; + document.head.appendChild(style); + } + + let cssRules = '* {'; + if (font !== null) { + cssRules += ` + font-family: ${font} !important; + `; + } + if (textSizeAdjust !== null) { + cssRules += ` + -webkit-text-size-adjust: ${textSizeAdjust} !important; + `; + } + cssRules += '}'; + + style.innerHTML = cssRules; + + if (font === null && textSizeAdjust === null) { + style.parentNode.removeChild(style); + } + } + window.setTelegramFontOverrides = setTelegramFontOverrides; + })(); + """ var currentFontState = BrowserPresentationState.FontState(size: 100, isSerif: false) func updateFontState(_ state: BrowserPresentationState.FontState) { self.updateFontState(state, force: false) } func updateFontState(_ state: BrowserPresentationState.FontState, force: Bool) { - if self.currentFontState.size != state.size || (force && self.currentFontState.size != 100) { - self.setFontSize(state.size) - } - if self.currentFontState.isSerif != state.isSerif || (force && self.currentFontState.isSerif) { - self.setFontSerif(state.isSerif) - } self.currentFontState = state - } - - private func setFontSize(_ fontSize: Int32) { - let js = "document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust='\(fontSize)%'" - self.webView.evaluateJavaScript(js, completionHandler: nil) - } - - private func setFontSerif(_ force: Bool) { - let js: String - if force { - js = "document.getElementsByTagName(\'body\')[0].style.fontFamily = 'Georgia, serif';" - } else { - js = "document.getElementsByTagName(\'body\')[0].style.fontFamily = '\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, Verdana, sans-serif';" - } - self.webView.evaluateJavaScript(js) { _, _ in - } + + let fontFamily = state.isSerif ? "'Georgia, serif'" : "null" + let textSizeAdjust = state.size != 100 ? "'\(state.size)%'" : "null" + let js = "\(setupFontFunctions) setTelegramFontOverrides(\(fontFamily), \(textSizeAdjust))"; + self.webView.evaluateJavaScript(js) { _, _ in } } private var didSetupSearch = false @@ -498,6 +521,19 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU } } + func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { + if navigationAction.targetFrame == nil { + if let url = navigationAction.request.url?.absoluteString { + self.open(url: url, new: true) + } + } + return nil + } + + func webViewDidClose(_ webView: WKWebView) { + self.close() + } + @available(iOSApplicationExtension 15.0, iOS 15.0, *) func webView(_ webView: WKWebView, requestMediaCapturePermissionFor origin: WKSecurityOrigin, initiatedByFrame frame: WKFrameInfo, type: WKMediaCaptureType, decisionHandler: @escaping (WKPermissionDecision) -> Void) { decisionHandler(.prompt) @@ -604,8 +640,10 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU private func open(url: String, new: Bool) { let subject: BrowserScreen.Subject = .webPage(url: url) if new, let navigationController = self.getNavigationController() { + navigationController._keepModalDismissProgress = true self.minimize() let controller = BrowserScreen(context: self.context, subject: subject) + navigationController._keepModalDismissProgress = true navigationController.pushViewController(controller) } else { self.pushContent(subject) diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index 3572d2f62a..4d98248074 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -91,7 +91,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo private let context: AccountContext private let peersFilter: ChatListNodePeersFilter private let requestPeerType: [ReplyMarkupButtonRequestPeerType]? - private let location: ChatListControllerLocation + private var location: ChatListControllerLocation private let displaySearchFilters: Bool private let hasDownloads: Bool private var interaction: ChatListSearchInteraction? @@ -577,6 +577,12 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo for token in tokens { tokensIdSet.insert(token.id) } + + if case .chatList(.archive) = self.location, !tokens.contains(where: { $0.id == AnyHashable(ChatListTokenId.archive.rawValue) }) { + self.location = .chatList(groupId: .root) + self.paneContainerNode.location = self.location + } + if !tokensIdSet.contains(ChatListTokenId.date.rawValue) && updatedOptions?.date != nil { updatedOptions = updatedOptions?.withUpdatedDate(nil) } @@ -590,7 +596,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo var options = options var tokens: [SearchBarToken] = [] if case .chatList(.archive) = self.location { - tokens.append(SearchBarToken(id: ChatListTokenId.archive.rawValue, icon: UIImage(bundleImageName: "Chat List/Search/Archive"), iconOffset: -1.0, title: self.presentationData.strings.ChatList_Archive, permanent: true)) + tokens.append(SearchBarToken(id: ChatListTokenId.archive.rawValue, icon: UIImage(bundleImageName: "Chat List/Search/Archive"), iconOffset: -1.0, title: self.presentationData.strings.ChatList_Archive, permanent: false)) } else if case .forum = self.location, let forumPeer = self.forumPeer { tokens.append(SearchBarToken(id: ChatListTokenId.forum.rawValue, icon: nil, iconOffset: -1.0, peer: (forumPeer, self.context, self.presentationData.theme), title: self.presentationData.strings.ChatList_Archive, permanent: true)) } @@ -670,7 +676,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo var tokens: [SearchBarToken] = [] if case .chatList(.archive) = self.location { - tokens.append(SearchBarToken(id: ChatListTokenId.archive.rawValue, icon: UIImage(bundleImageName: "Chat List/Search/Archive"), iconOffset: -1.0, title: self.presentationData.strings.ChatList_Archive, permanent: true)) + tokens.append(SearchBarToken(id: ChatListTokenId.archive.rawValue, icon: UIImage(bundleImageName: "Chat List/Search/Archive"), iconOffset: -1.0, title: self.presentationData.strings.ChatList_Archive, permanent: false)) } else if case .forum = self.location, let forumPeer = self.forumPeer { tokens.append(SearchBarToken(id: ChatListTokenId.forum.rawValue, icon: nil, iconOffset: -1.0, peer: (forumPeer, self.context, self.presentationData.theme), title: self.presentationData.strings.ChatList_Archive, permanent: true)) } diff --git a/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift index 8605ead568..60f681e000 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchPaneContainerNode.swift @@ -158,7 +158,7 @@ final class ChatListSearchPaneContainerNode: ASDisplayNode, ASGestureRecognizerD private let updatedPresentationData: (initial: PresentationData, signal: Signal)? private let peersFilter: ChatListNodePeersFilter private let requestPeerType: [ReplyMarkupButtonRequestPeerType]? - private let location: ChatListControllerLocation + var location: ChatListControllerLocation private let searchQuery: Signal private let searchOptions: Signal private let globalPeerSearchContext: GlobalPeerSearchContext diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemOverlaysView.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemOverlaysView.swift index ab69237e03..6b9d6d2220 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemOverlaysView.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemOverlaysView.swift @@ -754,6 +754,7 @@ final class StoryItemOverlaysView: UIView { itemView = current } else { itemView = WeatherView(frame: CGRect()) + itemView.isUserInteractionEnabled = false self.itemViews[itemId] = itemView self.addSubview(itemView) } diff --git a/submodules/TelegramUI/Sources/ApplicationContext.swift b/submodules/TelegramUI/Sources/ApplicationContext.swift index 4c99a57e34..245323180c 100644 --- a/submodules/TelegramUI/Sources/ApplicationContext.swift +++ b/submodules/TelegramUI/Sources/ApplicationContext.swift @@ -32,6 +32,7 @@ import ChatMessageNotificationItem import PhoneNumberFormat import AttachmentUI import MinimizedContainer +import BrowserUI final class UnauthorizedApplicationContext { let sharedContext: SharedAccountContextImpl @@ -445,6 +446,8 @@ final class AuthorizedApplicationContext { minimizedContainer.collapse() } else if let topContoller = strongSelf.rootController.topViewController as? AttachmentController { topContoller.minimizeIfNeeded() + } else if let topContoller = strongSelf.rootController.topViewController as? BrowserScreen { + topContoller.requestMinimize(topEdgeOffset: nil, initialVelocity: nil) } for controller in strongSelf.rootController.viewControllers {