From 66a5e42e8ad74dca7ac4ffaf09d30469b9724bc5 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Mon, 16 May 2022 09:32:38 +0800 Subject: [PATCH] Updates widget code --- Shared/Widget/WidgetDataEncoder.swift | 37 ++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/Shared/Widget/WidgetDataEncoder.swift b/Shared/Widget/WidgetDataEncoder.swift index db830eb8d..3462892e4 100644 --- a/Shared/Widget/WidgetDataEncoder.swift +++ b/Shared/Widget/WidgetDataEncoder.swift @@ -23,13 +23,19 @@ public final class WidgetDataEncoder { private var backgroundTaskID: UIBackgroundTaskIdentifier! private lazy var appGroup = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as! String private lazy var containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup) + private lazy var imageContainer = containerURL?.appendingPathComponent("widgetImages", isDirectory: true) private lazy var dataURL = containerURL?.appendingPathComponent("widget-data.json") static let shared = WidgetDataEncoder() - private init () {} + private init () { + if imageContainer != nil { + try? FileManager.default.createDirectory(at: imageContainer!, withIntermediateDirectories: true, attributes: nil) + } + } @available(iOS 14, *) func encodeWidgetData() throws { + flushSharedContainer() os_log(.debug, log: log, "Starting encoding widget data.") do { @@ -46,7 +52,7 @@ public final class WidgetDataEncoder { feedTitle: article.sortableName, articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), articleSummary: article.summary, - feedIcon: article.iconImage()?.image.dataRepresentation(), + feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()), pubDate: article.datePublished?.description ?? "") unread.append(latestArticle) } @@ -56,7 +62,7 @@ public final class WidgetDataEncoder { feedTitle: article.sortableName, articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), articleSummary: article.summary, - feedIcon: article.iconImage()?.image.dataRepresentation(), + feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()), pubDate: article.datePublished?.description ?? "") starred.append(latestArticle) } @@ -66,7 +72,7 @@ public final class WidgetDataEncoder { feedTitle: article.sortableName, articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), articleSummary: article.summary, - feedIcon: article.iconImage()?.image.dataRepresentation(), + feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()), pubDate: article.datePublished?.description ?? "") today.append(latestArticle) } @@ -113,5 +119,28 @@ public final class WidgetDataEncoder { FileManager.default.fileExists(atPath: dataURL!.path) } + private func writeImageDataToSharedContainer(_ imageData: Data?) -> String? { + if imageData == nil { return nil } + // Each image gets a UUID + let uuid = UUID().uuidString + if let imagePath = imageContainer?.appendingPathComponent(uuid, isDirectory: false) { + do { + try imageData!.write(to: imagePath) + return imagePath.path + } catch { + return nil + } + } + + return nil + } + + private func flushSharedContainer() { + if let imageContainer = imageContainer { + try? FileManager.default.removeItem(atPath: imageContainer.path) + try? FileManager.default.createDirectory(at: imageContainer, withIntermediateDirectories: true, attributes: nil) + } + } + }