mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-10 23:33:29 +01:00
[AltStoreCore] Adds AppScreenshot to support dynamically-sized screenshots
Preserves StoreApp.imageURL field in database model for backwards compatibility.
This commit is contained in:
@@ -136,6 +136,11 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
||||
{
|
||||
permission.sourceID = self.sourceIdentifier ?? ""
|
||||
}
|
||||
|
||||
for screenshot in self.screenshots
|
||||
{
|
||||
screenshot.sourceID = self.sourceIdentifier ?? ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@NSManaged private var primitiveSourceIdentifier: String?
|
||||
@@ -200,6 +205,10 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
||||
guard let version = self.latestSupportedVersion else { return nil }
|
||||
return version.downloadURL
|
||||
}
|
||||
@nonobjc public var screenshots: [AppScreenshot] {
|
||||
return self._screenshots.array as! [AppScreenshot]
|
||||
}
|
||||
@NSManaged @objc(screenshots) private(set) var _screenshots: NSOrderedSet
|
||||
|
||||
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
|
||||
{
|
||||
@@ -212,19 +221,24 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
||||
case bundleIdentifier
|
||||
case developerName
|
||||
case localizedDescription
|
||||
case version
|
||||
case versionDescription
|
||||
case versionDate
|
||||
case iconURL
|
||||
case screenshotURLs
|
||||
case downloadURL
|
||||
case platformURLs
|
||||
case screenshots
|
||||
case tintColor
|
||||
case subtitle
|
||||
case permissions = "appPermissions"
|
||||
case size
|
||||
case isBeta = "beta"
|
||||
case versions
|
||||
|
||||
// Legacy
|
||||
case version
|
||||
case versionDescription
|
||||
case versionDate
|
||||
case downloadURL
|
||||
case screenshotURLs
|
||||
}
|
||||
|
||||
public required init(from decoder: Decoder) throws
|
||||
@@ -245,7 +259,6 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
||||
self.subtitle = try container.decodeIfPresent(String.self, forKey: .subtitle)
|
||||
|
||||
self.iconURL = try container.decode(URL.self, forKey: .iconURL)
|
||||
self.screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs) ?? []
|
||||
|
||||
var downloadURL = try container.decodeIfPresent(URL.self, forKey: .downloadURL)
|
||||
let platformURLs = try container.decodeIfPresent(PlatformURLs.self.self, forKey: .platformURLs)
|
||||
@@ -291,6 +304,33 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
|
||||
|
||||
self.isBeta = try container.decodeIfPresent(Bool.self, forKey: .isBeta) ?? false
|
||||
|
||||
if let screenshots = try container.decodeIfPresent([AppScreenshot].self, forKey: .screenshots)
|
||||
{
|
||||
for screenshot in screenshots
|
||||
{
|
||||
screenshot.appBundleID = self.bundleIdentifier
|
||||
}
|
||||
|
||||
self.setScreenshots(screenshots)
|
||||
}
|
||||
else if let screenshotURLs = try container.decodeIfPresent([URL].self, forKey: .screenshotURLs)
|
||||
{
|
||||
// Assume 9:16 iPhone 8 screen dimensions for legacy screenshotURLs.
|
||||
let legacyAspectRatio = CGSize(width: 750, height: 1334)
|
||||
|
||||
let screenshots = screenshotURLs.map { imageURL in
|
||||
let screenshot = AppScreenshot(imageURL: imageURL, size: legacyAspectRatio, context: context)
|
||||
screenshot.appBundleID = self.bundleIdentifier
|
||||
return screenshot
|
||||
}
|
||||
|
||||
self.setScreenshots(screenshots)
|
||||
}
|
||||
else
|
||||
{
|
||||
self.setScreenshots([])
|
||||
}
|
||||
|
||||
if let appPermissions = try container.decodeIfPresent(AppPermissions.self, forKey: .permissions)
|
||||
{
|
||||
let allPermissions = appPermissions.entitlements + appPermissions.privacy
|
||||
@@ -402,6 +442,26 @@ internal extension StoreApp
|
||||
|
||||
self._permissions = permissions as NSSet
|
||||
}
|
||||
|
||||
func setScreenshots(_ screenshots: [AppScreenshot])
|
||||
{
|
||||
for case let screenshot as AppScreenshot in self._screenshots
|
||||
{
|
||||
if screenshots.contains(screenshot)
|
||||
{
|
||||
screenshot.app = self
|
||||
}
|
||||
else
|
||||
{
|
||||
screenshot.app = nil
|
||||
}
|
||||
}
|
||||
|
||||
self._screenshots = NSOrderedSet(array: screenshots)
|
||||
|
||||
// Backwards compatibility
|
||||
self.screenshotURLs = screenshots.map { $0.imageURL }
|
||||
}
|
||||
}
|
||||
|
||||
public extension StoreApp
|
||||
|
||||
Reference in New Issue
Block a user