From b7caaeb788b06b8a56590d90b97fde63345e93f5 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 4 Oct 2021 16:54:18 -0700 Subject: [PATCH] [AltWidget] Fixes incorrect days until expiration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, we used Date() to calculate the number of days until apps expired. This meant all calculations were based on when the widget extension was run — not when it was actually displayed. As a result, this made it seem like the widget never updated since all timeline entries were calculated from the same date. Now, we instead calculate remaining days from AppEntry.date. This means the widget’s remaining days are relative to the current timeline entry’s date, matching what is displayed in AltStore. --- AltWidget/Countdown.swift | 7 ++++--- AltWidget/WidgetView.swift | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/AltWidget/Countdown.swift b/AltWidget/Countdown.swift index cb705627..0bdf4106 100644 --- a/AltWidget/Countdown.swift +++ b/AltWidget/Countdown.swift @@ -11,15 +11,16 @@ import WidgetKit struct Countdown: View { - let startDate: Date? - let endDate: Date? + var startDate: Date? + var endDate: Date? + var currentDate: Date = Date() @Environment(\.font) private var font private var numberOfDays: Int { guard let date = self.endDate else { return 0 } - let numberOfDays = date.numberOfCalendarDays(since: Date()) + let numberOfDays = date.numberOfCalendarDays(since: self.currentDate) return numberOfDays } diff --git a/AltWidget/WidgetView.swift b/AltWidget/WidgetView.swift index 5e02fdc9..8099cf70 100644 --- a/AltWidget/WidgetView.swift +++ b/AltWidget/WidgetView.swift @@ -21,7 +21,7 @@ struct WidgetView : View Group { if let app = self.entry.app { - let daysRemaining = app.expirationDate.numberOfCalendarDays(since: Date()) + let daysRemaining = app.expirationDate.numberOfCalendarDays(since: self.entry.date) GeometryReader { (geometry) in Group { @@ -70,7 +70,8 @@ struct WidgetView : View if daysRemaining >= 0 { Countdown(startDate: app.refreshedDate, - endDate: app.expirationDate) + endDate: app.expirationDate, + currentDate: self.entry.date) .font(.system(size: 20, weight: .semibold, design: .rounded)) .foregroundColor(Color.white) .opacity(0.8) @@ -146,6 +147,7 @@ struct WidgetView_Previews: PreviewProvider { static var previews: some View { let shortRefreshedDate = Calendar.current.date(byAdding: .day, value: -2, to: Date()) ?? Date() let shortExpirationDate = Calendar.current.date(byAdding: .day, value: 7, to: shortRefreshedDate) ?? Date() + let expiredExpirationDate = Calendar.current.date(byAdding: .day, value: -155, to: Date()) ?? Date() let longRefreshedDate = Calendar.current.date(byAdding: .day, value: -100, to: Date()) ?? Date() let longExpirationDate = Calendar.current.date(byAdding: .day, value: 365, to: longRefreshedDate) ?? Date() @@ -164,6 +166,13 @@ struct WidgetView_Previews: PreviewProvider { tintColor: .deltaPrimary, icon: UIImage(named: "Delta")) + let expiredDelta = AppSnapshot(name: "Delta", + bundleIdentifier: "com.rileytestut.Delta", + expirationDate: expiredExpirationDate, + refreshedDate: shortRefreshedDate, + tintColor: .deltaPrimary, + icon: UIImage(named: "Delta")) + return Group { WidgetView(entry: AppEntry(date: Date(), app: altstore)) .previewContext(WidgetPreviewContext(family: .systemSmall)) @@ -171,6 +180,9 @@ struct WidgetView_Previews: PreviewProvider { WidgetView(entry: AppEntry(date: Date(), app: delta)) .previewContext(WidgetPreviewContext(family: .systemSmall)) + WidgetView(entry: AppEntry(date: Date(), app: expiredDelta)) + .previewContext(WidgetPreviewContext(family: .systemSmall)) + WidgetView(entry: AppEntry(date: Date(), app: nil)) .previewContext(WidgetPreviewContext(family: .systemSmall))