From e06cca82240c00e5b3f8750efe96411f307a314b Mon Sep 17 00:00:00 2001 From: naturecodevoid <44983869+naturecodevoid@users.noreply.github.com> Date: Sat, 20 May 2023 12:25:07 -0700 Subject: [PATCH] Fixes (see commit description) - Fix issue caused by merge - Improve icons in onboarding - Use onboarding's pairing file step properly --- AltStore.xcodeproj/project.pbxproj | 56 +++++++++---------- AltStore/LaunchViewController.swift | 31 ++-------- AltStore/Operations/OperationError.swift | 1 - .../Views/Onboarding/AppIconsShowcase.swift | 39 +++++++------ .../Views/Onboarding/OnboardingView.swift | 26 +++++---- 5 files changed, 69 insertions(+), 84 deletions(-) diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 7343eb52..ae1049fc 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -80,10 +80,6 @@ 1FB96FCF292BBBCA007E68D1 /* SiriShortcutSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB96FCE292BBBC9007E68D1 /* SiriShortcutSetupView.swift */; }; 1FB96FEC292C171D007E68D1 /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB96FEB292C171D007E68D1 /* NotificationManager.swift */; }; 1FB96FF3292D0539007E68D1 /* PillButtonProgressViewStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB96FF2292D0539007E68D1 /* PillButtonProgressViewStyle.swift */; }; - 992C896029A6A56500FB3501 /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 992C895F29A6A56500FB3501 /* LocalConsole */; }; - 994D6E9B29E326080045B3F7 /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1729D8E4C900B40039 /* minimuxer.swift */; }; - 994D6EB529E35C130045B3F7 /* StoreApp+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 994D6EB429E35C130045B3F7 /* StoreApp+SideStore.swift */; }; - 99BCB7DF29A2AC050041D1A7 /* AdvancedSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BCB7DE29A2AC050041D1A7 /* AdvancedSettingsView.swift */; }; 1FF8C6182A1780C60041352C /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FF8C6172A1780C60041352C /* ActivityView.swift */; }; 1FF8C61B2A1782F10041352C /* Reachability in Frameworks */ = {isa = PBXBuildFile; productRef = 1FF8C61A2A1782F10041352C /* Reachability */; }; 1FFA56C2299994390011B6F5 /* OutputCapturer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FFA56C1299994390011B6F5 /* OutputCapturer.swift */; }; @@ -93,6 +89,10 @@ 990D2AE22A1910CD0055D93C /* UnstableFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 990D2AE12A1910CD0055D93C /* UnstableFeatures.swift */; }; 990D2AF02A192E060055D93C /* UIApplication+Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 990D2AEF2A192E060055D93C /* UIApplication+Alert.swift */; }; 9922FFEC29B501C50020F868 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 9922FFEB29B501C50020F868 /* Starscream */; }; + 992C896029A6A56500FB3501 /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 992C895F29A6A56500FB3501 /* LocalConsole */; }; + 994D6E9B29E326080045B3F7 /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1729D8E4C900B40039 /* minimuxer.swift */; }; + 994D6EB529E35C130045B3F7 /* StoreApp+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 994D6EB429E35C130045B3F7 /* StoreApp+SideStore.swift */; }; + 99BCB7DF29A2AC050041D1A7 /* AdvancedSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BCB7DE29A2AC050041D1A7 /* AdvancedSettingsView.swift */; }; 99C4EF4D2979132100CB538D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = 99C4EF4C2979132100CB538D /* SemanticVersion */; }; 99D87A60299F1B1100ED09A9 /* DevModeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D87A5F299F1B1100ED09A9 /* DevModeView.swift */; }; 99D87A62299F3EC300ED09A9 /* FileExplorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D87A61299F3EC300ED09A9 /* FileExplorer.swift */; }; @@ -590,8 +590,6 @@ 191E5FD1290A651D001A3B7C /* jsmn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jsmn.h; path = Dependencies/libplist/src/jsmn.h; sourceTree = SOURCE_ROOT; }; 1920B04E2924AC8300744F60 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = ""; }; - 990D2AE12A1910CD0055D93C /* UnstableFeatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnstableFeatures.swift; sourceTree = ""; }; - 990D2AEF2A192E060055D93C /* UIApplication+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Alert.swift"; sourceTree = ""; }; 1F07F551295455A300F7BE95 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 1F07F554295458D800F7BE95 /* Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; 1F07F555295458D800F7BE95 /* Localizations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Localizations.swift; sourceTree = ""; }; @@ -652,10 +650,12 @@ 1FB96FCE292BBBC9007E68D1 /* SiriShortcutSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiriShortcutSetupView.swift; sourceTree = ""; }; 1FB96FEB292C171D007E68D1 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; 1FB96FF2292D0539007E68D1 /* PillButtonProgressViewStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButtonProgressViewStyle.swift; sourceTree = ""; }; - 994D6EB429E35C130045B3F7 /* StoreApp+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StoreApp+SideStore.swift"; sourceTree = ""; }; 1FF8C6172A1780C60041352C /* ActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; }; 1FFA56C1299994390011B6F5 /* OutputCapturer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutputCapturer.swift; sourceTree = ""; }; 1FFEF103298552DB0098374C /* AppVersionHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersionHistoryView.swift; sourceTree = ""; }; + 990D2AE12A1910CD0055D93C /* UnstableFeatures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnstableFeatures.swift; sourceTree = ""; }; + 990D2AEF2A192E060055D93C /* UIApplication+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Alert.swift"; sourceTree = ""; }; + 994D6EB429E35C130045B3F7 /* StoreApp+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StoreApp+SideStore.swift"; sourceTree = ""; }; 9961EC2D29BE9F2E00AF2C6F /* minimuxer-helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "minimuxer-helpers.swift"; path = "Dependencies/minimuxer/minimuxer-helpers.swift"; sourceTree = SOURCE_ROOT; }; 99BCB7DE29A2AC050041D1A7 /* AdvancedSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsView.swift; sourceTree = ""; }; 99D87A5F299F1B1100ED09A9 /* DevModeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DevModeView.swift; sourceTree = ""; }; @@ -1131,14 +1131,6 @@ path = "libimobiledevice-glue/src"; sourceTree = ""; }; - 990D2AE02A1910920055D93C /* Unstable Features */ = { - isa = PBXGroup; - children = ( - 990D2AE12A1910CD0055D93C /* UnstableFeatures.swift */, - ); - path = "Unstable Features"; - sourceTree = ""; - }; 1F07F553295458D800F7BE95 /* Generated */ = { isa = PBXGroup; children = ( @@ -1331,6 +1323,14 @@ path = Styles; sourceTree = ""; }; + 990D2AE02A1910920055D93C /* Unstable Features */ = { + isa = PBXGroup; + children = ( + 990D2AE12A1910CD0055D93C /* UnstableFeatures.swift */, + ); + path = "Unstable Features"; + sourceTree = ""; + }; 99F87D1429D8E3F100B40039 /* Generated */ = { isa = PBXGroup; children = ( @@ -3891,14 +3891,6 @@ minimumVersion = 1.1.180; }; }; - 992C895E29A6A56500FB3501 /* XCRemoteSwiftPackageReference "LocalConsole" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/naturecodevoid/LocalConsole.git"; - requirement = { - branch = main; - kind = branch; - }; - }; 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/daltoniam/Starscream.git"; @@ -3907,6 +3899,14 @@ minimumVersion = 4.0.0; }; }; + 992C895E29A6A56500FB3501 /* XCRemoteSwiftPackageReference "LocalConsole" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/naturecodevoid/LocalConsole.git"; + requirement = { + branch = main; + kind = branch; + }; + }; 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SwiftPackageIndex/SemanticVersion.git"; @@ -4027,16 +4027,16 @@ package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */; productName = OpenSSL; }; - 992C895F29A6A56500FB3501 /* LocalConsole */ = { - isa = XCSwiftPackageProductDependency; - package = 992C895E29A6A56500FB3501 /* XCRemoteSwiftPackageReference "LocalConsole" */; - productName = LocalConsole; - }; 9922FFEB29B501C50020F868 /* Starscream */ = { isa = XCSwiftPackageProductDependency; package = 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */; productName = Starscream; }; + 992C895F29A6A56500FB3501 /* LocalConsole */ = { + isa = XCSwiftPackageProductDependency; + package = 992C895E29A6A56500FB3501 /* XCRemoteSwiftPackageReference "LocalConsole" */; + productName = LocalConsole; + }; 99C4EF4C2979132100CB538D /* SemanticVersion */ = { isa = XCSwiftPackageProductDependency; package = 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */; diff --git a/AltStore/LaunchViewController.swift b/AltStore/LaunchViewController.swift index 74f9b088..bbe41843 100644 --- a/AltStore/LaunchViewController.swift +++ b/AltStore/LaunchViewController.swift @@ -62,15 +62,15 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg start_em_proxy(bind_addr: Consts.Proxy.serverURL) guard let pf = fetchPairingFile() else { - self.showOnboarding(step: .pairing) + self.showOnboarding(step: .pairing, closeAfterPairing: true) return } start_minimuxer_threads(pf) #endif } - func showOnboarding(step: OnboardingView.OnboardingStep = .welcome) { - let onboardingView = OnboardingView(onDismiss: { self.dismiss(animated: true) }, currentStep: step) + func showOnboarding(step: OnboardingView.OnboardingStep = .welcome, closeAfterPairing: Bool = false) { + let onboardingView = OnboardingView(onDismiss: { self.dismiss(animated: true) }, closeAfterPairing: closeAfterPairing, currentStep: step) .environment(\.managedObjectContext, DatabaseManager.shared.viewContext) let navigationController = UINavigationController(rootViewController: UIHostingController(rootView: onboardingView)) navigationController.isNavigationBarHidden = true @@ -96,31 +96,8 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg } else if let plistString = Bundle.main.object(forInfoDictionaryKey: "ALTPairingFile") as? String, !plistString.isEmpty, !plistString.contains("insert pairing file here"){ print("Loaded ALTPairingFile from Info.plist") return plistString - } else { - // Show an alert explaining the pairing file - // Create new Alert - let dialogMessage = UIAlertController(title: "Pairing File", message: "Select the pairing file for your device. For more information, go to https://wiki.sidestore.io/guides/install#pairing-process", preferredStyle: .alert) - - // Create OK button with action handler - let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in - // Try to load it from a file picker - var types = UTType.types(tag: "plist", tagClass: UTTagClass.filenameExtension, conformingTo: nil) - types.append(contentsOf: UTType.types(tag: "mobiledevicepairing", tagClass: UTTagClass.filenameExtension, conformingTo: UTType.data)) - types.append(.xml) - let documentPickerController = UIDocumentPickerViewController(forOpeningContentTypes: types) - documentPickerController.shouldShowFileExtensions = true - documentPickerController.delegate = self - self.present(documentPickerController, animated: true, completion: nil) - }) - - //Add OK button to a dialog message - dialogMessage.addAction(ok) - - // Present Alert to - self.present(dialogMessage, animated: true, completion: nil) - - return nil } + return nil } func displayError(_ msg: String) { diff --git a/AltStore/Operations/OperationError.swift b/AltStore/Operations/OperationError.swift index 0398ce4d..7829502a 100644 --- a/AltStore/Operations/OperationError.swift +++ b/AltStore/Operations/OperationError.swift @@ -163,5 +163,4 @@ extension MinimuxerError: LocalizedError { fileprivate func setArgument(name: String) -> String { return String(format: NSLocalizedString("Cannot set %@ on the device.", comment: ""), name) } - return error as! OperationError } diff --git a/AltStore/Views/Onboarding/AppIconsShowcase.swift b/AltStore/Views/Onboarding/AppIconsShowcase.swift index 7b78a4fc..78a576ef 100644 --- a/AltStore/Views/Onboarding/AppIconsShowcase.swift +++ b/AltStore/Views/Onboarding/AppIconsShowcase.swift @@ -17,47 +17,52 @@ struct AppIconsShowcase: View { VStack { GeometryReader { proxy in ZStack(alignment: .bottom) { - Image(uiImage: UIImage(named: "AppIcon")!) + // left + Image(uiImage: UIImage(named: "Midnight-image")!) .resizable() .aspectRatio(contentMode: .fit) .frame(height: 0.2 * proxy.size.width) - .clipShape(RoundedRectangle(cornerRadius: 24, style: .circular)) - .offset(x: -0.3*proxy.size.width * self.animationProgress, y: -30) + .cornerRadius(0.2 * proxy.size.width * 0.234) + .offset(x: -0.3 * proxy.size.width * self.animationProgress, y: -30) .rotationEffect(.degrees(-20 * self.animationProgress)) .shadow(radius: 8 * self.animationProgress) - Image(uiImage: UIImage(named: "AppIcon")!) + // center-left + Image(uiImage: UIImage(named: "Steel-image")!) .resizable() .aspectRatio(contentMode: .fit) .frame(height: 0.25 * proxy.size.width) - .clipShape(RoundedRectangle(cornerRadius: 24, style: .circular)) - .offset(x: -0.15*proxy.size.width * self.animationProgress, y: -10) + .cornerRadius(0.25 * proxy.size.width * 0.234) + .offset(x: -0.15 * proxy.size.width * self.animationProgress, y: -10) .rotationEffect(.degrees(-10 * self.animationProgress)) .shadow(radius: 12 * self.animationProgress) - Image(uiImage: UIImage(named: "AppIcon")!) + // right + Image(uiImage: UIImage(named: "Storm-image")!) .resizable() .aspectRatio(contentMode: .fit) .frame(height: 0.2 * proxy.size.width) - .clipShape(RoundedRectangle(cornerRadius: 24, style: .circular)) - .offset(x: self.animationProgress*0.3*proxy.size.width, y: -30) - .rotationEffect(.degrees(self.animationProgress*20)) + .cornerRadius(0.2 * proxy.size.width * 0.234) + .offset(x: self.animationProgress * 0.3 * proxy.size.width, y: -30) + .rotationEffect(.degrees(self.animationProgress * 20)) .shadow(radius: 8 * self.animationProgress) - - Image(uiImage: UIImage(named: "AppIcon")!) + + // center-right + Image(uiImage: UIImage(named: "Starburst-image")!) .resizable() .aspectRatio(contentMode: .fit) .frame(height: 0.25 * proxy.size.width) - .clipShape(RoundedRectangle(cornerRadius: 24, style: .circular)) - .offset(x: self.animationProgress * 0.15*proxy.size.width, y: -10) + .cornerRadius(0.25 * proxy.size.width * 0.234) + .offset(x: self.animationProgress * 0.15 * proxy.size.width, y: -10) .rotationEffect(.degrees(self.animationProgress * 10)) .shadow(radius: 12 * self.animationProgress) - - Image(uiImage: UIImage(named: "AppIcon")!) + + // center + Image(uiImage: UIImage(named: "Neon-image")!) .resizable() .aspectRatio(contentMode: .fit) .frame(height: 0.3 * proxy.size.width) - .clipShape(RoundedRectangle(cornerRadius: 24, style: .circular)) + .cornerRadius(0.3 * proxy.size.width * 0.234) .shadow(radius: 16 * self.animationProgress + 8 * self.animation2Progress) .scaleEffect(1.0 + 0.05 * self.animation2Progress) } diff --git a/AltStore/Views/Onboarding/OnboardingView.swift b/AltStore/Views/Onboarding/OnboardingView.swift index 53e5e799..137202e0 100644 --- a/AltStore/Views/Onboarding/OnboardingView.swift +++ b/AltStore/Views/Onboarding/OnboardingView.swift @@ -23,8 +23,10 @@ struct OnboardingView: View { // Temporary workaround for UIKit compatibility var onDismiss: (() -> Void)? = nil + + var closeAfterPairing = false - @State var currentStep: OnboardingStep = .wireguard //.welcome + @State var currentStep: OnboardingStep = .welcome @State private var pairingFileURL: URL? = nil @State private var isWireGuardAppStorePageVisible: Bool = false @State private var isDownloadingWireGuardProfile: Bool = false @@ -269,25 +271,27 @@ extension OnboardingView { do { // Read to a string let data = try Data(contentsOf: url) - let pairing_string = String(bytes: data, encoding: .utf8) - if pairing_string == nil { - // TODO: Show error message + let pairingString = String(bytes: data, encoding: .utf8) + if pairingString == nil { + // TODO: Show error message (this will only be triggered if the pairing file is not UTF8) debugPrint("Unable to read pairing file") // displayError("Unable to read pairing file") } // Save to a file for next launch let filename = "ALTPairingFile.mobiledevicepairing" - let fm = FileManager.default - let documentsPath = fm.documentsDirectory.appendingPathComponent("/\(filename)") - try pairing_string?.write(to: documentsPath, atomically: true, encoding: String.Encoding.utf8) + let documentsPath = FileManager.default.documentsDirectory.appendingPathComponent("/\(filename)") + try pairingString?.write(to: documentsPath, atomically: true, encoding: String.Encoding.utf8) // Start minimuxer now that we have a file - start_minimuxer_threads(pairing_string!) - - // Show the next onboarding step - self.showNextStep() + start_minimuxer_threads(pairingString!) + // Show the next onboarding step, or finish onboarding + if !self.closeAfterPairing { + self.showNextStep() + } else { + self.finishOnboarding() + } } catch { NotificationManager.shared.reportError(error: error) }