-
Notifications
You must be signed in to change notification settings - Fork 8
/
AppRestorationService.swift
95 lines (72 loc) · 3.33 KB
/
AppRestorationService.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
Infomaniak kDrive - iOS App
Copyright (C) 2023 Infomaniak Network SA
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import Foundation
import InfomaniakDI
import kDriveCore
import UIKit
/// Something that centralize the App Restoration logic
public protocol AppRestorationServiceable {
/// Is restoration enabled
var shouldRestoreApplicationState: Bool { get }
/// Should save the scene sate
var shouldSaveApplicationState: Bool { get }
/// Saves a restoration version, for forward compatibility
func saveRestorationVersion()
func reloadAppUI(for driveId: Int, userId: Int) async
}
public final class AppRestorationService: AppRestorationServiceable {
@LazyInjectService var appNavigable: AppNavigable
/// Path where the state restoration state is saved
private static let statePath = FileManager.default
.urls(for: .libraryDirectory, in: .userDomainMask)
.first?
.appendingPathComponent("Saved Application State")
@LazyInjectService private var accountManager: AccountManageable
@LazyInjectService private var appContextService: AppContextServiceable
/// State restoration version
private static let currentStateVersion = 5
public init() {
// META: keep SonarCloud happy
}
public var shouldSaveApplicationState: Bool {
Log.sceneDelegate("shouldSaveApplicationState")
Log.sceneDelegate("Restoration files:\(String(describing: Self.statePath))")
return true
}
public var shouldRestoreApplicationState: Bool {
guard !appContextService.isExtension else {
return false
}
let storedVersion = UserDefaults.shared.appRestorationVersion
let shouldRestore = Self.currentStateVersion == storedVersion &&
!(UserDefaults.shared.legacyIsFirstLaunch || accountManager.accounts.isEmpty)
Log.sceneDelegate("shouldRestoreApplicationState:\(shouldRestore) appRestorationVersion:\(storedVersion)")
return shouldRestore
}
public func saveRestorationVersion() {
UserDefaults.shared.appRestorationVersion = Self.currentStateVersion
Log.sceneDelegate("saveRestorationVersion to \(Self.currentStateVersion)")
}
public func reloadAppUI(for driveId: Int, userId: Int) async {
accountManager.setCurrentDriveForCurrentAccount(for: driveId, userId: userId)
accountManager.saveAccounts()
guard let currentDriveFileManager = accountManager.currentDriveFileManager else {
return
}
// Read the last tab selected in order to properly reload the App's UI.
let lastSelectedTab = UserDefaults.shared.lastSelectedTab
await appNavigable.showMainViewController(driveFileManager: currentDriveFileManager, selectedIndex: lastSelectedTab)
}
}