session-ios/Session/Media Viewing & Editing/Transitions/MediaPresentationContext.swift

54 lines
2.1 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
enum Media {
case gallery(MediaGalleryViewModel.Item)
case image(UIImage)
var image: UIImage? {
switch self {
case let .gallery(item):
// For videos attempt to load a large thumbnail, for other items just try to load
// the source file directly
guard !item.isVideo else { return item.attachment.existingThumbnail(size: .large) }
guard let originalFilePath: String = item.attachment.originalFilePath else { return nil }
return UIImage(contentsOfFile: originalFilePath)
case let .image(image): return image
}
}
}
struct MediaPresentationContext {
let mediaView: UIView
let presentationFrame: CGRect
let cornerRadius: CGFloat
let cornerMask: CACornerMask
}
// There are two kinds of AnimationControllers that interact with the media detail view. Both
// appear to transition the media view from one VC to it's corresponding location in the
// destination VC.
//
// MediaPresentationContextProvider is either a target or destination VC which can provide the
// details necessary to facilite this animation.
//
// First, the MediaZoomAnimationController is non-interactive. We use it whenever we're going to
// show the Media detail pager.
//
// We can get there several ways:
// From conversation settings, this can be a push or a pop from the tileView.
// From conversationView/MessageDetails this can be a modal present or a pop from the tile view.
//
// The other animation controller, the MediaDismissAnimationController is used when we're going to
// stop showing the media pager. This can be a pop to the tile view, or a modal dismiss.
protocol MediaPresentationContextProvider {
func mediaPresentationContext(mediaItem: Media, in coordinateSpace: UICoordinateSpace) -> MediaPresentationContext?
// The transitionView will be presented below this view.
// If nil, the transitionView will be presented above all
func snapshotOverlayView(in coordinateSpace: UICoordinateSpace) -> (UIView, CGRect)?
}