diff --git a/Palace.xcodeproj/project.pbxproj b/Palace.xcodeproj/project.pbxproj index 7393a85c6..f24c3069d 100644 --- a/Palace.xcodeproj/project.pbxproj +++ b/Palace.xcodeproj/project.pbxproj @@ -5655,7 +5655,7 @@ CODE_SIGN_IDENTITY = "Apple Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5714,7 +5714,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5899,7 +5899,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -5960,7 +5960,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6022,7 +6022,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; @@ -6083,7 +6083,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES_ERROR; CODE_SIGN_ENTITLEMENTS = Palace/SimplyE.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 278; + CURRENT_PROJECT_VERSION = 279; DEVELOPMENT_TEAM = 88CBA74T8K; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 88CBA74T8K; ENABLE_BITCODE = NO; diff --git a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift index c11b4acf2..acc0c2ccf 100644 --- a/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift +++ b/Palace/Book/UI/TPPBookCellDelegate+Extensions.swift @@ -12,13 +12,26 @@ import PalaceAudiobookToolkit let kServerUpdateDelay: Double = 30.0 let kTimerInterval: Double = 1.0 -//TODO: This is a temporary solution to enable location saves from AppDelegate. Investigate a global context to manage state and introduce caching. -var latestAudiobookLocation: (book: String, location: String)? - private struct AssociatedKeys { static var audiobookBookmarkBusinessLogic = "audiobookBookmarkBusinessLogic" } +private let locationQueue = DispatchQueue(label: "com.palace.latestAudiobookLocation", attributes: .concurrent) +private var _latestAudiobookLocation: (book: String, location: String)? + +var latestAudiobookLocation: (book: String, location: String)? { + get { + locationQueue.sync { + _latestAudiobookLocation + } + } + set { + locationQueue.async(flags: .barrier) { + _latestAudiobookLocation = newValue + } + } +} + extension TPPBookCellDelegate { public func postListeningPosition(at location: String, completion: ((_ response: AnnotationResponse?) -> Void)? = nil) { TPPAnnotations.postListeningPosition(forBook: self.book.identifier, selectorValue: location, completion: completion) @@ -31,14 +44,12 @@ extension TPPBookCellDelegate { return objc_getAssociatedObject(self, &AssociatedKeys.audiobookBookmarkBusinessLogic) as? AudiobookBookmarkBusinessLogic } set { - if let newValue = newValue { - objc_setAssociatedObject( - self, - &AssociatedKeys.audiobookBookmarkBusinessLogic, - newValue as AudiobookBookmarkBusinessLogic?, - .OBJC_ASSOCIATION_RETAIN_NONATOMIC - ) - } + objc_setAssociatedObject( + self, + &AssociatedKeys.audiobookBookmarkBusinessLogic, + newValue, + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) } } @@ -264,6 +275,7 @@ extension TPPBookCellDelegate { let locationString = String(data: locationData ?? Data(), encoding: .utf8) ?? "" TPPBookRegistry.shared.setLocation(TPPBookLocation(locationString: locationString, renderer: "PalaceAudiobookToolkit"), forIdentifier: self.book.identifier) + latestAudiobookLocation = (book: self.book.identifier, location: locationString) } } diff --git a/Palace/Reader2/Bookmarks/AudiobookBookmarkBusinessLogic.swift b/Palace/Reader2/Bookmarks/AudiobookBookmarkBusinessLogic.swift index 96b068088..4c5dc7822 100644 --- a/Palace/Reader2/Bookmarks/AudiobookBookmarkBusinessLogic.swift +++ b/Palace/Reader2/Bookmarks/AudiobookBookmarkBusinessLogic.swift @@ -30,8 +30,14 @@ import PalaceAudiobookToolkit } // MARK: - Bookmark Management - + public func saveListeningPosition(at position: TrackPosition, completion: ((String?) -> Void)?) { + debounce { + self.saveListeningPositionImmediate(at: position, completion: completion) + } + } + + private func saveListeningPositionImmediate(at position: TrackPosition, completion: ((String?) -> Void)?) { let audioBookmark = position.toAudioBookmark() audioBookmark.lastSavedTimeStamp = Date().iso8601 guard let tppLocation = audioBookmark.toTPPBookLocation() else { @@ -50,7 +56,7 @@ import PalaceAudiobookToolkit } } } - + public func saveBookmark(at position: TrackPosition, completion: ((_ position: TrackPosition?) -> Void)? = nil) { debounce { Task { diff --git a/ios-audiobooktoolkit b/ios-audiobooktoolkit index d0c05c0ea..ffa27a3e9 160000 --- a/ios-audiobooktoolkit +++ b/ios-audiobooktoolkit @@ -1 +1 @@ -Subproject commit d0c05c0ea88390a7b3cd6fedf1370fe2edc6de9a +Subproject commit ffa27a3e91f028065d8d3954610b545fdc096a75