From 31970c87c4f51bf8e38b6ca96d5e9412a28027de Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Fri, 15 Aug 2025 10:57:03 +0400 Subject: [PATCH] [ios] Remove all activities on track recording start and stop Closes https://github.com/organicmaps/organicmaps/issues/11045 1. Remove all activities on track recording start and stop 2. Store the latest activity id in the UD to retrieve on launch after the app termination Signed-off-by: Kiryl Kaveryn --- .../TrackRecordingActivityManager.swift | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/iphone/Maps/Core/TrackRecorder/TrackRecordingActivityManager.swift b/iphone/Maps/Core/TrackRecorder/TrackRecordingActivityManager.swift index d2ea6ed22..723c836dc 100644 --- a/iphone/Maps/Core/TrackRecorder/TrackRecordingActivityManager.swift +++ b/iphone/Maps/Core/TrackRecorder/TrackRecordingActivityManager.swift @@ -2,6 +2,8 @@ import ActivityKit #if canImport(ActivityKit) +private let kCurrentTrackRecordingLiveActivityIDKey = "kCurrentTrackRecordingLiveActivityIDKey" + protocol TrackRecordingActivityManager { func start(with info: TrackInfo) throws func update(_ info: TrackInfo) @@ -22,25 +24,39 @@ final class TrackRecordingLiveActivityManager { @available(iOS 16.2, *) extension TrackRecordingLiveActivityManager: TrackRecordingActivityManager { + func start(with info: TrackInfo) throws { - guard activity == nil else { return } + stop() let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info) let content = ActivityContent(state: state, staleDate: nil) let attributes = TrackRecordingLiveActivityAttributes() - activity = try LiveActivityManager.startActivity(attributes, content: content) + let activity = try LiveActivityManager.startActivity(attributes, content: content) + self.activity = activity + UserDefaults.standard.set(activity.id, forKey: kCurrentTrackRecordingLiveActivityIDKey) } func update(_ info: TrackInfo) { - guard let activity else { return } + guard let activity = activity ?? fetchCurrentActivity() else { + LOG(.warning, "No active TrackRecordingLiveActivity found to update.") + return + } let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info) let content = ActivityContent(state: state, staleDate: nil) + self.activity = activity LiveActivityManager.update(activity, content: content) } func stop() { - guard let activity else { return } - LiveActivityManager.stop(activity) - self.activity = nil + let activities = Activity.activities + activities.forEach(LiveActivityManager.stop) + activity = nil + UserDefaults.standard.removeObject(forKey: kCurrentTrackRecordingLiveActivityIDKey) + } + + private func fetchCurrentActivity() -> Activity? { + guard let id = UserDefaults.standard.string(forKey: kCurrentTrackRecordingLiveActivityIDKey) else { return nil } + let activities = Activity.activities + return activities.first(where: { $0.id == id }) } }