From 7cf53293da2d4c8f980d847a9693e1301ef389b3 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 7 Nov 2018 21:12:28 -0600 Subject: [PATCH] restore Share/Delete functionality to gallery items in the post multi-attachment world --- .../MediaDetailViewController.h | 3 ++- .../MediaDetailViewController.m | 26 ------------------- .../MediaGalleryViewController.swift | 11 ++++++-- .../MediaPageViewController.swift | 18 +++++-------- .../src/Messages/Interactions/TSMessage.m | 7 ----- 5 files changed, 18 insertions(+), 47 deletions(-) diff --git a/Signal/src/ViewControllers/MediaDetailViewController.h b/Signal/src/ViewControllers/MediaDetailViewController.h index 99e883d80..36d770932 100644 --- a/Signal/src/ViewControllers/MediaDetailViewController.h +++ b/Signal/src/ViewControllers/MediaDetailViewController.h @@ -10,6 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @class GalleryItemBox; @class MediaDetailViewController; +@class TSAttachment; typedef NS_OPTIONS(NSInteger, MediaGalleryOption) { MediaGalleryOptionSliderEnabled = 1 << 0, @@ -19,7 +20,7 @@ typedef NS_OPTIONS(NSInteger, MediaGalleryOption) { @protocol MediaDetailViewControllerDelegate - (void)mediaDetailViewController:(MediaDetailViewController *)mediaDetailViewController - requestDeleteConversationViewItem:(id)conversationViewItem; + requestDeleteAttachment:(TSAttachment *)attachment; - (void)mediaDetailViewController:(MediaDetailViewController *)mediaDetailViewController isPlayingVideo:(BOOL)isPlayingVideo; diff --git a/Signal/src/ViewControllers/MediaDetailViewController.m b/Signal/src/ViewControllers/MediaDetailViewController.m index 9d04aa9fb..697a0eefa 100644 --- a/Signal/src/ViewControllers/MediaDetailViewController.m +++ b/Signal/src/ViewControllers/MediaDetailViewController.m @@ -348,32 +348,6 @@ NS_ASSUME_NONNULL_BEGIN } } -- (void)didPressShare:(id)sender -{ - OWSFailDebug(@"TODO: support sharing individual attachment, not viewItem"); - - OWSLogInfo(@"didPressShare"); - if (!self.viewItem) { - OWSFailDebug(@"share should only be available when a viewItem is present"); - return; - } - - [self.viewItem shareMediaAction]; -} - -- (void)didPressDelete:(id)sender -{ - OWSFailDebug(@"TODO: support sharing individual attachment, not viewItem"); - - OWSLogInfo(@"didPressDelete"); - if (!self.viewItem) { - OWSFailDebug(@"delete should only be available when a viewItem is present"); - return; - } - - [self.delegate mediaDetailViewController:self requestDeleteConversationViewItem:self.viewItem]; -} - - (void)didPressPlayBarButton:(id)sender { OWSAssertDebug(self.isVideo); diff --git a/Signal/src/ViewControllers/MediaGalleryViewController.swift b/Signal/src/ViewControllers/MediaGalleryViewController.swift index 09dd3ce7e..ee0b587f4 100644 --- a/Signal/src/ViewControllers/MediaGalleryViewController.swift +++ b/Signal/src/ViewControllers/MediaGalleryViewController.swift @@ -284,7 +284,7 @@ class MediaGallery: NSObject, MediaGalleryDataSource, MediaTileViewControllerDel public func presentDetailView(fromViewController: UIViewController, mediaAttachment: TSAttachment, replacingView: UIView) { var galleryItem: MediaGalleryItem? uiDatabaseConnection.read { transaction in - galleryItem = self.buildGalleryItem(attachment: mediaAttachment, transaction: transaction)! + galleryItem = self.buildGalleryItem(attachment: mediaAttachment, transaction: transaction) } guard let initialDetailItem = galleryItem else { @@ -807,12 +807,19 @@ class MediaGallery: NSObject, MediaGalleryDataSource, MediaTileViewControllerDel deletedGalleryItems.formUnion(items) dataSourceDelegates.forEach { $0.value?.mediaGalleryDataSource(self, willDelete: items, initiatedBy: initiatedBy) } + for item in items { + self.deletedAttachments.insert(item.attachmentStream) + } + self.editingDatabaseConnection.asyncReadWrite { transaction in for item in items { let message = item.message let attachment = item.attachmentStream message.removeAttachment(attachment, transaction: transaction) - self.deletedAttachments.insert(attachment) + if message.attachmentIds.count == 0 { + Logger.debug("removing message after removing last media attachment") + message.remove(with: transaction) + } } } diff --git a/Signal/src/ViewControllers/MediaPageViewController.swift b/Signal/src/ViewControllers/MediaPageViewController.swift index 6e0eb893f..2d92c09b5 100644 --- a/Signal/src/ViewControllers/MediaPageViewController.swift +++ b/Signal/src/ViewControllers/MediaPageViewController.swift @@ -277,7 +277,10 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou owsFailDebug("currentViewController was unexpectedly nil") return } - currentViewController.didPressShare(sender) + + let attachmentStream = currentViewController.galleryItem.attachmentStream + + AttachmentSharing.showShareUI(forAttachment: attachmentStream) } @objc @@ -508,7 +511,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou self.shouldHideToolbars = !self.shouldHideToolbars } - public func mediaDetailViewController(_ mediaDetailViewController: MediaDetailViewController, requestDelete conversationViewItem: ConversationViewItem) { + public func mediaDetailViewController(_ mediaDetailViewController: MediaDetailViewController, requestDelete attachment: TSAttachment) { guard let mediaGalleryDataSource = self.mediaGalleryDataSource else { owsFailDebug("mediaGalleryDataSource was unexpectedly nil") self.presentingViewController?.dismiss(animated: true) @@ -516,15 +519,8 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou return } - guard let message = conversationViewItem.interaction as? TSMessage else { - owsFailDebug("unexpected interaction: \(type(of: conversationViewItem))") - self.presentingViewController?.dismiss(animated: true) - - return - } - - guard let galleryItem = self.mediaGalleryDataSource?.galleryItems.first(where: { $0.message == message }) else { - owsFailDebug("unexpected interaction: \(type(of: conversationViewItem))") + guard let galleryItem = self.mediaGalleryDataSource?.galleryItems.first(where: { $0.attachmentStream == attachment }) else { + owsFailDebug("galleryItem was unexpectedly nil") self.presentingViewController?.dismiss(animated: true) return diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 3289008de..bb67f3699 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -207,8 +207,6 @@ static const NSUInteger OWSMessageSchemaVersion = 4; [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction]; if (attachment) { [attachments addObject:attachment]; - } else { - OWSFailDebug(@"Missing attachment for: %@.", attachmentId); } } return [attachments copy]; @@ -221,9 +219,6 @@ static const NSUInteger OWSMessageSchemaVersion = 4; [self.attachmentIds removeObject:attachment.uniqueId]; - // TODO - Should we delete self if we delete the last attachment? - // Or should that depend on whether message.body == nil - [self saveWithTransaction:transaction]; } @@ -262,8 +257,6 @@ static const NSUInteger OWSMessageSchemaVersion = 4; } TSAttachment *_Nullable attachment = [self attachmentsWithTransaction:transaction].firstObject; - OWSAssertDebug(attachment); - if (![OWSMimeTypeOversizeTextMessage isEqualToString:attachment.contentType] || ![attachment isKindOfClass:TSAttachmentStream.class]) { return nil;