From b397c21adaa490d09eb4606c8d44f03210d12851 Mon Sep 17 00:00:00 2001 From: Nora Trapp Date: Wed, 30 Mar 2022 12:41:57 -0700 Subject: [PATCH] Don't playback undownloaded stories --- .../StoryContextViewController.swift | 8 +++++--- .../Context View/StoryItemMediaView.swift | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryContextViewController.swift b/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryContextViewController.swift index 1c5d7b82b1..a6127d701f 100644 --- a/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryContextViewController.swift +++ b/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryContextViewController.swift @@ -293,15 +293,17 @@ class StoryContextViewController: OWSViewController { AssertIsOnMainThread() playbackProgressView.numberOfItems = items.count if let currentItemView = currentItemMediaView, let idx = items.firstIndex(of: currentItemView.item) { - // When we present a story, mark it as viewed if it's not already. - if !currentItemView.isDownloading, currentItemView.item.message.localUserViewedTimestamp == nil { + // When we present a story, mark it as viewed if it's not already, as long as it's downloaded. + if !currentItemView.isPendingDownload, currentItemView.item.message.localUserViewedTimestamp == nil { databaseStorage.write { transaction in currentItemView.item.message.markAsViewed(at: Date.ows_millisecondTimestamp(), circumstance: .onThisDevice, transaction: transaction) } } currentItemView.updateTimestampText() - if currentItemView.isDownloading { + + if currentItemView.isPendingDownload { + // Don't progress stories that are pending download. lastTransitionTime = CACurrentMediaTime() playbackProgressView.itemState = .init(index: idx, value: 0) } else if let lastTransitionTime = lastTransitionTime { diff --git a/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryItemMediaView.swift b/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryItemMediaView.swift index 9a67fb2168..f57d8c8bd7 100644 --- a/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryItemMediaView.swift +++ b/Signal/src/ViewControllers/HomeView/Stories/Context View/StoryItemMediaView.swift @@ -76,7 +76,7 @@ class StoryItemMediaView: UIView { } func willHandleTapGesture(_ gesture: UITapGestureRecognizer) -> Bool { - if startAttachmentDownloadIfNecessary() { return true } + if startAttachmentDownloadIfNecessary(gesture) { return true } if let textAttachmentView = mediaView as? TextAttachmentView { return textAttachmentView.willHandleTapGesture(gesture) @@ -85,8 +85,16 @@ class StoryItemMediaView: UIView { return false } - private func startAttachmentDownloadIfNecessary() -> Bool { + private func startAttachmentDownloadIfNecessary(_ gesture: UITapGestureRecognizer) -> Bool { guard case .pointer(let pointer) = item.attachment, ![.enqueued, .downloading].contains(pointer.state) else { return false } + + // Only start downloads when the user taps in the center of the view. + let downloadHitRegion = CGRect( + origin: CGPoint(x: frame.center.x - 30, y: frame.center.y - 30), + size: CGSize(square: 60) + ) + guard downloadHitRegion.contains(gesture.location(in: self)) else { return false } + attachmentDownloads.enqueueDownloadOfAttachments( forStoryMessageId: item.message.uniqueId, attachmentGroup: .allAttachmentsIncoming, @@ -98,12 +106,13 @@ class StoryItemMediaView: UIView { Logger.warn("Failed to redownload attachment with error: \(error)") DispatchQueue.main.async { self?.updateMediaView() } } + return true } - var isDownloading: Bool { - guard case .pointer(let pointer) = item.attachment else { return false } - return [.enqueued, .downloading].contains(pointer.state) + var isPendingDownload: Bool { + guard case .pointer = item.attachment else { return false } + return true } var duration: CFTimeInterval {