[AltWidget] Fixes not updating when app is near/past expiration

This commit is contained in:
Riley Testut
2021-10-12 12:10:45 -07:00
parent 337d432fdd
commit c2bda2241c

View File

@@ -102,33 +102,43 @@ 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) }
let currentDate = Calendar.current.startOfDay(for: Date())
let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate)
var entries: [AppEntry] = []
// Generate a timeline consisting of one entry per day. // Generate a timeline consisting of one entry per day.
var entries: [AppEntry] = []
if let snapshot = snapshot
switch numberOfDays
{ {
let currentDate = Calendar.current.startOfDay(for: Date()) case ..<0:
let numberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: currentDate) let entry = AppEntry(date: currentDate, relevance: TimelineEntryRelevance(score: 0.0), app: snapshot)
entries.append(entry)
if numberOfDays >= 0 case 0:
{ let entry = AppEntry(date: currentDate, relevance: TimelineEntryRelevance(score: 1.0), app: snapshot)
for dayOffset in 0 ..< min(numberOfDays, 7) entries.append(entry)
{
guard let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) else { continue } default:
// To reduce memory consumption, we only generate entries for the next week. This includes:
let score = Float(dayOffset + 1) / Float(numberOfDays) // * 1 for each day the app is valid (up to 7)
let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot) // * 1 "0 days remaining"
entries.append(entry) // * 1 "Expired"
} let numberOfEntries = min(numberOfDays, 7) + 2
}
else let appEntries = (0 ..< numberOfEntries).map { (dayOffset) -> AppEntry in
{ let entryDate = Calendar.current.date(byAdding: .day, value: dayOffset, to: currentDate) ?? currentDate.addingTimeInterval(Double(dayOffset) * 60 * 60 * 24)
let entry = AppEntry(date: Date(), app: snapshot)
entries.append(entry) let daysSinceRefresh = entryDate.numberOfCalendarDays(since: snapshot.refreshedDate)
let totalNumberOfDays = snapshot.expirationDate.numberOfCalendarDays(since: snapshot.refreshedDate)
let score = (entryDate <= snapshot.expirationDate) ? Float(daysSinceRefresh + 1) / Float(totalNumberOfDays + 1) : 0 // Expired apps have a score of 0.
let entry = AppEntry(date: entryDate, relevance: TimelineEntryRelevance(score: score), app: snapshot)
return entry
} }
entries.append(contentsOf: appEntries)
} }
let timeline = Timeline(entries: entries, policy: .atEnd) let timeline = Timeline(entries: entries, policy: .atEnd)