Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions TidepoolServiceKit/Extensions/PersistedPumpEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ extension PersistedPumpEvent: IdentifiableDatum {
return dataForRewind(for: userId, hostIdentifier: hostIdentifier, hostVersion: hostVersion)
case .suspend:
return dataForSuspend(for: userId, hostIdentifier: hostIdentifier, hostVersion: hostVersion)
case .timeZoneSync:
return dataForTimeZoneSync(for: userId, hostIdentifier: hostIdentifier, hostVersion: hostVersion)
default:
return []
}
Expand Down Expand Up @@ -173,6 +175,33 @@ extension PersistedPumpEvent: IdentifiableDatum {
origin: origin)
return [datum]
}

private func dataForTimeZoneSync(for userId: String, hostIdentifier: String, hostVersion: String) -> [TDatum] {
guard let type = type,
case let .timeZoneSync(fromSecondsFromGMT, toSecondsFromGMT) = type
else {
return []
}

let fromTime = formattedDateWithoutTimeZoneOffset(date, for: TimeZone(secondsFromGMT: fromSecondsFromGMT))
let toTime = formattedDateWithoutTimeZoneOffset(date, for: TimeZone(secondsFromGMT: toSecondsFromGMT))
var datum = TTimeChangeDeviceEventDatum(time: date,
from: TTimeChangeDeviceEventDatum.Info(time: fromTime),
to: TTimeChangeDeviceEventDatum.Info(time: toTime),
method: .manual)
let origin = datumOrigin(for: resolvedIdentifier(for: TTimeChangeDeviceEventDatum.self), hostIdentifier: hostIdentifier, hostVersion: hostVersion)
datum = datum.adornWith(id: datumId(for: userId, type: TTimeChangeDeviceEventDatum.self),
payload: datumPayload,
origin: origin)
return [datum]
}

private func formattedDateWithoutTimeZoneOffset(_ date: Date, for timeZone: TimeZone?) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = timeZone
return dateFormatter.string(from: date)
}

private var datumTime: Date { dose?.startDate ?? date }

Expand Down Expand Up @@ -223,3 +252,7 @@ extension TReservoirChangeDeviceEventDatum: TypedDatum {
extension TStatusDeviceEventDatum: TypedDatum {
static var resolvedType: String { "\(TDatum.DatumType.deviceEvent.rawValue)/\(TDeviceEventDatum.SubType.status.rawValue)" }
}

extension TTimeChangeDeviceEventDatum: TypedDatum {
static var resolvedType: String { "\(TDatum.DatumType.deviceEvent.rawValue)/\(TDeviceEventDatum.SubType.timeChange.rawValue)" }
}
31 changes: 1 addition & 30 deletions TidepoolServiceKit/TidepoolService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ public final class TidepoolService: Service, TAPIObserver, ObservableObject {

private let id: String


private var lastControllerSettingsDatum: TControllerSettingsDatum?

private var lastCGMSettingsDatum: TCGMSettingsDatum?
Expand All @@ -78,7 +77,7 @@ public final class TidepoolService: Service, TAPIObserver, ObservableObject {
private let tidepoolKitLog = OSLog(category: "TidepoolKit")

private var deviceLogUploader: DeviceLogUploader?

private func setDeviceLogUploaderDelegate() async {
await deviceLogUploader?.setDelegate(remoteDataServiceDelegate)
}
Expand All @@ -98,7 +97,6 @@ public final class TidepoolService: Service, TAPIObserver, ObservableObject {
await tapi.addObserver(self)
deviceLogUploader = DeviceLogUploader(api: tapi)
await setDeviceLogUploaderDelegate()
observeTimeZoneChanges()
}

public init?(rawState: RawStateValue) {
Expand Down Expand Up @@ -496,33 +494,6 @@ extension TidepoolService: RemoteDataService {

return (created, updated, lastControllerSettingsDatum, lastCGMSettingsDatum, lastPumpSettingsDatum)
}

private func uploadTimeZoneChangeData(from fromTimeZone: TimeZone, to toTimeZone: TimeZone, method: TTimeChangeDeviceEventDatum.Method = .automatic, at date: Date = Date()) async throws {
guard let userId = userId, let hostIdentifier = hostIdentifier, let hostVersion = hostVersion else {
throw TidepoolServiceError.configuration
}

let timeZoneChangeData = TTimeChangeDeviceEventDatum(time: date,
from: TTimeChangeDeviceEventDatum.Info(timeZoneName: fromTimeZone.identifier),
to: TTimeChangeDeviceEventDatum.Info(timeZoneName: toTimeZone.identifier),
method: method)
let _ = try await createData([timeZoneChangeData])
}

private func observeTimeZoneChanges() {
NotificationCenter.default.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: .main) { notification in
if let previousTimeZone = notification.object as? TimeZone {
let currentTimeZone = TimeZone.current
Task {
do {
try await self.uploadTimeZoneChangeData(from: previousTimeZone, to: currentTimeZone)
} catch {
self.log.error("Failed to upload time zone change data - %{public}@", error.localizedDescription)
}
}
}
}
}

private func createData(_ data: [TDatum]) async throws -> Bool {
if let error = error {
Expand Down