diff --git a/Delta/Experimental Features/ExperimentalFeatures.swift b/Delta/Experimental Features/ExperimentalFeatures.swift index 571010f..721d849 100644 --- a/Delta/Experimental Features/ExperimentalFeatures.swift +++ b/Delta/Experimental Features/ExperimentalFeatures.swift @@ -41,6 +41,10 @@ struct ExperimentalFeatures: FeatureContainer options: ReviewSaveStatesOptions()) var reviewSaveStates + @Feature(name: "Repair Database", + description: "Repair invalid relationships in Delta's game database on next app launch.") + var repairDatabase + @Feature(name: "Alternate App Icon", description: "Change the app icon.", options: AlternateAppIconOptions()) diff --git a/Delta/Launch/LaunchViewController.swift b/Delta/Launch/LaunchViewController.swift index 026f8c4..13b1774 100644 --- a/Delta/Launch/LaunchViewController.swift +++ b/Delta/Launch/LaunchViewController.swift @@ -78,33 +78,12 @@ extension LaunchViewController // Repair database _after_ starting SyncManager so we can access RecordController. let isDatabaseRepaired = RSTLaunchCondition(condition: { !UserDefaults.standard.shouldRepairDatabase }) { completionHandler in - func finish() - { - UserDefaults.standard.shouldRepairDatabase = false - completionHandler(nil) - } - - do - { - let fetchRequest = Game.fetchRequest() - fetchRequest.fetchLimit = 1 - - let isDatabaseEmpty = try DatabaseManager.shared.viewContext.count(for: fetchRequest) == 0 - guard !isDatabaseEmpty else { - // Database has no games, so no need to repair database. - finish() - return - } - } - catch - { - print("Failed to fetch games at launch, repairing database just to be safe.", error) - } - let repairViewController = RepairDatabaseViewController() repairViewController.completionHandler = { [weak repairViewController] in repairViewController?.dismiss(animated: true) - finish() + + UserDefaults.standard.shouldRepairDatabase = false + completionHandler(nil) } let navigationController = UINavigationController(rootViewController: repairViewController) diff --git a/Delta/Settings/Settings.swift b/Delta/Settings/Settings.swift index 8ef49e1..63370d8 100644 --- a/Delta/Settings/Settings.swift +++ b/Delta/Settings/Settings.swift @@ -53,7 +53,7 @@ struct Settings static func registerDefaults() { - var defaults = [#keyPath(UserDefaults.translucentControllerSkinOpacity): 0.7, + let defaults = [#keyPath(UserDefaults.translucentControllerSkinOpacity): 0.7, #keyPath(UserDefaults.gameShortcutsMode): GameShortcutsMode.recent.rawValue, #keyPath(UserDefaults.isButtonHapticFeedbackEnabled): true, #keyPath(UserDefaults.isThumbstickHapticFeedbackEnabled): true, @@ -63,12 +63,7 @@ struct Settings #keyPath(UserDefaults.respectSilentMode): true, Settings.preferredCoreSettingsKey(for: .ds): MelonDS.core.identifier] as [String : Any] - #if BETA - - // Assume we need to repair database relationships until explicitly set to false. - defaults[#keyPath(UserDefaults.shouldRepairDatabase)] = true - - #else + #if !BETA // Manually set MelonDS as preferred DS core in case DeSmuME is cached from a previous version. UserDefaults.standard.set(MelonDS.core.identifier, forKey: Settings.preferredCoreSettingsKey(for: .ds)) @@ -77,6 +72,12 @@ struct Settings #endif UserDefaults.standard.register(defaults: defaults) + + if ExperimentalFeatures.shared.repairDatabase.isEnabled + { + UserDefaults.standard.shouldRepairDatabase = true + ExperimentalFeatures.shared.repairDatabase.isEnabled = false // Disable so we only repair database once. + } } }