diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 9a843c98..0e000a1c 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -343,6 +343,7 @@ BFF7C90F257844C900E55F36 /* AltXPC.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = BFF7C904257844C900E55F36 /* AltXPC.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BFF7C920257844FA00E55F36 /* ALTPluginService.m in Sources */ = {isa = PBXBuildFile; fileRef = BF5C5FCE237DF69100EDD0C6 /* ALTPluginService.m */; }; BFF7C9342578492100E55F36 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; + D50107EC2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */; }; D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D571ADCD2A02FA7400B24B63 /* SourceError.swift */; }; D5151BD92A8FF64300C96F28 /* RefreshAllAppsIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5151BD82A8FF64300C96F28 /* RefreshAllAppsIntent.swift */; }; D5151BE12A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5151BE02A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift */; }; @@ -364,6 +365,7 @@ D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8BD2727BBF800A9B5DD /* libcurl.a */; }; D537C8592AA94D94009A1E08 /* altjit in Embed AltJIT */ = {isa = PBXBuildFile; fileRef = D5FB7A132AA284BE00EF863D /* altjit */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; D537C85B2AA9507A009A1E08 /* libcorecrypto.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D537C85A2AA95066009A1E08 /* libcorecrypto.tbd */; platformFilters = (macos, ); }; + D5390C3C2AC3A43900D17E62 /* AddSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */; }; D53D84022A2158FC00543C3B /* Permissions.plist in Resources */ = {isa = PBXBuildFile; fileRef = D53D84012A2158FC00543C3B /* Permissions.plist */; }; D54058B92A1D6269008CCC58 /* AppPermissionProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */; }; D54058BB2A1D8FE3008CCC58 /* UIColor+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */; }; @@ -391,13 +393,12 @@ 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 */; }; - D5893F822A141E4900E767CD /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; }; D58D5F2E26DFE68E00E55E38 /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = D58D5F2D26DFE68E00E55E38 /* LaunchAtLogin */; }; D59162AB29BA60A9005CBF47 /* SourceHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */; }; D59162AD29BA616A005CBF47 /* SourceHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */; }; D5927D6629DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */; }; D5927D6929DCE28700D6898E /* AltStore11ToAltStore12.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5927D6829DCE28700D6898E /* AltStore11ToAltStore12.xcmappingmodel */; }; - D5935AED29C39DE300C157EF /* SourceDetailsComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5935AEC29C39DE300C157EF /* SourceDetailsComponents.swift */; }; + D5935AED29C39DE300C157EF /* SourceComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5935AEC29C39DE300C157EF /* SourceComponents.swift */; }; D5935AEF29C3B23600C157EF /* Sources.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D5935AEE29C3B23600C157EF /* Sources.storyboard */; }; D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D593F1932717749A006E82DE /* PatchAppOperation.swift */; }; D59A6B7B2AA91B8E00F61259 /* PythonCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B7A2AA91B8E00F61259 /* PythonCommand.swift */; }; @@ -415,6 +416,7 @@ D5A299882AAB9E4E00A3988D /* JITError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1D2E32AA50EB60066CACC /* JITError.swift */; }; D5A299892AAB9E5900A3988D /* AppProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A6B7D2AA9226C00F61259 /* AppProcess.swift */; }; D5ACE84528E3B8450021CAB9 /* ClearAppCacheOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */; }; + D5B6F6A92AD75D01007EED5A /* ProcessInfo+Previews.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */; }; D5BA9E9B2A9FE1E8007C0661 /* JITManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5BA9E9A2A9FE1E8007C0661 /* JITManager.swift */; }; D5C8ACDB2A956B2B00669F92 /* Process+STPrivilegedTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C8ACDA2A956B2B00669F92 /* Process+STPrivilegedTask.swift */; }; D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4A280E141900469595 /* ManagedPatron.swift */; }; @@ -435,6 +437,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 */; }; + D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */; }; + D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5893F812A141E4900E767CD /* KnownSource.swift */; }; D5FB7A0E2AA25A4E00EF863D /* Previews.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */; }; D5FB7A212AA284ED00EF863D /* EnableJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */; }; D5FB7A242AA284ED00EF863D /* Logger+AltJIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5FB7A1D2AA284ED00EF863D /* Logger+AltJIT.swift */; }; @@ -950,6 +954,7 @@ BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 8.xcdatamodel"; sourceTree = ""; }; BFFCFA45248835530077BFCE /* AltDaemon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltDaemon.entitlements; sourceTree = ""; }; C9EEAA842DA87A88A870053B /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceTextFieldCell.swift; sourceTree = ""; }; D5151BD82A8FF64300C96F28 /* RefreshAllAppsIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAllAppsIntent.swift; sourceTree = ""; }; D5151BE02A90344300C96F28 /* RefreshAllAppsWidgetIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAllAppsWidgetIntent.swift; sourceTree = ""; }; D5151BE52A90391900C96F28 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = ""; }; @@ -966,6 +971,7 @@ D533E8BB2727BBEE00A9B5DD /* libfragmentzip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfragmentzip.a; path = Dependencies/fragmentzip/libfragmentzip.a; sourceTree = SOURCE_ROOT; }; D533E8BD2727BBF800A9B5DD /* libcurl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcurl.a; path = Dependencies/libcurl/libcurl.a; sourceTree = SOURCE_ROOT; }; D537C85A2AA95066009A1E08 /* libcorecrypto.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libcorecrypto.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/lib/system/libcorecrypto.tbd; sourceTree = DEVELOPER_DIR; }; + D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceViewController.swift; sourceTree = ""; }; D53D84012A2158FC00543C3B /* Permissions.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Permissions.plist; sourceTree = ""; }; D54058B82A1D6269008CCC58 /* AppPermissionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermissionProtocol.swift; sourceTree = ""; }; D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = ""; }; @@ -1000,7 +1006,7 @@ D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationBarAppearance+TintColor.swift"; sourceTree = ""; }; D5927D6729DCE1FE00D6898E /* AltStore 12.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 12.xcdatamodel"; sourceTree = ""; }; D5927D6829DCE28700D6898E /* AltStore11ToAltStore12.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore11ToAltStore12.xcmappingmodel; sourceTree = ""; }; - D5935AEC29C39DE300C157EF /* SourceDetailsComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceDetailsComponents.swift; sourceTree = ""; }; + D5935AEC29C39DE300C157EF /* SourceComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceComponents.swift; sourceTree = ""; }; D5935AEE29C3B23600C157EF /* Sources.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Sources.storyboard; sourceTree = ""; }; D593F1932717749A006E82DE /* PatchAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchAppOperation.swift; sourceTree = ""; }; D59A6B7A2AA91B8E00F61259 /* PythonCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PythonCommand.swift; sourceTree = ""; }; @@ -1013,6 +1019,7 @@ D5A1D2EA2AA513410066CACC /* URL+Tools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Tools.swift"; sourceTree = ""; }; D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecatedAPIs.swift; sourceTree = ""; }; D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearAppCacheOperation.swift; sourceTree = ""; }; + D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+Previews.swift"; sourceTree = ""; }; D5BA9E9A2A9FE1E8007C0661 /* JITManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JITManager.swift; sourceTree = ""; }; D5C8ACDA2A956B2B00669F92 /* Process+STPrivilegedTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Process+STPrivilegedTask.swift"; sourceTree = ""; }; D5CA0C4A280E141900469595 /* ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPatron.swift; sourceTree = ""; }; @@ -1032,6 +1039,7 @@ 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 = ""; }; + D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFontDescriptor+Bold.swift"; sourceTree = ""; }; D5FB7A0D2AA25A4E00EF863D /* Previews.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Previews.xcassets; sourceTree = ""; }; D5FB7A132AA284BE00EF863D /* altjit */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = altjit; sourceTree = BUILT_PRODUCTS_DIR; }; D5FB7A1A2AA284ED00EF863D /* EnableJIT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnableJIT.swift; path = AltJIT/Commands/EnableJIT.swift; sourceTree = SOURCE_ROOT; }; @@ -1230,7 +1238,6 @@ BF41B807233433C100C593A3 /* LoadingState.swift */, D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */, D5A2193329B14F94002229FC /* DeprecatedAPIs.swift */, - D5893F812A141E4900E767CD /* KnownSource.swift */, ); path = Types; sourceTree = ""; @@ -1473,6 +1480,7 @@ children = ( BFB39B5B252BC10E00D1BE50 /* Managed.swift */, D5F48B4929CD0B67002B52A4 /* AsyncManaged.swift */, + D5893F812A141E4900E767CD /* KnownSource.swift */, BF66EE8E2501AEBC007EE018 /* ALTAppPermissions.h */, BF66EE912501AEBC007EE018 /* ALTAppPermissions.m */, BF66EE922501AEBC007EE018 /* ALTPatreonBenefitType.h */, @@ -1583,6 +1591,7 @@ D5F48B4729CCF21B002B52A4 /* AltStore+Async.swift */, D5893F7E2A14183200E767CD /* NSManagedObjectContext+Conveniences.swift */, D52A2F962ACB40F700BDF8E3 /* Logger+AltStore.swift */, + D5B6F6A82AD75D01007EED5A /* ProcessInfo+Previews.swift */, ); path = Extensions; sourceTree = ""; @@ -1734,9 +1743,8 @@ BFC84A4C2421A19100853474 /* SourcesViewController.swift */, D5CD805E29CA755E00E591B0 /* SourceDetailViewController.swift */, D5A0537229B91DB400997551 /* SourceDetailContentViewController.swift */, - D5935AEC29C39DE300C157EF /* SourceDetailsComponents.swift */, - D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */, - D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */, + D5390C3B2AC3A43900D17E62 /* AddSourceViewController.swift */, + D50107ED2ADF2E310069F2A1 /* Components */, ); path = Sources; sourceTree = ""; @@ -1898,6 +1906,7 @@ D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */, D5927D6529DCC89000D6898E /* UINavigationBarAppearance+TintColor.swift */, D54058BA2A1D8FE3008CCC58 /* UIColor+AltStore.swift */, + D5FB28EB2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift */, ); path = Extensions; sourceTree = ""; @@ -2059,6 +2068,17 @@ path = XPC; sourceTree = ""; }; + D50107ED2ADF2E310069F2A1 /* Components */ = { + isa = PBXGroup; + children = ( + D5935AEC29C39DE300C157EF /* SourceComponents.swift */, + D59162AA29BA60A9005CBF47 /* SourceHeaderView.swift */, + D59162AC29BA616A005CBF47 /* SourceHeaderView.xib */, + D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */, + ); + path = Components; + sourceTree = ""; + }; D50C29F22A8ECD71009AB488 /* Widgets */ = { isa = PBXGroup; children = ( @@ -2987,6 +3007,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D5FB28EE2ADDF89800A1C337 /* KnownSource.swift in Sources */, BF66EED32501AECA007EE018 /* AltStore2ToAltStore3.xcmappingmodel in Sources */, BF66EEA52501AEC5007EE018 /* Benefit.swift in Sources */, BF66EED22501AECA007EE018 /* AltStore4ToAltStore5.xcmappingmodel in Sources */, @@ -3028,6 +3049,7 @@ BFAECC5A2501B0A400528F27 /* NetworkConnection.swift in Sources */, D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */, BF66EEE92501AED0007EE018 /* JSONDecoder+Properties.swift in Sources */, + D5B6F6A92AD75D01007EED5A /* ProcessInfo+Previews.swift in Sources */, BF66EEEB2501AED0007EE018 /* UIApplication+AppExtension.swift in Sources */, D5F48B4829CCF21B002B52A4 /* AltStore+Async.swift in Sources */, BF66EED92501AECA007EE018 /* Team.swift in Sources */, @@ -3096,7 +3118,6 @@ D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */, D513F6162A12CE4E0061EAA1 /* SourceError.swift in Sources */, BF56D2AC23DF8E170006506D /* FetchAppIDsOperation.swift in Sources */, - D5893F822A141E4900E767CD /* KnownSource.swift in Sources */, BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */, BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */, D57F2C9126E0070200B9FA39 /* EnableJITOperation.swift in Sources */, @@ -3104,18 +3125,20 @@ D5E1E7C128077DE90016FC96 /* UpdateKnownSourcesOperation.swift in Sources */, BFE338DF22F0EADB002E24B9 /* FetchSourceOperation.swift in Sources */, D54DED1428CBC44B008B27A0 /* ErrorLogTableViewCell.swift in Sources */, + D5390C3C2AC3A43900D17E62 /* AddSourceViewController.swift in Sources */, D5CD805F29CA755E00E591B0 /* SourceDetailViewController.swift in Sources */, D57968CB29CB99EF00539069 /* VibrantButton.swift in Sources */, BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */, BFC57A652416C72400EB891E /* DeactivateAppOperation.swift in Sources */, D5CD805D29CA2C1E00E591B0 /* HeaderContentViewController.swift in Sources */, + D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */, BF3BEFC124086A1E00DE7D55 /* RefreshAppOperation.swift in Sources */, BFE60740231AFD2A002B0E8E /* InsetGroupTableViewCell.swift in Sources */, BF0DCA662433BDF500E3A595 /* AnalyticsManager.swift in Sources */, BFCCB51A245E3401001853EA /* VerifyAppOperation.swift in Sources */, BFF0B6982322CAB8007A79E1 /* InstructionsViewController.swift in Sources */, BF9ABA4522DCFF43008935CF /* BrowseViewController.swift in Sources */, - D5935AED29C39DE300C157EF /* SourceDetailsComponents.swift in Sources */, + D5935AED29C39DE300C157EF /* SourceComponents.swift in Sources */, D5A0537329B91DB400997551 /* SourceDetailContentViewController.swift in Sources */, BF770E5422BC044E002A40FE /* OperationContexts.swift in Sources */, BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */, @@ -3159,6 +3182,7 @@ BFF0B696232242D3007A79E1 /* LicensesViewController.swift in Sources */, BFD52BD422A0800A000B7ED1 /* ServerManager.swift in Sources */, D57FE84428C7DB7100216002 /* ErrorLogViewController.swift in Sources */, + D50107EC2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift in Sources */, D5151BD92A8FF64300C96F28 /* RefreshAllAppsIntent.swift in Sources */, BFBE0007250AD0E70080826E /* ViewAppIntentHandler.swift in Sources */, BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */, diff --git a/AltStore/App Detail/AppContentViewController.swift b/AltStore/App Detail/AppContentViewController.swift index 01affae1..b9e882b8 100644 --- a/AltStore/App Detail/AppContentViewController.swift +++ b/AltStore/App Detail/AppContentViewController.swift @@ -31,13 +31,6 @@ class AppContentViewController: UITableViewController private lazy var screenshotsDataSource = self.makeScreenshotsDataSource() - private lazy var dateFormatter: DateFormatter = { - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .medium - dateFormatter.timeStyle = .none - return dateFormatter - }() - private lazy var byteCountFormatter: ByteCountFormatter = { let formatter = ByteCountFormatter() return formatter @@ -84,7 +77,7 @@ class AppContentViewController: UITableViewController { self.versionDescriptionTextView.text = version.localizedDescription self.versionLabel.text = String(format: NSLocalizedString("Version %@", comment: ""), version.localizedVersion) - self.versionDateLabel.text = Date().relativeDateString(since: version.date, dateFormatter: self.dateFormatter) + self.versionDateLabel.text = Date().relativeDateString(since: version.date) self.sizeLabel.text = self.byteCountFormatter.string(fromByteCount: version.size) } else diff --git a/AltStore/App Detail/AppViewController.swift b/AltStore/App Detail/AppViewController.swift index 6f18aeb5..ce26fbe9 100644 --- a/AltStore/App Detail/AppViewController.swift +++ b/AltStore/App Detail/AppViewController.swift @@ -191,7 +191,21 @@ class AppViewController: UIViewController self._shouldResetLayout = false } - let statusBarHeight = self.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 + let statusBarHeight: Double + + if let navigationController, navigationController.presentingViewController != nil, navigationController.modalPresentationStyle != .fullScreen + { + statusBarHeight = 20 + } + else if let statusBarManager = self.view.window?.windowScene?.statusBarManager + { + statusBarHeight = statusBarManager.statusBarFrame.height + } + else + { + statusBarHeight = 0 + } + let cornerRadius = self.contentViewControllerShadowView.layer.cornerRadius let inset = 12 as CGFloat diff --git a/AltStore/Base.lproj/Main.storyboard b/AltStore/Base.lproj/Main.storyboard index c79fe870..bec67692 100644 --- a/AltStore/Base.lproj/Main.storyboard +++ b/AltStore/Base.lproj/Main.storyboard @@ -1,9 +1,8 @@ - + - - + @@ -36,11 +35,11 @@ - - - - + + + + @@ -67,16 +66,7 @@ - - - - - - - - - - + @@ -238,7 +228,7 @@ - + @@ -262,7 +252,7 @@ - + @@ -300,10 +290,10 @@ - + - - + + @@ -324,29 +314,29 @@ - + - + - + - + - + - + - + @@ -488,7 +478,7 @@ - + @@ -520,10 +510,10 @@ - + - + @@ -542,7 +532,7 @@ - + @@ -553,7 +543,7 @@ - + @@ -828,7 +818,7 @@ - + @@ -862,20 +852,20 @@ - + + + - + - - diff --git a/AltStore/Browse/BrowseViewController.swift b/AltStore/Browse/BrowseViewController.swift index 77838851..5451cd45 100644 --- a/AltStore/Browse/BrowseViewController.swift +++ b/AltStore/Browse/BrowseViewController.swift @@ -49,6 +49,8 @@ class BrowseViewController: UICollectionViewController, PeekPopPreviewing { super.viewDidLoad() + self.collectionView.backgroundColor = .altBackground + #if BETA self.dataSource.searchController.searchableKeyPaths = [#keyPath(InstalledApp.name)] self.navigationItem.searchController = self.dataSource.searchController @@ -91,11 +93,6 @@ class BrowseViewController: UICollectionViewController, PeekPopPreviewing self.update() } - - @IBAction private func unwindFromSourcesViewController(_ segue: UIStoryboardSegue) - { - self.fetchSource() - } } private extension BrowseViewController diff --git a/AltStore/Components/AppBannerCollectionViewCell.swift b/AltStore/Components/AppBannerCollectionViewCell.swift index 93a2a919..9e7813c0 100644 --- a/AltStore/Components/AppBannerCollectionViewCell.swift +++ b/AltStore/Components/AppBannerCollectionViewCell.swift @@ -8,12 +8,10 @@ import UIKit -class AppBannerCollectionViewCell: UICollectionViewCell +class AppBannerCollectionViewCell: UICollectionViewListCell { let bannerView = AppBannerView(frame: .zero) - private(set) var errorBadge: UIView! - override init(frame: CGRect) { super.init(frame: frame) @@ -30,43 +28,24 @@ class AppBannerCollectionViewCell: UICollectionViewCell private func initialize() { + // Prevent content "squishing" when scrolling offscreen. + self.insetsLayoutMarginsFromSafeArea = false + self.contentView.insetsLayoutMarginsFromSafeArea = false + self.bannerView.insetsLayoutMarginsFromSafeArea = false + + self.selectedBackgroundView = UIView() // Disable selection highlighting. + self.contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] self.contentView.preservesSuperviewLayoutMargins = true self.bannerView.translatesAutoresizingMaskIntoConstraints = false self.contentView.addSubview(self.bannerView) - let errorBadge = UIView() - errorBadge.translatesAutoresizingMaskIntoConstraints = false - errorBadge.isHidden = true - self.addSubview(errorBadge) - - // Solid background to make the X opaque white. - let backgroundView = UIView() - backgroundView.translatesAutoresizingMaskIntoConstraints = false - backgroundView.backgroundColor = .white - errorBadge.addSubview(backgroundView) - - let badgeView = UIImageView(image: UIImage(systemName: "exclamationmark.circle.fill")) - badgeView.preferredSymbolConfiguration = UIImage.SymbolConfiguration(scale: .large) - badgeView.tintColor = .systemRed - errorBadge.addSubview(badgeView, pinningEdgesWith: .zero) - NSLayoutConstraint.activate([ - self.bannerView.topAnchor.constraint(equalTo: self.contentView.topAnchor), - self.bannerView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor), + self.bannerView.topAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.topAnchor), + self.bannerView.bottomAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.bottomAnchor), self.bannerView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor), self.bannerView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor), - - errorBadge.centerXAnchor.constraint(equalTo: self.bannerView.trailingAnchor, constant: -5), - errorBadge.centerYAnchor.constraint(equalTo: self.bannerView.topAnchor, constant: 5), - - backgroundView.centerXAnchor.constraint(equalTo: badgeView.centerXAnchor), - backgroundView.centerYAnchor.constraint(equalTo: badgeView.centerYAnchor), - backgroundView.widthAnchor.constraint(equalTo: badgeView.widthAnchor, multiplier: 0.5), - backgroundView.heightAnchor.constraint(equalTo: badgeView.heightAnchor, multiplier: 0.5) ]) - - self.errorBadge = errorBadge } } diff --git a/AltStore/Components/AppBannerView.swift b/AltStore/Components/AppBannerView.swift index 02bd9609..8bf05098 100644 --- a/AltStore/Components/AppBannerView.swift +++ b/AltStore/Components/AppBannerView.swift @@ -11,6 +11,15 @@ import UIKit import AltStoreCore import Roxas +extension AppBannerView +{ + enum Style + { + case app + case source + } +} + class AppBannerView: RSTNibView { override var accessibilityLabel: String? { @@ -38,6 +47,8 @@ class AppBannerView: RSTNibView set { self.accessibilityView?.accessibilityTraits = newValue } } + var style: Style = .app + private var originalTintColor: UIColor? @IBOutlet var titleLabel: UILabel! @@ -50,8 +61,11 @@ class AppBannerView: RSTNibView @IBOutlet var backgroundEffectView: UIVisualEffectView! @IBOutlet private var vibrancyView: UIVisualEffectView! + @IBOutlet private var stackView: UIStackView! @IBOutlet private var accessibilityView: UIView! + @IBOutlet private var iconImageViewHeightConstraint: NSLayoutConstraint! + override init(frame: CGRect) { super.init(frame: frame) @@ -74,6 +88,10 @@ class AppBannerView: RSTNibView self.accessibilityElements = [self.accessibilityView, self.button].compactMap { $0 } self.betaBadgeView.isHidden = true + + self.layoutMargins = self.stackView.layoutMargins + self.stackView.preservesSuperviewLayoutMargins = true + self.stackView.isLayoutMarginsRelativeArrangement = true } override func tintColorDidChange() @@ -113,6 +131,8 @@ extension AppBannerView } } } + + self.style = .app let values = AppValues(app: app) self.titleLabel.text = app.name // Don't use values.name since that already includes "beta". @@ -129,6 +149,34 @@ extension AppBannerView self.accessibilityLabel = values.name } } + + func configure(for source: Source) + { + self.style = .source + + let subtitle: String + if let text = source.subtitle + { + subtitle = text + } + else if let scheme = source.sourceURL.scheme + { + subtitle = source.sourceURL.absoluteString.replacingOccurrences(of: scheme + "://", with: "") + } + else + { + subtitle = source.sourceURL.absoluteString + } + + self.titleLabel.text = source.name + self.subtitleLabel.text = subtitle + + let tintColor = source.effectiveTintColor ?? .altPrimary + self.tintColor = tintColor + + let accessibilityLabel = source.name + "\n" + subtitle + self.accessibilityLabel = accessibilityLabel + } } private extension AppBannerView @@ -138,7 +186,48 @@ private extension AppBannerView self.clipsToBounds = true self.layer.cornerRadius = 22 - self.subtitleLabel.textColor = self.originalTintColor ?? self.tintColor - self.backgroundEffectView.backgroundColor = self.originalTintColor ?? self.tintColor + let tintColor = self.originalTintColor ?? self.tintColor + self.subtitleLabel.textColor = tintColor + + switch self.style + { + case .app: + self.directionalLayoutMargins.trailing = self.stackView.directionalLayoutMargins.trailing + + self.iconImageViewHeightConstraint.constant = 60 + self.iconImageView.style = .icon + + self.titleLabel.textColor = .label + + self.button.style = .pill + + self.backgroundEffectView.contentView.backgroundColor = UIColor(resource: .blurTint) + self.backgroundEffectView.backgroundColor = tintColor + + case .source: + self.directionalLayoutMargins.trailing = 20 + + self.iconImageViewHeightConstraint.constant = 44 + self.iconImageView.style = .circular + + self.titleLabel.textColor = .white + + self.button.style = .custom + + self.backgroundEffectView.contentView.backgroundColor = tintColor?.adjustedForDisplay + self.backgroundEffectView.backgroundColor = nil + + if let tintColor, tintColor.isTooBright + { + let textVibrancyEffect = UIVibrancyEffect(blurEffect: .init(style: .systemChromeMaterialLight), style: .fill) + self.vibrancyView.effect = textVibrancyEffect + } + else + { + // Thinner == more dull + let textVibrancyEffect = UIVibrancyEffect(blurEffect: .init(style: .systemThinMaterialDark), style: .secondaryLabel) + self.vibrancyView.effect = textVibrancyEffect + } + } } } diff --git a/AltStore/Components/AppBannerView.xib b/AltStore/Components/AppBannerView.xib index 95337f61..e4d18eee 100644 --- a/AltStore/Components/AppBannerView.xib +++ b/AltStore/Components/AppBannerView.xib @@ -1,9 +1,9 @@ - + - + @@ -17,6 +17,8 @@ + + @@ -43,18 +45,18 @@ - + - + - + @@ -76,13 +78,13 @@ - + - + - + -