diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 3e275f8f..26957f4c 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -109,6 +109,8 @@ 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 */; }; BF44EEFC246B4550002A52F2 /* RemoveAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */; }; BF4587F82298D3AB00BD7491 /* service.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4587C82298D3A800BD7491 /* service.h */; }; @@ -239,7 +241,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 */; }; @@ -363,19 +365,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 */; }; @@ -409,6 +412,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 */ @@ -687,7 +692,6 @@ BF3D64AF22E8D4B800E9056B /* AppContentViewControllerCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppContentViewControllerCells.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 = ""; }; BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppOperation.swift; sourceTree = ""; }; BF45872B2298D31600BD7491 /* libimobiledevice.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimobiledevice.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -836,7 +840,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 = ""; }; @@ -935,11 +939,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 = ""; }; @@ -948,6 +952,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 = ""; }; @@ -981,6 +986,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 */ @@ -1609,10 +1616,11 @@ children = ( A800F6FE2CE28DE300208744 /* Extensions */, 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 */, @@ -1959,6 +1967,15 @@ path = XPC; sourceTree = ""; }; + D50C29F22A8ECD71009AB488 /* Widgets */ = { + isa = PBXGroup; + children = ( + D577AB7E2A96878A007FE952 /* AppDetailWidget.swift */, + BF98917D250AAC4F002ACF50 /* LockScreenWidget.swift */, + ); + path = Widgets; + sourceTree = ""; + }; D513F6152A12CE210061EAA1 /* Errors */ = { isa = PBXGroup; children = ( @@ -1977,6 +1994,14 @@ path = Extensions; sourceTree = ""; }; + D51AF9752A97D29100471312 /* Model */ = { + isa = PBXGroup; + children = ( + D5FD4EC82A9530C00097BEE8 /* AppSnapshot.swift */, + ); + path = Model; + sourceTree = ""; + }; D54058B72A1D6251008CCC58 /* Previews */ = { isa = PBXGroup; children = ( @@ -2004,6 +2029,14 @@ path = Legacy; sourceTree = ""; }; + D577AB802A968B7E007FE952 /* Components */ = { + isa = PBXGroup; + children = ( + BF98917C250AAC4F002ACF50 /* Countdown.swift */, + ); + path = Components; + sourceTree = ""; + }; D586D39928EF58B0000E101F /* AltTests */ = { isa = PBXGroup; children = ( @@ -2767,13 +2800,16 @@ 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 */, A800F7042CE28E3800208744 /* View+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 91% rename from AltWidget/AltWidget.swift rename to AltWidget/Provider.swift index 32c5ef83..ca0b013d 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 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 a14da63e..a80c50b8 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 6ad6aba2..313ef751 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