[AltWidget] Waits until the following day to reload timeline if an error occurs

This commit is contained in:
Riley Testut
2021-10-04 18:41:50 -07:00
parent b4f97aadf1
commit 5997ac5424

View File

@@ -85,6 +85,11 @@ struct Provider: IntentTimelineProvider
func getTimeline(for configuration: ViewAppIntent, in context: Context, completion: @escaping (Timeline<AppEntry>) -> Void) { func getTimeline(for configuration: ViewAppIntent, in context: Context, completion: @escaping (Timeline<AppEntry>) -> Void) {
self.prepare { (result) in self.prepare { (result) in
autoreleasepool { autoreleasepool {
let currentDate = Calendar.current.startOfDay(for: Date())
let nextRefreshDate = Calendar.current.date(byAdding: .day, value: 1, to: currentDate) ?? currentDate.addingTimeInterval(1 * 60 * 60 * 24)
let timeline: Timeline<AppEntry>
do do
{ {
let context = try result.get() let context = try result.get()
@@ -102,46 +107,38 @@ struct Provider: IntentTimelineProvider
installedApp = InstalledApp.fetchAltStore(in: context) installedApp = InstalledApp.fetchAltStore(in: context)
} }
let snapshot = installedApp.map(AppSnapshot.init) guard let snapshot = installedApp.map(AppSnapshot.init) else { throw ALTError(.invalidApp) }
var entries: [AppEntry] = []
// Generate a timeline consisting of one entry per day. // Generate a timeline consisting of one entry per day.
let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate)
if let snapshot = snapshot if numberOfDays >= 0
{ {
let currentDate = Calendar.current.startOfDay(for: Date()) let entries = (0 ..< min(numberOfDays, 7)).compactMap { dayOffset -> AppEntry? in
let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate) guard let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) else { return nil }
let score = Float(dayOffset + 1) / Float(numberOfDays)
let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot)
return entry
}
if numberOfDays >= 0 timeline = Timeline(entries: entries, policy: .atEnd)
{ }
for dayOffset in 0 ..< min(numberOfDays, 7) else
{ {
guard let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) else { continue } let entry = AppEntry(date: Date(), app: snapshot)
timeline = Timeline(entries: [entry], policy: .after(nextRefreshDate))
let score = Float(dayOffset + 1) / Float(numberOfDays)
let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot)
entries.append(entry)
}
}
else
{
let entry = AppEntry(date: Date(), app: snapshot)
entries.append(entry)
}
} }
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
} }
catch catch
{ {
print("Error preparing widget timeline:", error) print("Error preparing widget timeline:", error)
let entry = AppEntry(date: Date(), app: nil) let entry = AppEntry(date: Date(), app: nil)
let timeline = Timeline(entries: [entry], policy: .atEnd) timeline = Timeline(entries: [entry], policy: .after(nextRefreshDate))
completion(timeline)
} }
completion(timeline)
} }
} }
} }