diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index c3394076..ec3eda95 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -43,7 +43,6 @@ BF3F786422CAA41E008FBD20 /* ALTDeviceManager+Installation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3F786322CAA41E008FBD20 /* ALTDeviceManager+Installation.swift */; }; BF41B806233423AE00C593A3 /* TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF41B805233423AE00C593A3 /* TabBarController.swift */; }; BF41B808233433C100C593A3 /* LoadingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF41B807233433C100C593A3 /* LoadingState.swift */; }; - BF42345A25101C35006D1EB2 /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF42345825101C1D006D1EB2 /* WidgetView.swift */; }; BF42345C251024B0006D1EB2 /* AltSign-Static in Frameworks */ = {isa = PBXBuildFile; productRef = BF42345B251024B0006D1EB2 /* AltSign-Static */; }; BF42345D25102688006D1EB2 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF088D322501A4FF008082D9 /* OpenSSL.xcframework */; }; BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEEF246B08BA002A52F2 /* BackupController.swift */; }; @@ -199,7 +198,7 @@ BF989171250AABF4002ACF50 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF989170250AABF4002ACF50 /* Assets.xcassets */; }; BF989177250AABF4002ACF50 /* AltWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BF98917E250AAC4F002ACF50 /* Countdown.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF98917C250AAC4F002ACF50 /* Countdown.swift */; }; - BF98917F250AAC4F002ACF50 /* AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF98917D250AAC4F002ACF50 /* AltWidget.swift */; }; + BF98917F250AAC4F002ACF50 /* LockScreenWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */; }; BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFDB5B1522EE90D300F74113 /* Date+RelativeDate.swift */; }; BF989185250AAD1D002ACF50 /* UIColor+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */; }; BF9ABA4522DCFF43008935CF /* BrowseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */; }; @@ -368,19 +367,20 @@ D54DED1428CBC44B008B27A0 /* ErrorLogTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */; }; D552B1D82A042A740066216F /* AppPermissionsCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = D552B1D72A042A740066216F /* AppPermissionsCard.swift */; }; D55467B82A8D5E2600F4CE90 /* AppShortcuts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55467B12A8D5E2600F4CE90 /* AppShortcuts.swift */; }; - D55E163728776CB700A627A1 /* ComplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55E163528776CB000A627A1 /* ComplicationView.swift */; }; D561B2EB28EF5A4F006752E4 /* AltSign-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; }; D561B2ED28EF5A4F006752E4 /* AltSign-Dynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = D561B2EA28EF5A4F006752E4 /* AltSign-Dynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; D5708417292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; D570841A2924680D00D42D34 /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */; }; D571ADD02A02FC7200B24B63 /* ALTAppPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */; }; D5728CA72A0D79D30014E73C /* OptionalProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */; }; + D577AB7F2A96878A007FE952 /* AppDetailWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */; }; D57968CB29CB99EF00539069 /* VibrantButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57968CA29CB99EF00539069 /* VibrantButton.swift */; }; D57DF638271E32F000677701 /* PatchApp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D57DF637271E32F000677701 /* PatchApp.storyboard */; }; D57DF63F271E51E400677701 /* ALTAppPatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = D57DF63E271E51E400677701 /* ALTAppPatcher.m */; }; D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */; }; D57F2C9426E01BC700B9FA39 /* UIDevice+Vibration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */; }; D57FE84428C7DB7100216002 /* ErrorLogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */; }; + D586222F2AA1161700A493E1 /* Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D586222D2AA115D000A493E1 /* Provider.swift */; }; D586D39B28EF58B0000E101F /* AltTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D586D39A28EF58B0000E101F /* AltTests.swift */; }; D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; }; D5893F802A1419E800E767CD /* NSManagedObjectContext+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */; }; @@ -414,6 +414,8 @@ D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */; }; D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; }; D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */; }; + D5FD4EC52A952EAD0097BEE8 /* AltWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */; }; + D5FD4EC92A9530C00097BEE8 /* AppSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -571,7 +573,6 @@ BF3F786322CAA41E008FBD20 /* ALTDeviceManager+Installation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTDeviceManager+Installation.swift"; sourceTree = ""; }; BF41B805233423AE00C593A3 /* TabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarController.swift; sourceTree = ""; }; BF41B807233433C100C593A3 /* LoadingState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingState.swift; sourceTree = ""; }; - BF42345825101C1D006D1EB2 /* WidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetView.swift; sourceTree = ""; }; BF44EEEF246B08BA002A52F2 /* BackupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupController.swift; sourceTree = ""; }; BF44EEF2246B3A17002A52F2 /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltBackup.ipa; sourceTree = ""; }; BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppOperation.swift; sourceTree = ""; }; @@ -754,7 +755,7 @@ BF989170250AABF4002ACF50 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BF989172250AABF4002ACF50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BF98917C250AAC4F002ACF50 /* Countdown.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Countdown.swift; sourceTree = ""; }; - BF98917D250AAC4F002ACF50 /* AltWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AltWidget.swift; sourceTree = ""; }; + BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LockScreenWidget.swift; sourceTree = ""; }; BF989190250AAE86002ACF50 /* ViewAppIntentHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewAppIntentHandler.swift; sourceTree = ""; }; BF989191250AAE86002ACF50 /* ViewApp.intentdefinition */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.intentdefinition; path = ViewApp.intentdefinition; sourceTree = ""; }; BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewController.swift; sourceTree = ""; }; @@ -900,11 +901,11 @@ D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogTableViewCell.swift; sourceTree = ""; }; D552B1D72A042A740066216F /* AppPermissionsCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionsCard.swift; sourceTree = ""; }; D55467B12A8D5E2600F4CE90 /* AppShortcuts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppShortcuts.swift; sourceTree = ""; }; - D55E163528776CB000A627A1 /* ComplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationView.swift; sourceTree = ""; }; D5708416292448DA00D42D34 /* OperatingSystemVersion+Comparable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OperatingSystemVersion+Comparable.swift"; sourceTree = ""; }; D571ADCD2A02FA7400B24B63 /* SourceError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceError.swift; sourceTree = ""; }; D571ADCF2A02FC7200B24B63 /* ALTAppPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTAppPermission.swift; sourceTree = ""; }; D5728CA62A0D79D30014E73C /* OptionalProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalProtocol.swift; sourceTree = ""; }; + D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailWidget.swift; sourceTree = ""; }; D57968CA29CB99EF00539069 /* VibrantButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VibrantButton.swift; sourceTree = ""; }; D57DF637271E32F000677701 /* PatchApp.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = PatchApp.storyboard; sourceTree = ""; }; D57DF63D271E51E400677701 /* ALTAppPatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTAppPatcher.h; sourceTree = ""; }; @@ -913,6 +914,7 @@ D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+Vibration.swift"; sourceTree = ""; }; D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogViewController.swift; sourceTree = ""; }; D581822C2A218A140087965B /* AltStore 13.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 13.xcdatamodel"; sourceTree = ""; }; + D586222D2AA115D000A493E1 /* Provider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Provider.swift; sourceTree = ""; }; D586D39828EF58B0000E101F /* AltTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AltTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; D586D39A28EF58B0000E101F /* AltTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltTests.swift; sourceTree = ""; }; D58916FD28C7C55C00E39C8B /* LoggedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedError.swift; sourceTree = ""; }; @@ -946,6 +948,8 @@ D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore10ToAltStore11.xcmappingmodel; sourceTree = ""; }; D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp10ToStoreApp11Policy.swift; sourceTree = ""; }; + D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AltWidgetBundle.swift; sourceTree = ""; }; + D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSnapshot.swift; sourceTree = ""; }; EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.debug.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; FC3822AB1C4CF1D4CDF7445D /* Pods_AltServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -1537,10 +1541,11 @@ isa = PBXGroup; children = ( BF8B17F0250AC62400F8157F /* AltWidgetExtension.entitlements */, - BF98917D250AAC4F002ACF50 /* AltWidget.swift */, - BF42345825101C1D006D1EB2 /* WidgetView.swift */, - BF98917C250AAC4F002ACF50 /* Countdown.swift */, - D55E163528776CB000A627A1 /* ComplicationView.swift */, + D5FD4EC42A952EAD0097BEE8 /* AltWidgetBundle.swift */, + D586222D2AA115D000A493E1 /* Provider.swift */, + D50C29F22A8ECD71009AB488 /* Widgets */, + D51AF9752A97D29100471312 /* Model */, + D577AB802A968B7E007FE952 /* Components */, D5151BE42A9038FA00C96F28 /* Extensions */, BF989170250AABF4002ACF50 /* Assets.xcassets */, BF989172250AABF4002ACF50 /* Info.plist */, @@ -1939,6 +1944,15 @@ path = XPC; sourceTree = ""; }; + D50C29F22A8ECD71009AB488 /* Widgets */ = { + isa = PBXGroup; + children = ( + D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */, + BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */, + ); + path = Widgets; + sourceTree = ""; + }; D513F6152A12CE210061EAA1 /* Errors */ = { isa = PBXGroup; children = ( @@ -1957,6 +1971,14 @@ path = Extensions; sourceTree = ""; }; + D51AF9752A97D29100471312 /* Model */ = { + isa = PBXGroup; + children = ( + D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */, + ); + path = Model; + sourceTree = ""; + }; D54058B72A1D6251008CCC58 /* Previews */ = { isa = PBXGroup; children = ( @@ -1984,6 +2006,14 @@ path = Legacy; sourceTree = ""; }; + D577AB802A968B7E007FE952 /* Components */ = { + isa = PBXGroup; + children = ( + BF98917C250AAC4F002ACF50 /* Countdown.swift */, + ); + path = Components; + sourceTree = ""; + }; D586D39928EF58B0000E101F /* AltTests */ = { isa = PBXGroup; children = ( @@ -2817,12 +2847,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D577AB7F2A96878A007FE952 /* AppDetailWidget.swift in Sources */, BF98917E250AAC4F002ACF50 /* Countdown.swift in Sources */, D5151BE22A90363300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */, - BF42345A25101C35006D1EB2 /* WidgetView.swift in Sources */, - D55E163728776CB700A627A1 /* ComplicationView.swift in Sources */, + D5FD4EC92A9530C00097BEE8 /* AppSnapshot.swift in Sources */, + D586222F2AA1161700A493E1 /* Provider.swift in Sources */, D5151BE72A90395400C96F28 /* View+AltWidget.swift in Sources */, - BF98917F250AAC4F002ACF50 /* AltWidget.swift in Sources */, + BF98917F250AAC4F002ACF50 /* LockScreenWidget.swift in Sources */, + D5FD4EC52A952EAD0097BEE8 /* AltWidgetBundle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/AltWidget/AltWidgetBundle.swift b/AltWidget/AltWidgetBundle.swift new file mode 100644 index 00000000..a3c36462 --- /dev/null +++ b/AltWidget/AltWidgetBundle.swift @@ -0,0 +1,21 @@ +// +// AltWidgetBundle.swift +// AltWidgetExtension +// +// Created by Riley Testut on 8/22/23. +// Copyright © 2023 Riley Testut. All rights reserved. +// + +import SwiftUI +import WidgetKit + +@main +struct AltWidgetBundle: WidgetBundle +{ + var body: some Widget { + AppDetailWidget() + + IconLockScreenWidget() + TextLockScreenWidget() + } +} diff --git a/AltWidget/Countdown.swift b/AltWidget/Components/Countdown.swift similarity index 100% rename from AltWidget/Countdown.swift rename to AltWidget/Components/Countdown.swift diff --git a/AltWidget/Model/AppSnapshot.swift b/AltWidget/Model/AppSnapshot.swift new file mode 100644 index 00000000..24842cda --- /dev/null +++ b/AltWidget/Model/AppSnapshot.swift @@ -0,0 +1,41 @@ +// +// AppsEntry.swift +// AltWidgetExtension +// +// Created by Riley Testut on 8/22/23. +// Copyright © 2023 Riley Testut. All rights reserved. +// + +import UIKit +import WidgetKit + +import AltStoreCore +import AltSign + +struct AppSnapshot +{ + var name: String + var bundleIdentifier: String + var expirationDate: Date + var refreshedDate: Date + + var tintColor: UIColor? + var icon: UIImage? +} + +extension AppSnapshot +{ + // Declared in extension so we retain synthesized initializer. + init(installedApp: InstalledApp) + { + self.name = installedApp.name + self.bundleIdentifier = installedApp.bundleIdentifier + self.expirationDate = installedApp.expirationDate + self.refreshedDate = installedApp.refreshedDate + + self.tintColor = installedApp.storeApp?.tintColor + + let application = ALTApplication(fileURL: installedApp.fileURL) + self.icon = application?.icon?.resizing(toFill: CGSize(width: 180, height: 180)) + } +} diff --git a/AltWidget/AltWidget.swift b/AltWidget/Provider.swift similarity index 63% rename from AltWidget/AltWidget.swift rename to AltWidget/Provider.swift index cc8637ab..ea65bf4a 100644 --- a/AltWidget/AltWidget.swift +++ b/AltWidget/Provider.swift @@ -1,14 +1,12 @@ // -// AltWidget.swift -// AltWidget +// Provider.swift +// AltStore // // Created by Riley Testut on 6/26/20. // Copyright © 2020 Riley Testut. All rights reserved. // -import SwiftUI import WidgetKit -import UIKit import CoreData import AltStoreCore @@ -23,34 +21,6 @@ struct AppEntry: TimelineEntry var isPlaceholder: Bool = false } -struct AppSnapshot -{ - var name: String - var bundleIdentifier: String - var expirationDate: Date - var refreshedDate: Date - - var tintColor: UIColor? - var icon: UIImage? -} - -extension AppSnapshot -{ - // Declared in extension so we retain synthesized initializer. - init(installedApp: InstalledApp) - { - self.name = installedApp.name - self.bundleIdentifier = installedApp.bundleIdentifier - self.expirationDate = installedApp.expirationDate - self.refreshedDate = installedApp.refreshedDate - - self.tintColor = installedApp.storeApp?.tintColor - - let application = ALTApplication(fileURL: installedApp.fileURL) - self.icon = application?.icon?.resizing(toFill: CGSize(width: 180, height: 180)) - } -} - struct Provider: IntentTimelineProvider { typealias Intent = ViewAppIntent @@ -172,85 +142,3 @@ struct Provider: IntentTimelineProvider } } } - -struct HomeScreenWidget: Widget -{ - private let kind: String = "AppDetail" - - public var body: some WidgetConfiguration { - let configuration = IntentConfiguration(kind: kind, - intent: ViewAppIntent.self, - provider: Provider()) { (entry) in - WidgetView(entry: entry) - } - .supportedFamilies([.systemSmall]) - .configurationDisplayName("AltWidget") - .description("View remaining days until your sideloaded apps expire.") - - if #available(iOS 17, *) - { - return configuration - .contentMarginsDisabled() - } - else - { - return configuration - } - } -} - -struct TextLockScreenWidget: Widget -{ - private let kind: String = "TextLockAppDetail" - - public var body: some WidgetConfiguration { - if #available(iOSApplicationExtension 16, *) - { - return IntentConfiguration(kind: kind, - intent: ViewAppIntent.self, - provider: Provider()) { (entry) in - ComplicationView(entry: entry, style: .text) - } - .supportedFamilies([.accessoryCircular]) - .configurationDisplayName("AltWidget (Text)") - .description("View remaining days until AltStore expires.") - } - else - { - return EmptyWidgetConfiguration() - } - } -} - -struct IconLockScreenWidget: Widget -{ - private let kind: String = "IconLockAppDetail" - - public var body: some WidgetConfiguration { - if #available(iOSApplicationExtension 16, *) - { - return IntentConfiguration(kind: kind, - intent: ViewAppIntent.self, - provider: Provider()) { (entry) in - ComplicationView(entry: entry, style: .icon) - } - .supportedFamilies([.accessoryCircular]) - .configurationDisplayName("AltWidget (Icon)") - .description("View remaining days until AltStore expires.") - } - else - { - return EmptyWidgetConfiguration() - } - } -} - -@main -struct AltWidgets: WidgetBundle -{ - var body: some Widget { - HomeScreenWidget() - IconLockScreenWidget() - TextLockScreenWidget() - } -} diff --git a/AltWidget/WidgetView.swift b/AltWidget/Widgets/AppDetailWidget.swift similarity index 86% rename from AltWidget/WidgetView.swift rename to AltWidget/Widgets/AppDetailWidget.swift index 95937334..960c6f4c 100644 --- a/AltWidget/WidgetView.swift +++ b/AltWidget/Widgets/AppDetailWidget.swift @@ -1,6 +1,6 @@ // -// WidgetView.swift -// AltStore +// AppDetailWidget.swift +// AltWidgetExtension // // Created by Riley Testut on 9/14/20. // Copyright © 2020 Riley Testut. All rights reserved. @@ -10,10 +10,34 @@ import WidgetKit import SwiftUI import AltStoreCore -import AltSign -import CoreData -struct WidgetView : View +struct AppDetailWidget: Widget +{ + private let kind: String = "AppDetail" + + public var body: some WidgetConfiguration { + let configuration = IntentConfiguration(kind: kind, + intent: ViewAppIntent.self, + provider: Provider()) { (entry) in + AppDetailWidgetView(entry: entry) + } + .supportedFamilies([.systemSmall]) + .configurationDisplayName("AltWidget") + .description("View remaining days until your sideloaded apps expire.") + + if #available(iOS 17, *) + { + return configuration + .contentMarginsDisabled() + } + else + { + return configuration + } + } +} + +private struct AppDetailWidgetView: View { var entry: AppEntry @@ -110,7 +134,7 @@ struct WidgetView : View } } -private extension WidgetView +private extension AppDetailWidgetView { func backgroundView(icon: UIImage? = nil, tintColor: UIColor? = nil) -> some View { @@ -178,19 +202,19 @@ struct WidgetView_Previews: PreviewProvider { icon: UIImage(named: "Delta")) return Group { - WidgetView(entry: AppEntry(date: Date(), app: altstore)) + AppDetailWidgetView(entry: AppEntry(date: Date(), app: altstore)) .previewContext(WidgetPreviewContext(family: .systemSmall)) - WidgetView(entry: AppEntry(date: Date(), app: delta)) + AppDetailWidgetView(entry: AppEntry(date: Date(), app: delta)) .previewContext(WidgetPreviewContext(family: .systemSmall)) - WidgetView(entry: AppEntry(date: Date(), app: expiredDelta)) + AppDetailWidgetView(entry: AppEntry(date: Date(), app: expiredDelta)) .previewContext(WidgetPreviewContext(family: .systemSmall)) - WidgetView(entry: AppEntry(date: Date(), app: nil)) + AppDetailWidgetView(entry: AppEntry(date: Date(), app: nil)) .previewContext(WidgetPreviewContext(family: .systemSmall)) - WidgetView(entry: AppEntry(date: Date(), app: nil, isPlaceholder: true)) + AppDetailWidgetView(entry: AppEntry(date: Date(), app: nil, isPlaceholder: true)) .previewContext(WidgetPreviewContext(family: .systemSmall)) } } diff --git a/AltWidget/ComplicationView.swift b/AltWidget/Widgets/LockScreenWidget.swift similarity index 76% rename from AltWidget/ComplicationView.swift rename to AltWidget/Widgets/LockScreenWidget.swift index 5b34a018..a27044ac 100644 --- a/AltWidget/ComplicationView.swift +++ b/AltWidget/Widgets/LockScreenWidget.swift @@ -1,6 +1,6 @@ // -// ComplicationView.swift -// AltStore +// LockScreenWidget.swift +// AltWidget // // Created by Riley Testut on 7/7/22. // Copyright © 2022 Riley Testut. All rights reserved. @@ -9,10 +9,58 @@ import SwiftUI import WidgetKit +import AltStoreCore + +struct TextLockScreenWidget: Widget +{ + private let kind: String = "TextLockAppDetail" + + public var body: some WidgetConfiguration { + if #available(iOSApplicationExtension 16, *) + { + return IntentConfiguration(kind: kind, + intent: ViewAppIntent.self, + provider: Provider()) { (entry) in + ComplicationView(entry: entry, style: .text) + } + .supportedFamilies([.accessoryCircular]) + .configurationDisplayName("AltWidget (Text)") + .description("View remaining days until AltStore expires.") + } + else + { + return EmptyWidgetConfiguration() + } + } +} + +struct IconLockScreenWidget: Widget +{ + private let kind: String = "IconLockAppDetail" + + public var body: some WidgetConfiguration { + if #available(iOSApplicationExtension 16, *) + { + return IntentConfiguration(kind: kind, + intent: ViewAppIntent.self, + provider: Provider()) { (entry) in + ComplicationView(entry: entry, style: .icon) + } + .supportedFamilies([.accessoryCircular]) + .configurationDisplayName("AltWidget (Icon)") + .description("View remaining days until AltStore expires.") + } + else + { + return EmptyWidgetConfiguration() + } + } +} + @available(iOS 16, *) extension ComplicationView { - enum Style + fileprivate enum Style { case text case icon @@ -20,7 +68,7 @@ extension ComplicationView } @available(iOS 16, *) -struct ComplicationView: View +private struct ComplicationView: View { let entry: AppEntry let style: Style