Enable encryption and add support for loading encrypted images.

This commit is contained in:
Stefan Ceriu
2022-04-07 17:07:42 +03:00
parent 8d50d4fd25
commit e20c699298
11 changed files with 79 additions and 25 deletions
@@ -21,21 +21,21 @@ struct MediaProvider: MediaProviderProtocol {
self.processingQueue = DispatchQueue(label: "MediaProviderProcessingQueue", attributes: .concurrent)
}
func imageForURL(_ url: String?) -> UIImage? {
guard let url = url else {
func imageFromSource(_ source: MediaSource?) -> UIImage? {
guard let source = source else {
return nil
}
return imageCache.retrieveImageInMemoryCache(forKey: url, options: nil)
return imageCache.retrieveImageInMemoryCache(forKey: source.underlyingSource.url(), options: nil)
}
func loadImageFromURL(_ url: String, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void) {
if let image = imageForURL(url) {
func loadImageFromSource(_ source: MediaSource, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void) {
if let image = imageFromSource(source) {
completion(.success(image))
return
}
imageCache.retrieveImage(forKey: url) { result in
imageCache.retrieveImage(forKey: source.underlyingSource.url()) { result in
if case let .success(cacheResult) = result,
let image = cacheResult.image {
completion(.success(image))
@@ -44,7 +44,7 @@ struct MediaProvider: MediaProviderProtocol {
processingQueue.async {
do {
let imageData = try client.loadImage(url: url)
let imageData = try client.loadImage(source: source.underlyingSource)
guard let image = UIImage(data: Data(bytes: imageData, count: imageData.count)) else {
MXLog.error("Invalid image data")
@@ -54,7 +54,7 @@ struct MediaProvider: MediaProviderProtocol {
return
}
imageCache.store(image, forKey: url)
imageCache.store(image, forKey: source.underlyingSource.url())
DispatchQueue.main.async {
completion(.success(image))
@@ -68,4 +68,16 @@ struct MediaProvider: MediaProviderProtocol {
}
}
}
func imageFromURL(_ url: String?) -> UIImage? {
guard let url = url else {
return nil
}
return imageFromSource(MediaSource(source: mediaSourceFromUrl(url: url)))
}
func loadImageFromURL(_ url: String, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void) {
return loadImageFromSource(MediaSource(source: mediaSourceFromUrl(url: url)), completion)
}
}
@@ -15,7 +15,11 @@ enum MediaProviderError: Error {
}
protocol MediaProviderProtocol {
func imageForURL(_ url: String?) -> UIImage?
func imageFromSource(_ source: MediaSource?) -> UIImage?
func loadImageFromSource(_ source: MediaSource, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void)
func imageFromURL(_ url: String?) -> UIImage?
func loadImageFromURL(_ url: String, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void)
}
@@ -0,0 +1,28 @@
//
// MediaSource.swift
// ElementX
//
// Created by Stefan Ceriu on 06/04/2022.
// Copyright © 2022 Element. All rights reserved.
//
import Foundation
import MatrixRustSDK
struct MediaSource: Equatable {
let underlyingSource: MatrixRustSDK.MediaSource
init(source: MatrixRustSDK.MediaSource) {
self.underlyingSource = source
}
init(urlString: String) {
self.underlyingSource = mediaSourceFromUrl(url: urlString)
}
// MARK: - Equatable
static func == (lhs: MediaSource, rhs: MediaSource) -> Bool {
return lhs.underlyingSource.url() == rhs.underlyingSource.url()
}
}
@@ -15,7 +15,15 @@ struct MockMediaProvider: MediaProviderProtocol {
}
func imageForURL(_ url: String?) -> UIImage? {
func imageFromSource(_ source: MediaSource?) -> UIImage? {
return nil
}
func loadImageFromSource(_ source: MediaSource, _ completion: @escaping (Result<UIImage, MediaProviderError>) -> Void) {
}
func imageFromURL(_ url: String?) -> UIImage? {
return nil
}