Ads and codes improvements

This commit is contained in:
Ilya Laktyushin 2024-09-20 18:35:17 +04:00
parent 987befccc4
commit 87b2d223f8
9 changed files with 41 additions and 11 deletions

View File

@ -12939,3 +12939,5 @@ Sorry for the inconvenience.";
"Notification.StarsGiveaway.Subtitle" = "You won a prize in a giveaway organized by **%1$@**.\n\nYour prize is **%2$@**."; "Notification.StarsGiveaway.Subtitle" = "You won a prize in a giveaway organized by **%1$@**.\n\nYour prize is **%2$@**.";
"Notification.StarsGiveaway.Subtitle.Stars_1" = "%@ Star"; "Notification.StarsGiveaway.Subtitle.Stars_1" = "%@ Star";
"Notification.StarsGiveaway.Subtitle.Stars_any" = "%@ Stars"; "Notification.StarsGiveaway.Subtitle.Stars_any" = "%@ Stars";
"VerificationCodes.DescriptionText" = "This chat is used to receive verification codes from third-party services.";

View File

@ -576,7 +576,7 @@ private enum RevealOptionKey: Int32 {
} }
private func canArchivePeer(id: EnginePeer.Id, accountPeerId: EnginePeer.Id) -> Bool { private func canArchivePeer(id: EnginePeer.Id, accountPeerId: EnginePeer.Id) -> Bool {
if id.namespace == Namespaces.Peer.CloudUser && id.id._internalGetInt64Value() == 777000 { if id.isTelegramNotifications {
return false return false
} }
if id == accountPeerId { if id == accountPeerId {
@ -913,7 +913,7 @@ private final class ChatListMediaPreviewNode: ASDisplayNode {
} }
} }
private let loginCodeRegex = try? NSRegularExpression(pattern: "[\\d\\-]{5,7}", options: []) private let loginCodeRegex = try? NSRegularExpression(pattern: "\\b\\d{5,8}\\b", options: [])
public class ChatListItemNode: ItemListRevealOptionsItemNode { public class ChatListItemNode: ItemListRevealOptionsItemNode {
final class TopicItemNode: ASDisplayNode { final class TopicItemNode: ASDisplayNode {
@ -2371,7 +2371,7 @@ public class ChatListItemNode: ItemListRevealOptionsItemNode {
} }
} }
if message.id.peerId.namespace == Namespaces.Peer.CloudUser && message.id.peerId.id._internalGetInt64Value() == 777000 { if message.id.peerId.isTelegramNotifications || message.id.peerId.isVerificationCodes {
if let cached = currentCustomTextEntities, cached.matches(text: message.text) { if let cached = currentCustomTextEntities, cached.matches(text: message.text) {
customTextEntities = cached customTextEntities = cached
} else if let matches = loginCodeRegex?.matches(in: message.text, options: [], range: NSMakeRange(0, (message.text as NSString).length)) { } else if let matches = loginCodeRegex?.matches(in: message.text, options: [], range: NSMakeRange(0, (message.text as NSString).length)) {

View File

@ -54,7 +54,7 @@ public final class DeviceLocationManager: NSObject {
self.manager.delegate = self self.manager.delegate = self
self.manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters self.manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
// self.manager.distanceFilter = 5.0 self.manager.distanceFilter = kCLDistanceFilterNone
self.manager.activityType = .other self.manager.activityType = .other
self.manager.pausesLocationUpdatesAutomatically = false self.manager.pausesLocationUpdatesAutomatically = false
self.manager.headingFilter = 2.0 self.manager.headingFilter = 2.0

View File

@ -231,6 +231,16 @@ private func layoutMetricsForScreenSize(size: CGSize, orientation: UIInterfaceOr
} }
public final class WindowKeyboardGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate { public final class WindowKeyboardGestureRecognizerDelegate: NSObject, UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let view = gestureRecognizer.view {
let location = touch.location(in: gestureRecognizer.view)
if location.y > view.bounds.height - 44.0 {
return false
}
}
return true
}
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true return true
} }
@ -1299,7 +1309,7 @@ public class Window1 {
} }
} }
@objc func panGesture(_ recognizer: UIPanGestureRecognizer) { @objc func panGesture(_ recognizer: WindowPanRecognizer) {
switch recognizer.state { switch recognizer.state {
case .began: case .began:
self.panGestureBegan(location: recognizer.location(in: recognizer.view)) self.panGestureBegan(location: recognizer.location(in: recognizer.view))

View File

@ -7,6 +7,7 @@ public final class WindowPanRecognizer: UIGestureRecognizer {
public var ended: ((CGPoint, CGPoint?) -> Void)? public var ended: ((CGPoint, CGPoint?) -> Void)?
private var previousPoints: [(CGPoint, Double)] = [] private var previousPoints: [(CGPoint, Double)] = []
private var previousVelocity: CGFloat = 0.0
override public func reset() { override public func reset() {
super.reset() super.reset()
@ -45,6 +46,11 @@ public final class WindowPanRecognizer: UIGestureRecognizer {
} }
} }
func velocity(in view: UIView?) -> CGPoint {
let point = CGPoint(x: 0.0, y: self.previousVelocity)
return self.view?.convert(point, to: view) ?? .zero
}
override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event) super.touchesBegan(touches, with: event)
@ -68,9 +74,12 @@ public final class WindowPanRecognizer: UIGestureRecognizer {
override public func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { override public func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event) super.touchesEnded(touches, with: event)
self.state = .ended
if let touch = touches.first { if let touch = touches.first {
let location = touch.location(in: self.view) let location = touch.location(in: self.view)
self.addPoint(location) self.addPoint(location)
self.previousVelocity = self.estimateVerticalVelocity()
self.ended?(location, CGPoint(x: 0.0, y: self.estimateVerticalVelocity())) self.ended?(location, CGPoint(x: 0.0, y: self.estimateVerticalVelocity()))
} }
} }
@ -78,6 +87,8 @@ public final class WindowPanRecognizer: UIGestureRecognizer {
override public func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) { override public func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesCancelled(touches, with: event) super.touchesCancelled(touches, with: event)
self.state = .cancelled
if let touch = touches.first { if let touch = touches.first {
self.ended?(touch.location(in: self.view), nil) self.ended?(touch.location(in: self.view), nil)
} }

View File

@ -221,6 +221,8 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode {
} }
} }
let isAd = message.adAttribute != nil
var isReplyThread = false var isReplyThread = false
if case .replyThread = chatLocation { if case .replyThread = chatLocation {
isReplyThread = true isReplyThread = true
@ -352,7 +354,7 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode {
contentFileValue = file contentFileValue = file
} }
if shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: file) { if shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: file, isAd: isAd) {
contentMediaAutomaticDownload = .full contentMediaAutomaticDownload = .full
} else if shouldPredownloadMedia(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, media: file) { } else if shouldPredownloadMedia(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, media: file) {
contentMediaAutomaticDownload = .prefetch contentMediaAutomaticDownload = .prefetch
@ -404,7 +406,7 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode {
} else { } else {
let contentMode: InteractiveMediaNodeContentMode = contentMediaAspectFilled ? .aspectFill : .aspectFit let contentMode: InteractiveMediaNodeContentMode = contentMediaAspectFilled ? .aspectFill : .aspectFit
let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: contentMediaValue) let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: contentMediaValue, isAd: isAd)
let (_, initialImageWidth, refineLayout) = makeContentMedia( let (_, initialImageWidth, refineLayout) = makeContentMedia(
context, context,
@ -435,7 +437,7 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode {
let contentFileContinueLayout: ChatMessageInteractiveFileNode.ContinueLayout? let contentFileContinueLayout: ChatMessageInteractiveFileNode.ContinueLayout?
if let contentFileValue { if let contentFileValue {
let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: contentFileValue) let automaticDownload = shouldDownloadMediaAutomatically(settings: automaticDownloadSettings, peerType: associatedData.automaticDownloadPeerType, networkType: associatedData.automaticDownloadNetworkType, authorPeerId: message.author?.id, contactsPeerIds: associatedData.contactsPeerIds, media: contentFileValue, isAd: isAd)
let (_, refineLayout) = makeContentFile(ChatMessageInteractiveFileNode.Arguments( let (_, refineLayout) = makeContentFile(ChatMessageInteractiveFileNode.Arguments(
context: context, context: context,

View File

@ -7786,10 +7786,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return false return false
} }
}) })
} else if peerId.namespace == Namespaces.Peer.CloudUser && peerId.id._internalGetInt64Value() == 777000 { } else if peerId.isTelegramNotifications {
self.screenCaptureManager = ScreenCaptureDetectionManager(check: { [weak self] in self.screenCaptureManager = ScreenCaptureDetectionManager(check: { [weak self] in
if let strongSelf = self, strongSelf.traceVisibility() { if let strongSelf = self, strongSelf.traceVisibility() {
let loginCodeRegex = try? NSRegularExpression(pattern: "[\\d\\-]{5,7}", options: []) let loginCodeRegex = try? NSRegularExpression(pattern: "\\b\\d{5,7}\\b", options: [])
var loginCodesToInvalidate: [String] = [] var loginCodesToInvalidate: [String] = []
strongSelf.chatDisplayNode.historyNode.forEachVisibleMessageItemNode({ itemNode in strongSelf.chatDisplayNode.historyNode.forEachVisibleMessageItemNode({ itemNode in
if let text = itemNode.item?.message.text, let matches = loginCodeRegex?.matches(in: text, options: [], range: NSMakeRange(0, (text as NSString).length)), let match = matches.first { if let text = itemNode.item?.message.text, let matches = loginCodeRegex?.matches(in: text, options: [], range: NSMakeRange(0, (text as NSString).length)), let match = matches.first {

View File

@ -446,6 +446,8 @@ func chatHistoryEntriesForView(
} }
if case let .peer(peerId) = location, peerId.isReplies { if case let .peer(peerId) = location, peerId.isReplies {
entries.insert(.ChatInfoEntry("", presentationData.strings.RepliesChat_DescriptionText, nil, nil, presentationData), at: 0) entries.insert(.ChatInfoEntry("", presentationData.strings.RepliesChat_DescriptionText, nil, nil, presentationData), at: 0)
} else if case let .peer(peerId) = location, peerId.isVerificationCodes {
entries.insert(.ChatInfoEntry("", presentationData.strings.VerificationCodes_DescriptionText, nil, nil, presentationData), at: 0)
} else if let cachedPeerData = cachedPeerData as? CachedUserData, let botInfo = cachedPeerData.botInfo, !botInfo.description.isEmpty { } else if let cachedPeerData = cachedPeerData as? CachedUserData, let botInfo = cachedPeerData.botInfo, !botInfo.description.isEmpty {
entries.insert(.ChatInfoEntry(presentationData.strings.Bot_DescriptionTitle, botInfo.description, botInfo.photo, botInfo.video, presentationData), at: 0) entries.insert(.ChatInfoEntry(presentationData.strings.Bot_DescriptionTitle, botInfo.description, botInfo.photo, botInfo.video, presentationData), at: 0)
} else { } else {

View File

@ -564,7 +564,10 @@ public func isAutodownloadEnabledForAnyPeerType(category: MediaAutoDownloadCateg
return category.contacts || category.otherPrivate || category.groups || category.channels return category.contacts || category.otherPrivate || category.groups || category.channels
} }
public func shouldDownloadMediaAutomatically(settings: MediaAutoDownloadSettings, peerType: MediaAutoDownloadPeerType, networkType: MediaAutoDownloadNetworkType, authorPeerId: PeerId? = nil, contactsPeerIds: Set<PeerId> = Set(), media: Media?, isStory: Bool = false) -> Bool { public func shouldDownloadMediaAutomatically(settings: MediaAutoDownloadSettings, peerType: MediaAutoDownloadPeerType, networkType: MediaAutoDownloadNetworkType, authorPeerId: PeerId? = nil, contactsPeerIds: Set<PeerId> = Set(), media: Media?, isStory: Bool = false, isAd: Bool = false) -> Bool {
if isAd {
return true
}
if (networkType == .cellular && !settings.cellular.enabled) || (networkType == .wifi && !settings.wifi.enabled) { if (networkType == .cellular && !settings.cellular.enabled) || (networkType == .wifi && !settings.wifi.enabled) {
return false return false
} }