Tweak iCloud timeline sync

This commit is contained in:
Shadowfacts 2022-12-25 09:59:35 -05:00
parent 3cba0bce34
commit 967bff063b
1 changed files with 23 additions and 23 deletions

View File

@ -134,7 +134,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
} }
.debounce(for: .milliseconds(500), scheduler: DispatchQueue.main) .debounce(for: .milliseconds(500), scheduler: DispatchQueue.main)
.sink { [unowned self] _ in .sink { [unowned self] _ in
_ = promptToSyncPositionIfNecessary() _ = syncPositionIfNecessary(alwaysPrompt: true)
} }
.store(in: &cancellables) .store(in: &cancellables)
} }
@ -225,11 +225,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
} }
} }
} else { } else {
if promptToSyncPositionIfNecessary() { syncAndCheckPresentIfEnoughTimeElapsed()
// no-op
} else {
checkPresentIfEnoughTimeElapsed()
}
} }
} }
@ -448,11 +444,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
view.window?.windowScene == scene else { view.window?.windowScene == scene else {
return return
} }
if promptToSyncPositionIfNecessary() { syncAndCheckPresentIfEnoughTimeElapsed()
// no-op
} else {
checkPresentIfEnoughTimeElapsed()
}
} }
@objc private func sceneDidEnterBackground(_ notification: Foundation.Notification) { @objc private func sceneDidEnterBackground(_ notification: Foundation.Notification) {
@ -465,7 +457,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
saveState() saveState()
} }
private func promptToSyncPositionIfNecessary() -> Bool { private func syncPositionIfNecessary(alwaysPrompt: Bool) -> Bool {
guard persistsState, guard persistsState,
let timelinePosition = mastodonController.persistentContainer.getTimelinePosition(timeline: timeline) else { let timelinePosition = mastodonController.persistentContainer.getTimelinePosition(timeline: timeline) else {
return false return false
@ -491,6 +483,9 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
guard timelinePosition.centerStatusID != centerVisibleStatusID else { guard timelinePosition.centerStatusID != centerVisibleStatusID else {
return false return false
} }
if !alwaysPrompt {
_ = self.restoreState()
} else {
var config = ToastConfiguration(title: "Sync Position") var config = ToastConfiguration(title: "Sync Position")
config.edge = .top config.edge = .top
config.dismissAutomaticallyAfter = 5 config.dismissAutomaticallyAfter = 5
@ -501,6 +496,7 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
} }
showToast(configuration: config, animated: true) showToast(configuration: config, animated: true)
UIAccessibility.post(notification: .announcement, argument: "Synced Position Updated") UIAccessibility.post(notification: .announcement, argument: "Synced Position Updated")
}
return true return true
} }
@ -529,16 +525,20 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
} }
} }
private func checkPresentIfEnoughTimeElapsed() { private func syncAndCheckPresentIfEnoughTimeElapsed() {
guard let disappearedAt, guard let disappearedAt,
-disappearedAt.timeIntervalSinceNow > 60 * 60 /* 1 hour */ else { -disappearedAt.timeIntervalSinceNow > 60 * 60 /* 1 hour */ else {
return return
} }
self.disappearedAt = nil self.disappearedAt = nil
if syncPositionIfNecessary(alwaysPrompt: false) {
// no-op
} else {
Task { Task {
await checkPresent(jumpImmediately: false) await checkPresent(jumpImmediately: false)
} }
} }
}
func checkPresent(jumpImmediately: Bool) async { func checkPresent(jumpImmediately: Bool) async {
if case .idle = controller.state, if case .idle = controller.state,