From 00e4da3f214289e2069c5be23a7024cedc1b1895 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Fri, 31 Jan 2025 13:06:11 +0100 Subject: [PATCH] Add export function --- TempTrack.xcodeproj/project.pbxproj | 27 +++++- .../xcshareddata/swiftpm/Package.resolved | 12 ++- .../UserInterfaceState.xcuserstate | Bin 100621 -> 113617 bytes TempTrack/Connection/BluetoothDevice.swift | 7 +- TempTrack/Connection/BluetoothScanner.swift | 7 +- TempTrack/ContentView.swift | 2 +- TempTrack/Storage/PersistentStorage.swift | 29 +++++++ TempTrack/TempTrackApp.swift | 21 +++-- TempTrack/Views/ExportSheet.swift | 81 ++++++++++++++++++ TempTrack/Views/HistoryList.swift | 16 +++- 10 files changed, 189 insertions(+), 13 deletions(-) create mode 100644 TempTrack/Views/ExportSheet.swift diff --git a/TempTrack.xcodeproj/project.pbxproj b/TempTrack.xcodeproj/project.pbxproj index a7fe1dd..6e2087f 100644 --- a/TempTrack.xcodeproj/project.pbxproj +++ b/TempTrack.xcodeproj/project.pbxproj @@ -47,6 +47,8 @@ E2E69B622A4D7C3100C6035E /* BluetoothScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2E69B612A4D7C3100C6035E /* BluetoothScanner.swift */; }; E2E69B662A4DA48B00C6035E /* BluetoothDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2E69B652A4DA48B00C6035E /* BluetoothDevice.swift */; }; E2E69B682A529FA800C6035E /* TransferHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2E69B672A529FA800C6035E /* TransferHandler.swift */; }; + E2FD1D6B2D4CE64300B48627 /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = E2FD1D6A2D4CE64300B48627 /* ZIPFoundation */; }; + E2FD1D6F2D4CE83700B48627 /* ExportSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FD1D6E2D4CE83700B48627 /* ExportSheet.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -90,6 +92,7 @@ E2E69B612A4D7C3100C6035E /* BluetoothScanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothScanner.swift; sourceTree = ""; }; E2E69B652A4DA48B00C6035E /* BluetoothDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothDevice.swift; sourceTree = ""; }; E2E69B672A529FA800C6035E /* TransferHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferHandler.swift; sourceTree = ""; }; + E2FD1D6E2D4CE83700B48627 /* ExportSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportSheet.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,6 +102,7 @@ files = ( 88404DD02A2E718B00D30244 /* BinaryCodable in Frameworks */, 88CDE0662A25D08F00114294 /* SFSafeSymbols in Frameworks */, + E2FD1D6B2D4CE64300B48627 /* ZIPFoundation in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -191,6 +195,7 @@ E2A553FE2A3A1024005204C3 /* DayView.swift */, E2A554042A4ADA93005204C3 /* TransferView.swift */, E2E69B5F2A4CD48F00C6035E /* IconAndTextView.swift */, + E2FD1D6E2D4CE83700B48627 /* ExportSheet.swift */, ); path = Views; sourceTree = ""; @@ -242,6 +247,7 @@ packageProductDependencies = ( 88CDE0652A25D08F00114294 /* SFSafeSymbols */, 88404DCF2A2E718B00D30244 /* BinaryCodable */, + E2FD1D6A2D4CE64300B48627 /* ZIPFoundation */, ); productName = TempTrack; productReference = 88CDE04B2A2508E900114294 /* TempTrack.app */; @@ -255,7 +261,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1620; TargetAttributes = { 88CDE04A2A2508E800114294 = { CreatedOnToolsVersion = 14.3; @@ -274,6 +280,7 @@ packageReferences = ( 88CDE0642A25D08F00114294 /* XCRemoteSwiftPackageReference "SFSafeSymbols" */, 88404DCE2A2E718B00D30244 /* XCRemoteSwiftPackageReference "BinaryCodable" */, + E2FD1D692D4CE64300B48627 /* XCRemoteSwiftPackageReference "ZIPFoundation" */, ); productRefGroup = 88CDE04C2A2508E900114294 /* Products */; projectDirPath = ""; @@ -316,6 +323,7 @@ 88CDE0682A2698B400114294 /* PersistentStorage.swift in Sources */, 88404DE92A31F7D500D30244 /* Data+Extensions.swift in Sources */, 88404DE52A31F23E00D30244 /* UInt16+Extensions.swift in Sources */, + E2FD1D6F2D4CE83700B48627 /* ExportSheet.swift in Sources */, 88404DD42A2F0DB100D30244 /* Date+Extensions.swift in Sources */, 88CDE0762A28AF0900114294 /* TemperatureValue.swift in Sources */, E2E69B622A4D7C3100C6035E /* BluetoothScanner.swift in Sources */, @@ -347,6 +355,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -379,6 +388,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -407,6 +417,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -439,6 +450,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -559,6 +571,14 @@ minimumVersion = 4.0.0; }; }; + E2FD1D692D4CE64300B48627 /* XCRemoteSwiftPackageReference "ZIPFoundation" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/weichsel/ZIPFoundation.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.9.19; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -572,6 +592,11 @@ package = 88CDE0642A25D08F00114294 /* XCRemoteSwiftPackageReference "SFSafeSymbols" */; productName = SFSafeSymbols; }; + E2FD1D6A2D4CE64300B48627 /* ZIPFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = E2FD1D692D4CE64300B48627 /* XCRemoteSwiftPackageReference "ZIPFoundation" */; + productName = ZIPFoundation; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 88CDE0432A2508E800114294 /* Project object */; diff --git a/TempTrack.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TempTrack.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b4fdc68..5045d0d 100644 --- a/TempTrack.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/TempTrack.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "4621142a3796c58656af35df5ada2f08fe05daffacc1a501de8eebaaafda9339", "pins" : [ { "identity" : "binarycodable", @@ -17,7 +18,16 @@ "revision" : "7cca2d60925876b5953a2cf7341cd80fbeac983c", "version" : "4.1.1" } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "02b6abe5f6eef7e3cbd5f247c5cc24e246efcfe0", + "version" : "0.9.19" + } } ], - "version" : 2 + "version" : 3 } diff --git a/TempTrack.xcodeproj/project.xcworkspace/xcuserdata/ch.xcuserdatad/UserInterfaceState.xcuserstate b/TempTrack.xcodeproj/project.xcworkspace/xcuserdata/ch.xcuserdatad/UserInterfaceState.xcuserstate index 4e782c272330304175ad3f86e27238380d3ce552..fa979f4f63793d4813095b38561fdb2d51e77082 100644 GIT binary patch literal 113617 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 literal 100621 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%0D-h+-cR`6gda*E-3anw__GOrDdBG*{QZP~ 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 H-uM0+hkv-T diff --git a/TempTrack/Connection/BluetoothDevice.swift b/TempTrack/Connection/BluetoothDevice.swift index 578f732..79fa665 100644 --- a/TempTrack/Connection/BluetoothDevice.swift +++ b/TempTrack/Connection/BluetoothDevice.swift @@ -8,6 +8,8 @@ protocol BluetoothDeviceDelegate: AnyObject { actor BluetoothDevice: NSObject, ObservableObject { + private let storage: PersistentStorage! + let peripheral: CBPeripheral! private let characteristic: CBCharacteristic! @@ -24,9 +26,10 @@ actor BluetoothDevice: NSObject, ObservableObject { self.delegate = delegate } - init(peripheral: CBPeripheral, characteristic: CBCharacteristic) { + init(storage: PersistentStorage, peripheral: CBPeripheral, characteristic: CBCharacteristic) { self.peripheral = peripheral self.characteristic = characteristic + self.storage = storage super.init() peripheral.delegate = self @@ -35,6 +38,7 @@ actor BluetoothDevice: NSObject, ObservableObject { override init() { self.peripheral = nil self.characteristic = nil + self.storage = nil super.init() } @@ -46,7 +50,6 @@ actor BluetoothDevice: NSObject, ObservableObject { } lastDeviceInfo = info delegate?.bluetoothDevice(didUpdate: info) - #warning("Don't use global variable") storage.save(deviceInfo: info) } diff --git a/TempTrack/Connection/BluetoothScanner.swift b/TempTrack/Connection/BluetoothScanner.swift index ac9212d..c6a05cd 100644 --- a/TempTrack/Connection/BluetoothScanner.swift +++ b/TempTrack/Connection/BluetoothScanner.swift @@ -15,6 +15,8 @@ final class BluetoothScanner: NSObject, CBCentralManagerDelegate, ObservableObje private let characteristicUUID = CBUUID(string: "22071991-cccc-cccc-cccc-000000000002") + let storage: PersistentStorage! + private var manager: CBCentralManager! = nil @Published @@ -71,7 +73,8 @@ final class BluetoothScanner: NSObject, CBCentralManagerDelegate, ObservableObje } } - override init() { + init(storage: PersistentStorage) { + self.storage = storage connectionState = .noDeviceFound super.init() self.manager = CBCentralManager(delegate: self, queue: nil) @@ -200,7 +203,7 @@ extension BluetoothScanner: CBPeripheralDelegate { return } - configuredDevice = .init(peripheral: peripheral, characteristic: desiredCharacteristic) + configuredDevice = .init(storage: storage, peripheral: peripheral, characteristic: desiredCharacteristic) Task { await configuredDevice?.set(delegate: self) } diff --git a/TempTrack/ContentView.swift b/TempTrack/ContentView.swift index ba17acf..c6350ac 100644 --- a/TempTrack/ContentView.swift +++ b/TempTrack/ContentView.swift @@ -271,7 +271,7 @@ struct ContentView: View { struct ContentView_Previews: PreviewProvider { static var previews: some View { let storage = PersistentStorage(lastMeasurements: TemperatureMeasurement.mockData) - ContentView(scanner: .init()) + ContentView(scanner: .init(storage: storage)) .environmentObject(storage) } } diff --git a/TempTrack/Storage/PersistentStorage.swift b/TempTrack/Storage/PersistentStorage.swift index 57d8c56..c3be288 100644 --- a/TempTrack/Storage/PersistentStorage.swift +++ b/TempTrack/Storage/PersistentStorage.swift @@ -2,6 +2,7 @@ import Foundation import Combine import BinaryCodable import SwiftUI +import ZIPFoundation final class PersistentStorage: ObservableObject { @@ -353,6 +354,34 @@ final class PersistentStorage: ObservableObject { defer { updateTransferCount() } return save(data: data, date: date, in: "transfers") } + + // MARK: Export + + private var zipArchive: URL { + FileManager.default.temporaryDirectory.appendingPathComponent("data.zip") + } + + func createZip() throws -> URL { + // Define the destination zip file path + let archive = zipArchive + + // Create the zip file + try FileManager.default.zipItem( + at: PersistentStorage.documentDirectory, + to: archive, + shouldKeepParent: false, + compressionMethod: .deflate) + return archive + } + + func removeZipArchive() throws { + let archive = zipArchive + // Remove existing zip file if it exists + if FileManager.default.fileExists(atPath: archive.path) { + print("Removing archive file") + try FileManager.default.removeItem(at: archive) + } + } } private extension Array where Element == TemperatureMeasurement { diff --git a/TempTrack/TempTrackApp.swift b/TempTrack/TempTrackApp.swift index 8bef630..3514afa 100644 --- a/TempTrack/TempTrackApp.swift +++ b/TempTrack/TempTrackApp.swift @@ -1,14 +1,25 @@ import SwiftUI -let storage = PersistentStorage() -private let scanner = BluetoothScanner() - -private let transfer = TransferHandler() @main struct TempTrackApp: App { - + + @StateObject + private var storage: PersistentStorage + + @StateObject + private var scanner: BluetoothScanner + + @StateObject + private var transfer = TransferHandler() + + init() { + let storage = PersistentStorage() + self._scanner = .init(wrappedValue: .init(storage: storage)) + self._storage = .init(wrappedValue: storage) + } + var body: some Scene { WindowGroup { ContentView(scanner: scanner) diff --git a/TempTrack/Views/ExportSheet.swift b/TempTrack/Views/ExportSheet.swift new file mode 100644 index 0000000..1517a67 --- /dev/null +++ b/TempTrack/Views/ExportSheet.swift @@ -0,0 +1,81 @@ +import SwiftUI + +struct ExportSheet: View { + + @Binding var isPresented: Bool + + @State + private var isCreatingArchive = false + + @State var url: URL? + + @State var error: String? + + @EnvironmentObject + private var storage: PersistentStorage + + var body: some View { + VStack { + Text("Export") + .font(.title) + Text("Create a zip file of all stored data and share it.") + if isCreatingArchive { + ProgressView() + Text("Creating archive...") + } + if let error { + Text(error) + .foregroundStyle(.red) + } + Spacer() + Button("Create archive", action: createArchive) + .disabled(isCreatingArchive) + .padding() + if let url { + ShareLink(item: url) { + Label("Share archive", systemImage: "square.and.arrow.up") + } + .padding() + Button("Delete archive", action: deleteArchive) + .padding() + } + } + .padding() + } + + private func createArchive() { + guard !isCreatingArchive else { + return + } + isCreatingArchive = true + DispatchQueue.main.async { + do { + let url = try storage.createZip() + DispatchQueue.main.async { + self.url = url + self.error = nil + self.isCreatingArchive = false + } + } catch { + DispatchQueue.main.async { + self.error = "Failed to create archive: \(error.localizedDescription)" + self.isCreatingArchive = false + } + } + } + } + + private func deleteArchive() { + do { + try storage.removeZipArchive() + self.error = nil + self.url = nil + } catch { + self.error = "Failed to delete archive: \(error.localizedDescription)" + } + } +} + +#Preview { + ExportSheet(isPresented: .constant(true)) +} diff --git a/TempTrack/Views/HistoryList.swift b/TempTrack/Views/HistoryList.swift index 7c3a1af..c6f4574 100644 --- a/TempTrack/Views/HistoryList.swift +++ b/TempTrack/Views/HistoryList.swift @@ -1,10 +1,14 @@ import SwiftUI +import SFSafeSymbols struct HistoryList: View { @EnvironmentObject var storage: PersistentStorage - + + @State + private var showExportSheet = false + var body: some View { NavigationView { List(storage.dailyMeasurementCounts) { day in @@ -25,6 +29,16 @@ struct HistoryList: View { } .navigationTitle("History") .navigationBarTitleDisplayMode(.large) + .toolbar { + ToolbarItem { + Button(action: { showExportSheet = true }) { + Label("Export", systemSymbol: .arrowUpDoc) + } + } + } + .sheet(isPresented: $showExportSheet) { + ExportSheet(isPresented: $showExportSheet) + } } }