diff --git a/submodules/BrowserUI/Sources/BrowserAddressBarComponent.swift b/submodules/BrowserUI/Sources/BrowserAddressBarComponent.swift index 6ab928088a..cb5f0d373c 100644 --- a/submodules/BrowserUI/Sources/BrowserAddressBarComponent.swift +++ b/submodules/BrowserUI/Sources/BrowserAddressBarComponent.swift @@ -15,6 +15,7 @@ final class AddressBarContentComponent: Component { let theme: PresentationTheme let strings: PresentationStrings + let metrics: LayoutMetrics let url: String let isSecure: Bool let isExpanded: Bool @@ -23,6 +24,7 @@ final class AddressBarContentComponent: Component { init( theme: PresentationTheme, strings: PresentationStrings, + metrics: LayoutMetrics, url: String, isSecure: Bool, isExpanded: Bool, @@ -30,6 +32,7 @@ final class AddressBarContentComponent: Component { ) { self.theme = theme self.strings = strings + self.metrics = metrics self.url = url self.isSecure = isSecure self.isExpanded = isExpanded @@ -43,6 +46,9 @@ final class AddressBarContentComponent: Component { if lhs.strings !== rhs.strings { return false } + if lhs.metrics != rhs.metrics { + return false + } if lhs.url != rhs.url { return false } @@ -78,6 +84,7 @@ final class AddressBarContentComponent: Component { var title: String var isSecure: Bool var collapseFraction: CGFloat + var isTablet: Bool static func ==(lhs: Params, rhs: Params) -> Bool { if lhs.theme !== rhs.theme { @@ -101,6 +108,9 @@ final class AddressBarContentComponent: Component { if lhs.collapseFraction != rhs.collapseFraction { return false } + if lhs.isTablet != rhs.isTablet { + return false + } return true } } @@ -254,7 +264,7 @@ final class AddressBarContentComponent: Component { self.placeholderContent.view?.isHidden = !text.isEmpty if let params = self.params { - self.update(theme: params.theme, strings: params.strings, size: params.size, isActive: params.isActive, title: params.title, isSecure: params.isSecure, collapseFraction: params.collapseFraction, transition: .immediate) + self.update(theme: params.theme, strings: params.strings, size: params.size, isActive: params.isActive, title: params.title, isSecure: params.isSecure, collapseFraction: params.collapseFraction, isTablet: params.isTablet, transition: .immediate) } } @@ -281,12 +291,12 @@ final class AddressBarContentComponent: Component { title = title.idnaDecoded ?? title } - self.update(theme: component.theme, strings: component.strings, size: availableSize, isActive: isActive, title: title.lowercased(), isSecure: component.isSecure, collapseFraction: collapseFraction, transition: transition) + self.update(theme: component.theme, strings: component.strings, size: availableSize, isActive: isActive, title: title.lowercased(), isSecure: component.isSecure, collapseFraction: collapseFraction, isTablet: component.metrics.isTablet, transition: transition) return availableSize } - public func update(theme: PresentationTheme, strings: PresentationStrings, size: CGSize, isActive: Bool, title: String, isSecure: Bool, collapseFraction: CGFloat, transition: ComponentTransition) { + public func update(theme: PresentationTheme, strings: PresentationStrings, size: CGSize, isActive: Bool, title: String, isSecure: Bool, collapseFraction: CGFloat, isTablet: Bool, transition: ComponentTransition) { let params = Params( theme: theme, strings: strings, @@ -294,7 +304,8 @@ final class AddressBarContentComponent: Component { isActive: isActive, title: title, isSecure: isSecure, - collapseFraction: collapseFraction + collapseFraction: collapseFraction, + isTablet: isTablet ) if self.params == params { @@ -334,13 +345,13 @@ final class AddressBarContentComponent: Component { let cancelButtonSpacing: CGFloat = 8.0 var backgroundFrame = CGRect(origin: CGPoint(x: sideInset, y: topInset), size: CGSize(width: size.width - sideInset * 2.0, height: inputHeight)) - if isActiveWithText { + if isActiveWithText && !isTablet { backgroundFrame.size.width -= cancelTextSize.width + cancelButtonSpacing } transition.setFrame(layer: self.backgroundLayer, frame: backgroundFrame) transition.setFrame(view: self.cancelButton, frame: CGRect(origin: CGPoint(x: backgroundFrame.maxX, y: 0.0), size: CGSize(width: cancelButtonSpacing + cancelTextSize.width, height: size.height))) - self.cancelButton.isUserInteractionEnabled = isActiveWithText + self.cancelButton.isUserInteractionEnabled = isActiveWithText && !isTablet let textX: CGFloat = backgroundFrame.minX + sideInset let textFrame = CGRect(origin: CGPoint(x: textX, y: backgroundFrame.minY), size: CGSize(width: backgroundFrame.maxX - textX, height: backgroundFrame.height)) @@ -418,7 +429,7 @@ final class AddressBarContentComponent: Component { cancelButtonTitleComponentView.isUserInteractionEnabled = false } transition.setFrame(view: cancelButtonTitleComponentView, frame: CGRect(origin: CGPoint(x: backgroundFrame.maxX + cancelButtonSpacing, y: floor((size.height - cancelTextSize.height) / 2.0)), size: cancelTextSize)) - transition.setAlpha(view: cancelButtonTitleComponentView, alpha: isActiveWithText ? 1.0 : 0.0) + transition.setAlpha(view: cancelButtonTitleComponentView, alpha: isActiveWithText && !isTablet ? 1.0 : 0.0) } let textFieldFrame = CGRect(origin: CGPoint(x: textFrame.minX, y: backgroundFrame.minY), size: CGSize(width: backgroundFrame.maxX - textFrame.minX, height: backgroundFrame.height)) diff --git a/submodules/BrowserUI/Sources/BrowserNavigationBarComponent.swift b/submodules/BrowserUI/Sources/BrowserNavigationBarComponent.swift index 1b0d09728c..674b5a7b9c 100644 --- a/submodules/BrowserUI/Sources/BrowserNavigationBarComponent.swift +++ b/submodules/BrowserUI/Sources/BrowserNavigationBarComponent.swift @@ -29,6 +29,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { let topInset: CGFloat let height: CGFloat let sideInset: CGFloat + let metrics: LayoutMetrics let leftItems: [AnyComponentWithIdentity] let rightItems: [AnyComponentWithIdentity] let centerItem: AnyComponentWithIdentity? @@ -46,6 +47,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { topInset: CGFloat, height: CGFloat, sideInset: CGFloat, + metrics: LayoutMetrics, leftItems: [AnyComponentWithIdentity], rightItems: [AnyComponentWithIdentity], centerItem: AnyComponentWithIdentity?, @@ -62,6 +64,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { self.topInset = topInset self.height = height self.sideInset = sideInset + self.metrics = metrics self.leftItems = leftItems self.rightItems = rightItems self.centerItem = centerItem @@ -96,6 +99,9 @@ final class BrowserNavigationBarComponent: CombinedComponent { if lhs.sideInset != rhs.sideInset { return false } + if lhs.metrics != rhs.metrics { + return false + } if lhs.leftItems != rhs.leftItems { return false } @@ -135,6 +141,8 @@ final class BrowserNavigationBarComponent: CombinedComponent { let expandedHeight = context.component.height let contentHeight: CGFloat = expandedHeight * (1.0 - context.component.collapseFraction) + collapsedHeight * context.component.collapseFraction let size = CGSize(width: context.availableSize.width, height: context.component.topInset + contentHeight) + let verticalOffset: CGFloat = context.component.metrics.isTablet ? -3.0 : 0.0 + let itemSpacing: CGFloat = context.component.metrics.isTablet ? 24.0 : 8.0 let background = background.update( component: Rectangle(color: context.component.backgroundColor.withAlphaComponent(1.0)), @@ -164,7 +172,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { availableSize: CGSize(width: size.width, height: size.height), transition: context.transition ) - + var leftItemList: [_UpdatedChildComponent] = [] for item in context.component.leftItems { let item = leftItems[item.id].update( @@ -186,11 +194,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { rightItemList.append(item) availableWidth -= item.size.width } - - if !leftItemList.isEmpty || !rightItemList.isEmpty { - availableWidth -= 14.0 - } - + context.add(background .position(CGPoint(x: size.width / 2.0, y: size.height / 2.0)) ) @@ -216,36 +220,37 @@ final class BrowserNavigationBarComponent: CombinedComponent { var leftItemX = sideInset for item in leftItemList { context.add(item - .position(CGPoint(x: leftItemX + item.size.width / 2.0 - (item.size.width / 2.0 * 0.35 * context.component.collapseFraction), y: context.component.topInset + contentHeight / 2.0)) + .position(CGPoint(x: leftItemX + item.size.width / 2.0 - (item.size.width / 2.0 * 0.35 * context.component.collapseFraction), y: context.component.topInset + contentHeight / 2.0 + verticalOffset)) .scale(1.0 - 0.35 * context.component.collapseFraction) .opacity(1.0 - context.component.collapseFraction) .appear(.default(scale: true, alpha: true)) .disappear(.default(scale: true, alpha: true)) ) - leftItemX += item.size.width + 8.0 - centerLeftInset += item.size.width + 8.0 + leftItemX += item.size.width + itemSpacing + centerLeftInset += item.size.width + itemSpacing } var centerRightInset = sideInset - 5.0 var rightItemX = context.availableSize.width - (sideInset - 5.0) for item in rightItemList.reversed() { context.add(item - .position(CGPoint(x: rightItemX - item.size.width / 2.0 + (item.size.width / 2.0 * 0.35 * context.component.collapseFraction), y: context.component.topInset + contentHeight / 2.0)) + .position(CGPoint(x: rightItemX - item.size.width / 2.0 + (item.size.width / 2.0 * 0.35 * context.component.collapseFraction), y: context.component.topInset + contentHeight / 2.0 + verticalOffset)) .scale(1.0 - 0.35 * context.component.collapseFraction) .opacity(1.0 - context.component.collapseFraction) .appear(.default(scale: true, alpha: true)) .disappear(.default(scale: true, alpha: true)) ) - rightItemX -= item.size.width + 8.0 - centerRightInset += item.size.width + 8.0 + rightItemX -= item.size.width + itemSpacing + centerRightInset += item.size.width + itemSpacing } let maxCenterInset = max(centerLeftInset, centerRightInset) if !leftItemList.isEmpty || !rightItemList.isEmpty { - availableWidth -= 20.0 + availableWidth -= itemSpacing * CGFloat(max(0, leftItemList.count - 1)) + itemSpacing * CGFloat(max(0, rightItemList.count - 1)) + 30.0 } availableWidth -= context.component.sideInset * 2.0 + availableWidth = min(660.0, availableWidth) let environment = BrowserNavigationBarEnvironment(fraction: context.component.collapseFraction) @@ -264,7 +269,7 @@ final class BrowserNavigationBarComponent: CombinedComponent { } if let centerItem = centerItem { context.add(centerItem - .position(CGPoint(x: centerX, y: context.component.topInset + contentHeight / 2.0)) + .position(CGPoint(x: centerX, y: context.component.topInset + contentHeight / 2.0 + verticalOffset)) .scale(1.0 - 0.35 * context.component.collapseFraction) .appear(.default(scale: false, alpha: true)) .disappear(.default(scale: false, alpha: true)) diff --git a/submodules/BrowserUI/Sources/BrowserScreen.swift b/submodules/BrowserUI/Sources/BrowserScreen.swift index e6f681aa45..c3288ad5a1 100644 --- a/submodules/BrowserUI/Sources/BrowserScreen.swift +++ b/submodules/BrowserUI/Sources/BrowserScreen.swift @@ -80,6 +80,8 @@ private final class BrowserScreenComponent: CombinedComponent { let performAction = context.component.performAction let performHoldAction = context.component.performHoldAction + let isTablet = environment.metrics.isTablet + let navigationContent: AnyComponentWithIdentity? var navigationLeftItems: [AnyComponentWithIdentity] var navigationRightItems: [AnyComponentWithIdentity] @@ -106,6 +108,7 @@ private final class BrowserScreenComponent: CombinedComponent { AddressBarContentComponent( theme: environment.theme, strings: environment.strings, + metrics: environment.metrics, url: context.component.contentState?.url ?? "", isSecure: context.component.contentState?.isSecure ?? false, isExpanded: context.component.presentationState.addressFocused, @@ -126,7 +129,7 @@ private final class BrowserScreenComponent: CombinedComponent { ) } - if context.component.presentationState.addressFocused { + if context.component.presentationState.addressFocused && !isTablet { navigationLeftItems = [] navigationRightItems = [] } else { @@ -146,6 +149,68 @@ private final class BrowserScreenComponent: CombinedComponent { ) ] + if isTablet { + navigationLeftItems.append( + AnyComponentWithIdentity( + id: "minimize", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Media Gallery/PictureInPictureButton", + tintColor: environment.theme.rootController.navigationBar.accentTextColor + ) + ), + action: { + performAction.invoke(.close) + } + ) + ) + ) + ) + + let canGoBack = context.component.contentState?.canGoBack ?? false + let canGoForward = context.component.contentState?.canGoForward ?? false + + navigationLeftItems.append( + AnyComponentWithIdentity( + id: "back", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Instant View/Back", + tintColor: environment.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(canGoBack ? 1.0 : 0.4) + ) + ), + action: { + performAction.invoke(.navigateBack) + } + ) + ) + ) + ) + + navigationLeftItems.append( + AnyComponentWithIdentity( + id: "forward", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Instant View/Forward", + tintColor: environment.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(canGoForward ? 1.0 : 0.4) + ) + ), + action: { + performAction.invoke(.navigateForward) + } + ) + ) + ) + ) + } + navigationRightItems = [ AnyComponentWithIdentity( id: "settings", @@ -168,6 +233,65 @@ private final class BrowserScreenComponent: CombinedComponent { ) ) ] + + if isTablet { + navigationRightItems.insert( + AnyComponentWithIdentity( + id: "bookmarks", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Instant View/Bookmark", + tintColor: environment.theme.rootController.navigationBar.accentTextColor + ) + ), + action: { + performAction.invoke(.openBookmarks) + } + ) + ) + ), + at: 0 + ) + navigationRightItems.insert( + AnyComponentWithIdentity( + id: "share", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Chat List/NavigationShare", + tintColor: environment.theme.rootController.navigationBar.accentTextColor + ) + ), + action: { + performAction.invoke(.share) + } + ) + ) + ), + at: 0 + ) + navigationRightItems.append( + AnyComponentWithIdentity( + id: "openIn", + component: AnyComponent( + Button( + content: AnyComponent( + BundleIconComponent( + name: "Instant View/Browser", + tintColor: environment.theme.rootController.navigationBar.accentTextColor + ) + ), + action: { + performAction.invoke(.openIn) + } + ) + ) + ) + ) + } } } @@ -183,6 +307,7 @@ private final class BrowserScreenComponent: CombinedComponent { topInset: environment.statusBarHeight, height: environment.navigationHeight - environment.statusBarHeight, sideInset: environment.safeInsets.left, + metrics: environment.metrics, leftItems: navigationLeftItems, rightItems: navigationRightItems, centerItem: navigationContent, @@ -238,22 +363,36 @@ private final class BrowserScreenComponent: CombinedComponent { toolbarBottomInset = environment.safeInsets.bottom } - let toolbar = toolbar.update( - component: BrowserToolbarComponent( - backgroundColor: environment.theme.rootController.navigationBar.blurredBackgroundColor, - separatorColor: environment.theme.rootController.navigationBar.separatorColor, - textColor: environment.theme.rootController.navigationBar.primaryTextColor, - bottomInset: toolbarBottomInset, - sideInset: environment.safeInsets.left, - item: toolbarContent, - collapseFraction: collapseFraction - ), - availableSize: context.availableSize, - transition: context.transition - ) - context.add(toolbar - .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height - toolbar.size.height / 2.0)) - ) + var toolbarSize: CGFloat = 0.0 + if isTablet && !context.component.presentationState.isSearching { + + } else { + let toolbar = toolbar.update( + component: BrowserToolbarComponent( + backgroundColor: environment.theme.rootController.navigationBar.blurredBackgroundColor, + separatorColor: environment.theme.rootController.navigationBar.separatorColor, + textColor: environment.theme.rootController.navigationBar.primaryTextColor, + bottomInset: toolbarBottomInset, + sideInset: environment.safeInsets.left, + item: toolbarContent, + collapseFraction: collapseFraction + ), + availableSize: context.availableSize, + transition: context.transition + ) + context.add(toolbar + .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height - toolbar.size.height / 2.0)) + .appear(ComponentTransition.Appear { _, view, transition in + transition.animatePosition(view: view, from: CGPoint(x: 0.0, y: view.frame.height), to: CGPoint(), additive: true) + }) + .disappear(ComponentTransition.Disappear { view, transition, completion in + transition.animatePosition(view: view, from: CGPoint(), to: CGPoint(x: 0.0, y: view.frame.height), additive: true, completion: { _ in + completion() + }) + }) + ) + toolbarSize = toolbar.size.height + } if context.component.presentationState.addressFocused { let addressList = addressList.update( @@ -266,7 +405,7 @@ private final class BrowserScreenComponent: CombinedComponent { performAction.invoke(.navigateTo(url)) } ), - availableSize: CGSize(width: context.availableSize.width, height: context.availableSize.height - navigationBar.size.height - toolbar.size.height), + availableSize: CGSize(width: context.availableSize.width, height: context.availableSize.height - navigationBar.size.height - toolbarSize), transition: context.transition ) context.add(addressList @@ -1241,7 +1380,11 @@ public class BrowserScreen: ViewController, MinimizableController { super.containerLayoutUpdated(layout, transition: transition) - self.node.containerLayoutUpdated(layout: layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.height, transition: ComponentTransition(transition)) + var navigationHeight = self.navigationLayout(layout: layout).navigationFrame.height + if layout.metrics.isTablet, layout.size.width > layout.size.height { + navigationHeight += 6.0 + } + self.node.containerLayoutUpdated(layout: layout, navigationBarHeight: navigationHeight, transition: ComponentTransition(transition)) } public func requestMinimize(topEdgeOffset: CGFloat?, initialVelocity: CGFloat?) { @@ -1249,6 +1392,15 @@ public class BrowserScreen: ViewController, MinimizableController { self.node.minimize(topEdgeOffset: topEdgeOffset, damping: 180.0, initialVelocity: initialVelocity) } + private var didPlayAppearanceAnimation = false + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + if !self.didPlayAppearanceAnimation, let layout = self.validLayout, layout.metrics.isTablet { + self.node.layer.animatePosition(from: CGPoint(x: 0.0, y: layout.size.height), to: .zero, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + } + } + public override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) diff --git a/submodules/BrowserUI/Sources/BrowserWebContent.swift b/submodules/BrowserUI/Sources/BrowserWebContent.swift index 6844c5929c..67b9bfa514 100644 --- a/submodules/BrowserUI/Sources/BrowserWebContent.swift +++ b/submodules/BrowserUI/Sources/BrowserWebContent.swift @@ -465,7 +465,7 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU self.webView.scrollView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: fullInsets.bottom, right: 0.0) self.webView.customBottomInset = max(insets.bottom, safeInsets.bottom) -// self.webView.scrollView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 34.0, right: 0.0) + self.webView.scrollView.scrollIndicatorInsets = UIEdgeInsets(top: 0.0, left: -insets.left, bottom: 0.0, right: -insets.right) self.webView.scrollView.horizontalScrollIndicatorInsets = UIEdgeInsets(top: 0.0, left: -insets.left, bottom: 0.0, right: -insets.right) @@ -589,7 +589,9 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU private var ignoreUpdatesUntilScrollingStopped = false func resetScrolling() { self.updateScrollingOffset(isReset: true, transition: .spring(duration: 0.4)) - self.ignoreUpdatesUntilScrollingStopped = true + if self.webView.scrollView.isDecelerating { + self.ignoreUpdatesUntilScrollingStopped = true + } } @available(iOS 13.0, *) diff --git a/submodules/StatisticsUI/Sources/ChannelStatsController.swift b/submodules/StatisticsUI/Sources/ChannelStatsController.swift index a294b33a05..13650ccf00 100644 --- a/submodules/StatisticsUI/Sources/ChannelStatsController.swift +++ b/submodules/StatisticsUI/Sources/ChannelStatsController.swift @@ -2049,6 +2049,7 @@ public func channelStatsController(context: AccountContext, updatedPresentationD let peer = Promise() peer.set(context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId))) + let canViewStatsValue = Atomic(value: true) let peerData = context.engine.data.get( TelegramEngine.EngineData.Item.Peer.CanViewStats(id: peerId), TelegramEngine.EngineData.Item.Peer.AdsRestricted(id: peerId), @@ -2081,6 +2082,8 @@ public func channelStatsController(context: AccountContext, updatedPresentationD |> map { presentationData, state, peer, data, messageView, stories, boostData, boostersState, giftsState, revenueState, revenueTransactions, starsState, starsTransactions, peerData, longLoading -> (ItemListControllerState, (ItemListNodeState, Any)) in let (canViewStats, adsRestricted, canViewRevenue, canViewStarsRevenue) = peerData + let _ = canViewStatsValue.swap(canViewStats) + var isGroup = false if let peer, case let .channel(channel) = peer, case .group = channel.info { isGroup = true @@ -2157,9 +2160,17 @@ public func channelStatsController(context: AccountContext, updatedPresentationD case .stats: index = 0 case .boosts: - index = 1 + if canViewStats { + index = 1 + } else { + index = 0 + } case .monetization: - index = 2 + if canViewStats { + index = 2 + } else { + index = 1 + } } var tabs: [String] = [] if canViewStats { @@ -2195,12 +2206,21 @@ public func channelStatsController(context: AccountContext, updatedPresentationD } controller.titleControlValueChanged = { value in updateState { state in + let canViewStats = canViewStatsValue.with { $0 } let section: ChannelStatsSection switch value { case 0: - section = .stats + if canViewStats { + section = .stats + } else { + section = .boosts + } case 1: - section = .boosts + if canViewStats { + section = .boosts + } else { + section = .monetization + } case 2: section = .monetization let _ = (ApplicationSpecificNotice.monetizationIntroDismissed(accountManager: context.sharedContext.accountManager) diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift index 7480b59332..7fe98db357 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/MediaEditor.swift @@ -520,7 +520,7 @@ public final class MediaEditor { self.renderer.consume(main: .texture(texture, time, hasTransparency), additional: additionalTexture.flatMap { .texture($0, time, false) }, render: true, displayEnabled: false) } - private func setupSource() { + private func setupSource(andPlay: Bool) { guard let renderTarget = self.previewView else { return } @@ -830,6 +830,9 @@ public final class MediaEditor { self.setupTimeObservers() Queue.mainQueue().justDispatch { let startPlayback = { + guard andPlay else { + return + } player.playImmediately(atRate: 1.0) // additionalPlayer?.playImmediately(atRate: 1.0) self.audioPlayer?.playImmediately(atRate: 1.0) @@ -941,13 +944,13 @@ public final class MediaEditor { self.audioDelayTimer = nil } - public func attachPreviewView(_ previewView: MediaEditorPreviewView) { + public func attachPreviewView(_ previewView: MediaEditorPreviewView, andPlay: Bool) { self.previewView?.renderer = nil self.previewView = previewView previewView.renderer = self.renderer - self.setupSource() + self.setupSource(andPlay: andPlay) } private var skipRendering = false @@ -1118,8 +1121,9 @@ public final class MediaEditor { self.initialSeekPosition = position return } - self.renderer.setRate(1.0) - if !play { + if play { + self.renderer.setRate(1.0) + } else { self.player?.pause() self.additionalPlayer?.pause() self.audioPlayer?.pause() diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaCoverScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaCoverScreen.swift index db9363e5bb..db1dba00b3 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaCoverScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaCoverScreen.swift @@ -225,7 +225,7 @@ private final class MediaCoverScreenComponent: Component { transition: transition, component: AnyComponent(Button( content: AnyComponent( - MultilineTextComponent(text: .plain(NSAttributedString(string: "Cancel", font: Font.regular(17.0), textColor: .white))) + MultilineTextComponent(text: .plain(NSAttributedString(string: environment.strings.Common_Cancel, font: Font.regular(17.0), textColor: .white))) ), action: { [weak controller] in controller?.requestDismiss(animated: true) @@ -546,6 +546,7 @@ final class MediaCoverScreen: ViewController { fileprivate let mediaEditor: Signal fileprivate let previewView: MediaEditorPreviewView fileprivate let portalView: PortalView + fileprivate let exclusive: Bool func withMediaEditor(_ f: @escaping (MediaEditor) -> Void) { let _ = (self.mediaEditor @@ -564,12 +565,14 @@ final class MediaCoverScreen: ViewController { context: AccountContext, mediaEditor: Signal, previewView: MediaEditorPreviewView, - portalView: PortalView + portalView: PortalView, + exclusive: Bool ) { self.context = context self.mediaEditor = mediaEditor self.previewView = previewView self.portalView = portalView + self.exclusive = exclusive super.init(navigationBarPresentationData: nil) self.navigationPresentation = .flatModal @@ -601,7 +604,9 @@ final class MediaCoverScreen: ViewController { self.dismissed() self.node.animateOutToEditor(completion: { - self.dismiss() + if !self.exclusive { + self.dismiss() + } }) } diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index 4f2cf97358..41c0d95ca2 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -2810,7 +2810,9 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate }) if controller.isEditingStoryCover { - self.openCoverSelection(immediate: true) + Queue.mainQueue().justDispatch { + self.openCoverSelection(exclusive: true) + } } } @@ -2985,7 +2987,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate } self.controller?.stickerRecommendedEmoji = emojiForClasses(classes.map { $0.0 }) } - mediaEditor.attachPreviewView(self.previewView) + mediaEditor.attachPreviewView(self.previewView, andPlay: !(self.controller?.isEditingStoryCover ?? false)) if case .empty = effectiveSubject { self.stickerMaskDrawingView?.emptyColor = .black @@ -4705,7 +4707,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate } } - func openCoverSelection(immediate: Bool) { + func openCoverSelection(exclusive: Bool) { guard let portalView = PortalView(matchPosition: false) else { return } @@ -4722,12 +4724,17 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate context: self.context, mediaEditor: self.mediaEditorPromise.get(), previewView: self.previewView, - portalView: portalView + portalView: portalView, + exclusive: exclusive ) coverController.dismissed = { [weak self] in if let self { - self.animateInFromTool() - self.requestCompletion(playHaptic: false) + if exclusive { + self.controller?.requestDismiss(saveDraft: false, animated: true) + } else { + self.animateInFromTool() + self.requestCompletion(playHaptic: false) + } } } coverController.completed = { [weak self] position, image in @@ -4738,7 +4745,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate self.controller?.present(coverController, in: .current) self.coverScreen = coverController - if immediate { + if exclusive { self.isDisplayingTool = .cover self.requestUpdate(transition: .immediate) } else { @@ -5227,7 +5234,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate self.controller?.present(controller, in: .window(.root)) self.animateOutToTool(tool: .tools) case .cover: - self.openCoverSelection(immediate: false) + self.openCoverSelection(exclusive: false) } } }, @@ -5924,7 +5931,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate editCoverImpl = { [weak self, weak controller] in if let self { - self.node.openCoverSelection(immediate: false) + self.node.openCoverSelection(exclusive: false) } if let controller { controller.dismiss() diff --git a/submodules/TelegramUI/Resources/WebEmbed/UIWebViewSearch.js b/submodules/TelegramUI/Resources/WebEmbed/UIWebViewSearch.js index abefd029fa..34e5ddd288 100644 --- a/submodules/TelegramUI/Resources/WebEmbed/UIWebViewSearch.js +++ b/submodules/TelegramUI/Resources/WebEmbed/UIWebViewSearch.js @@ -9,9 +9,8 @@ var uiWebview_SearchResultCount = 0; keyword - string to search */ -function isElementVisible(element) { - var style = window.getComputedStyle(element); - return style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0'; +function isElementVisible(e) { + return true } function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) { @@ -24,8 +23,6 @@ function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) { var idx = value.toLowerCase().indexOf(keyword); if (idx < 0) break; - -// if (!isElementVisible(element)) break; count++; elementTmp = document.createTextNode(value.substr(idx+keyword.length)); @@ -93,7 +90,7 @@ function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) { } else if (element.nodeType == 1) { // Element node - if (element.nodeName.toLowerCase() != 'select') { + if (element.nodeName.toLowerCase() != 'select' && isElementVisible(element)) { for (var i=element.childNodes.length-1; i>=0; i--) { uiWebview_HighlightAllOccurencesOfStringForElement(element.childNodes[i],keyword); }