diff --git a/Sesame-Watch Watch App/ContentView.swift b/Sesame-Watch Watch App/UnlockView.swift similarity index 91% rename from Sesame-Watch Watch App/ContentView.swift rename to Sesame-Watch Watch App/UnlockView.swift index 4c445d7..f437ef7 100644 --- a/Sesame-Watch Watch App/ContentView.swift +++ b/Sesame-Watch Watch App/UnlockView.swift @@ -2,6 +2,7 @@ import SwiftUI import SwiftData import SFSafeSymbols import CryptoKit +import UIKit struct ContentView: View { @@ -40,7 +41,7 @@ struct ContentView: View { .aspectRatio(contentMode: .fit) .fontWeight(.ultraLight) .padding() - .onTapGesture(perform: coordinator.startUnlock) + .onTapGesture { unlock(quit: true) } if coordinator.isPerformingRequest { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -58,10 +59,14 @@ struct ContentView: View { guard launched else { return } + unlock(quit: true) didLaunchFromComplication = false - coordinator.startUnlock() } } + + private func unlock(quit: Bool) { + coordinator.startUnlock(quitAfterSuccess: quit) + } } #Preview { diff --git a/Sesame.xcodeproj/project.pbxproj b/Sesame.xcodeproj/project.pbxproj index 5968323..b623c55 100644 --- a/Sesame.xcodeproj/project.pbxproj +++ b/Sesame.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 884A45B7279F48C100D6E650 /* SesameApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45B6279F48C100D6E650 /* SesameApp.swift */; }; - 884A45B9279F48C100D6E650 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45B8279F48C100D6E650 /* ContentView.swift */; }; + 884A45B9279F48C100D6E650 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45B8279F48C100D6E650 /* MainView.swift */; }; 884A45BB279F48C300D6E650 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 884A45BA279F48C300D6E650 /* Assets.xcassets */; }; 884A45C5279F4BBE00D6E650 /* KeyManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45C4279F4BBE00D6E650 /* KeyManagement.swift */; }; 884A45CB27A464C000D6E650 /* SymmetricKey+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45CA27A464C000D6E650 /* SymmetricKey+Extensions.swift */; }; @@ -54,7 +54,7 @@ 88AEE3862B22376D0034EDA9 /* Message+Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88AEE3852B22376D0034EDA9 /* Message+Crypto.swift */; }; 88AEE3882B226FED0034EDA9 /* MessageResult+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88AEE3872B226FED0034EDA9 /* MessageResult+UI.swift */; }; 88E197B229EDC9BC00BF1D19 /* Sesame_WatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E197B129EDC9BC00BF1D19 /* Sesame_WatchApp.swift */; }; - 88E197B429EDC9BC00BF1D19 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E197B329EDC9BC00BF1D19 /* ContentView.swift */; }; + 88E197B429EDC9BC00BF1D19 /* UnlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88E197B329EDC9BC00BF1D19 /* UnlockView.swift */; }; 88E197B629EDC9BD00BF1D19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 88E197B529EDC9BD00BF1D19 /* Assets.xcassets */; }; 88E197C429EDCC8900BF1D19 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45CC27A465F500D6E650 /* Client.swift */; }; 88E197C729EDCCBD00BF1D19 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884A45CC27A465F500D6E650 /* Client.swift */; }; @@ -131,7 +131,7 @@ /* Begin PBXFileReference section */ 884A45B3279F48C100D6E650 /* Sesame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sesame.app; sourceTree = BUILT_PRODUCTS_DIR; }; 884A45B6279F48C100D6E650 /* SesameApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SesameApp.swift; sourceTree = ""; }; - 884A45B8279F48C100D6E650 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 884A45B8279F48C100D6E650 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; 884A45BA279F48C300D6E650 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 884A45C4279F4BBE00D6E650 /* KeyManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManagement.swift; sourceTree = ""; }; 884A45CA27A464C000D6E650 /* SymmetricKey+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SymmetricKey+Extensions.swift"; sourceTree = ""; }; @@ -159,7 +159,7 @@ 88AEE3872B226FED0034EDA9 /* MessageResult+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageResult+UI.swift"; sourceTree = ""; }; 88E197AC29EDC9BC00BF1D19 /* Sesame-Watch Watch App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Sesame-Watch Watch App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 88E197B129EDC9BC00BF1D19 /* Sesame_WatchApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sesame_WatchApp.swift; sourceTree = ""; }; - 88E197B329EDC9BC00BF1D19 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 88E197B329EDC9BC00BF1D19 /* UnlockView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnlockView.swift; sourceTree = ""; }; 88E197B529EDC9BD00BF1D19 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 88E197D629EDCFE800BF1D19 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; 88E35EF42B3B0A9800485A66 /* App+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "App+Extensions.swift"; sourceTree = ""; }; @@ -257,7 +257,7 @@ E2C5C1D92806FE4A00769EF6 /* API */, 8860D7442B2328B800849FAC /* API Extensions */, 884A45B6279F48C100D6E650 /* SesameApp.swift */, - 884A45B8279F48C100D6E650 /* ContentView.swift */, + 884A45B8279F48C100D6E650 /* MainView.swift */, E28DED2C281E840B00259690 /* SettingsView.swift */, E28DED2E281E8A0500259690 /* SingleKeyView.swift */, E25317542A8A1A07005A537D /* History */, @@ -308,7 +308,7 @@ 88E197B529EDC9BD00BF1D19 /* Assets.xcassets */, E24065562A819AAD009C1AD8 /* Settings */, 88E197B129EDC9BC00BF1D19 /* Sesame_WatchApp.swift */, - 88E197B329EDC9BC00BF1D19 /* ContentView.swift */, + 88E197B329EDC9BC00BF1D19 /* UnlockView.swift */, 888362332A80F3F90032BBB2 /* SettingsView.swift */, 888362352A80F4420032BBB2 /* HistoryView.swift */, E240655D2A822E97009C1AD8 /* HistoryListRow.swift */, @@ -548,7 +548,7 @@ buildActionMask = 2147483647; files = ( 884A45CF27A5402D00D6E650 /* MessageResult.swift in Sources */, - 884A45B9279F48C100D6E650 /* ContentView.swift in Sources */, + 884A45B9279F48C100D6E650 /* MainView.swift in Sources */, 88AEE3882B226FED0034EDA9 /* MessageResult+UI.swift in Sources */, E28DED2F281E8A0500259690 /* SingleKeyView.swift in Sources */, 888A11332B32DBBB0099A12B /* UInt8+Extensions.swift in Sources */, @@ -594,7 +594,7 @@ 8860D7662B23B5B200849FAC /* RequestCoordinator.swift in Sources */, 8860D75D2B237FC000849FAC /* Data+Coding.swift in Sources */, 888362342A80F3F90032BBB2 /* SettingsView.swift in Sources */, - 88E197B429EDC9BC00BF1D19 /* ContentView.swift in Sources */, + 88E197B429EDC9BC00BF1D19 /* UnlockView.swift in Sources */, E2F5DCCB2A88E976002858B9 /* Array+Extensions.swift in Sources */, E24065532A819614009C1AD8 /* SettingsNumberItemLink.swift in Sources */, 888362362A80F4420032BBB2 /* HistoryView.swift in Sources */, diff --git a/Sesame/Common/RequestCoordinator.swift b/Sesame/Common/RequestCoordinator.swift index f7b5f21..6fa12c5 100644 --- a/Sesame/Common/RequestCoordinator.swift +++ b/Sesame/Common/RequestCoordinator.swift @@ -58,13 +58,16 @@ final class RequestCoordinator: ObservableObject { } } - func startUnlock() { + func startUnlock(quitAfterSuccess: Bool = false) { guard !isPerformingRequest else { return } isPerformingRequest = true Task { let finalResult = await performFullChallengeResponse() + if finalResult == .unlocked, quitAfterSuccess { + exit(EXIT_SUCCESS) + } DispatchQueue.main.async { self.state = finalResult self.isPerformingRequest = false diff --git a/Sesame/ContentView.swift b/Sesame/MainView.swift similarity index 97% rename from Sesame/ContentView.swift rename to Sesame/MainView.swift index 0cf6432..9f5c184 100644 --- a/Sesame/ContentView.swift +++ b/Sesame/MainView.swift @@ -40,9 +40,8 @@ struct ContentView: View { .background(.white.opacity(0.2)) .cornerRadius(smallButtonSize / 2) .font(.title2) - } - Button("Unlock", action: coordinator.startUnlock) + Button("Unlock", action: unlock) .frame(width: unlockButtonSize, height: unlockButtonSize) .background(buttonBackground) .cornerRadius(unlockButtonSize / 2) @@ -82,7 +81,9 @@ struct ContentView: View { .preferredColorScheme(.dark) } - + private func unlock() { + coordinator.startUnlock() + } }