// // WidgetDataEncoder.swift // NetNewsWire // // Created by Stuart Breckenridge on 18/11/20. // Copyright © 2020 Ranchero Software. All rights reserved. // import Foundation import WidgetKit import os.log import UIKit import Articles import Account public final class WidgetDataEncoder { private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application") private let fetchLimit = 7 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 dataURL = containerURL?.appendingPathComponent("widget-data.json") static let shared = WidgetDataEncoder() private init () {} func encodeWidgetData() throws { os_log(.debug, log: log, "Starting encoding widget data.") // do { // let unreadArticles = Array(try AccountManager.shared.fetchArticles(fetchType: .unread(fetchLimit))).sortedByDate(.orderedDescending) // let starredArticles = Array(try AccountManager.shared.fetchArticles(fetchType: .starred(fetchLimit))).sortedByDate(.orderedDescending) // let todayArticles = Array(try AccountManager.shared.fetchArticles(fetchType: .today(fetchLimit))).sortedByDate(.orderedDescending) // // var unread = [LatestArticle]() // var today = [LatestArticle]() // var starred = [LatestArticle]() // // for article in unreadArticles { // let latestArticle = LatestArticle(id: article.sortableArticleID, // feedTitle: article.sortableName, // articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), // articleSummary: article.summary, // feedIcon: article.iconImage()?.image.dataRepresentation(), // pubDate: article.datePublished?.description ?? "") // unread.append(latestArticle) // } // // for article in starredArticles { // let latestArticle = LatestArticle(id: article.sortableArticleID, // feedTitle: article.sortableName, // articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), // articleSummary: article.summary, // feedIcon: article.iconImage()?.image.dataRepresentation(), // pubDate: article.datePublished?.description ?? "") // starred.append(latestArticle) // } // // for article in todayArticles { // let latestArticle = LatestArticle(id: article.sortableArticleID, // feedTitle: article.sortableName, // articleTitle: ArticleStringFormatter.truncatedTitle(article).isEmpty ? ArticleStringFormatter.truncatedSummary(article) : ArticleStringFormatter.truncatedTitle(article), // articleSummary: article.summary, // feedIcon: article.iconImage()?.image.dataRepresentation(), // pubDate: article.datePublished?.description ?? "") // today.append(latestArticle) // } // // let latestData = WidgetData(currentUnreadCount: SmartFeedsController.shared.unreadFeed.unreadCount, // currentTodayCount: SmartFeedsController.shared.todayFeed.unreadCount, // currentStarredCount: try! SmartFeedsController.shared.starredFeed.fetchArticles().count, // unreadArticles: unread, // starredArticles: starred, // todayArticles:today, // lastUpdateTime: Date()) // // // DispatchQueue.global().async { [weak self] in // guard let self = self else { return } // // self.backgroundTaskID = UIApplication.shared.beginBackgroundTask (withName: "com.ranchero.NetNewsWire.Encode") { // UIApplication.shared.endBackgroundTask(self.backgroundTaskID!) // self.backgroundTaskID = .invalid // } // let encodedData = try? JSONEncoder().encode(latestData) // // os_log(.debug, log: self.log, "Finished encoding widget data.") // // if self.fileExists() { // try? FileManager.default.removeItem(at: self.dataURL!) // os_log(.debug, log: self.log, "Removed widget data from container.") // } // if FileManager.default.createFile(atPath: self.dataURL!.path, contents: encodedData, attributes: nil) { // os_log(.debug, log: self.log, "Wrote widget data to container.") // WidgetCenter.shared.reloadAllTimelines() // UIApplication.shared.endBackgroundTask(self.backgroundTaskID!) // self.backgroundTaskID = .invalid // } else { // UIApplication.shared.endBackgroundTask(self.backgroundTaskID!) // self.backgroundTaskID = .invalid // } // // } // } } private func fileExists() -> Bool { FileManager.default.fileExists(atPath: dataURL!.path) } }