mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-25 01:01:21 +01:00
Merge pull request #3562 from stuartbreckenridge/ios-candidate
Updates widget code
This commit is contained in:
commit
d90047725c
@ -23,13 +23,19 @@ public final class WidgetDataEncoder {
|
|||||||
private var backgroundTaskID: UIBackgroundTaskIdentifier!
|
private var backgroundTaskID: UIBackgroundTaskIdentifier!
|
||||||
private lazy var appGroup = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as! String
|
private lazy var appGroup = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as! String
|
||||||
private lazy var containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroup)
|
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")
|
private lazy var dataURL = containerURL?.appendingPathComponent("widget-data.json")
|
||||||
|
|
||||||
static let shared = WidgetDataEncoder()
|
static let shared = WidgetDataEncoder()
|
||||||
private init () {}
|
private init () {
|
||||||
|
if imageContainer != nil {
|
||||||
|
try? FileManager.default.createDirectory(at: imageContainer!, withIntermediateDirectories: true, attributes: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@available(iOS 14, *)
|
@available(iOS 14, *)
|
||||||
func encodeWidgetData() throws {
|
func encodeWidgetData() throws {
|
||||||
|
flushSharedContainer()
|
||||||
os_log(.debug, log: log, "Starting encoding widget data.")
|
os_log(.debug, log: log, "Starting encoding widget data.")
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -46,7 +52,7 @@ public final class WidgetDataEncoder {
|
|||||||
feedTitle: article.sortableName,
|
feedTitle: article.sortableName,
|
||||||
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
||||||
articleSummary: article.summary,
|
articleSummary: article.summary,
|
||||||
feedIcon: article.iconImage()?.image.dataRepresentation(),
|
feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()),
|
||||||
pubDate: article.datePublished?.description ?? "")
|
pubDate: article.datePublished?.description ?? "")
|
||||||
unread.append(latestArticle)
|
unread.append(latestArticle)
|
||||||
}
|
}
|
||||||
@ -56,7 +62,7 @@ public final class WidgetDataEncoder {
|
|||||||
feedTitle: article.sortableName,
|
feedTitle: article.sortableName,
|
||||||
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
||||||
articleSummary: article.summary,
|
articleSummary: article.summary,
|
||||||
feedIcon: article.iconImage()?.image.dataRepresentation(),
|
feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()),
|
||||||
pubDate: article.datePublished?.description ?? "")
|
pubDate: article.datePublished?.description ?? "")
|
||||||
starred.append(latestArticle)
|
starred.append(latestArticle)
|
||||||
}
|
}
|
||||||
@ -66,7 +72,7 @@ public final class WidgetDataEncoder {
|
|||||||
feedTitle: article.sortableName,
|
feedTitle: article.sortableName,
|
||||||
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article),
|
||||||
articleSummary: article.summary,
|
articleSummary: article.summary,
|
||||||
feedIcon: article.iconImage()?.image.dataRepresentation(),
|
feedIconPath: writeImageDataToSharedContainer(article.iconImage()?.image.dataRepresentation()),
|
||||||
pubDate: article.datePublished?.description ?? "")
|
pubDate: article.datePublished?.description ?? "")
|
||||||
today.append(latestArticle)
|
today.append(latestArticle)
|
||||||
}
|
}
|
||||||
@ -113,5 +119,28 @@ public final class WidgetDataEncoder {
|
|||||||
FileManager.default.fileExists(atPath: dataURL!.path)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user