diff --git a/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents b/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents index 670241f35..c26a0bdbb 100644 --- a/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents +++ b/CoreDataStack/CoreData.xcdatamodeld/CoreData 2.xcdatamodel/contents @@ -191,7 +191,6 @@ - @@ -289,7 +288,7 @@ - + diff --git a/CoreDataStack/Entity/Setting.swift b/CoreDataStack/Entity/Setting.swift index 27971157f..94ee50959 100644 --- a/CoreDataStack/Entity/Setting.swift +++ b/CoreDataStack/Entity/Setting.swift @@ -13,7 +13,7 @@ public final class Setting: NSManagedObject { @NSManaged public var domain: String @NSManaged public var userID: String - @NSManaged public var appearanceRaw: String +// @NSManaged public var appearanceRaw: String @NSManaged public var preferredTrueBlackDarkMode: Bool @NSManaged public var preferredStaticAvatar: Bool @NSManaged public var preferredStaticEmoji: Bool @@ -41,17 +41,17 @@ extension Setting { property: Property ) -> Setting { let setting: Setting = context.insertObject() - setting.appearanceRaw = property.appearanceRaw +// setting.appearanceRaw = property.appearanceRaw setting.domain = property.domain setting.userID = property.userID return setting } - public func update(appearanceRaw: String) { - guard appearanceRaw != self.appearanceRaw else { return } - self.appearanceRaw = appearanceRaw - didUpdate(at: Date()) - } +// public func update(appearanceRaw: String) { +// guard appearanceRaw != self.appearanceRaw else { return } +// self.appearanceRaw = appearanceRaw +// didUpdate(at: Date()) +// } public func update(preferredTrueBlackDarkMode: Bool) { guard preferredTrueBlackDarkMode != self.preferredTrueBlackDarkMode else { return } @@ -87,12 +87,16 @@ extension Setting { public struct Property { public let domain: String public let userID: String - public let appearanceRaw: String +// public let appearanceRaw: String - public init(domain: String, userID: String, appearanceRaw: String) { + public init( + domain: String, + userID: String +// appearanceRaw: String + ) { self.domain = domain self.userID = userID - self.appearanceRaw = appearanceRaw +// self.appearanceRaw = appearanceRaw } } } diff --git a/Mastodon/Diffiable/Section/SettingsSection.swift b/Mastodon/Diffiable/Section/SettingsSection.swift index 939fd4315..f59c13587 100644 --- a/Mastodon/Diffiable/Section/SettingsSection.swift +++ b/Mastodon/Diffiable/Section/SettingsSection.swift @@ -41,21 +41,17 @@ extension SettingsSection { switch item { case .appearance(let objectID): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: SettingsAppearanceTableViewCell.self), for: indexPath) as! SettingsAppearanceTableViewCell - managedObjectContext.performAndWait { - let setting = managedObjectContext.object(with: objectID) as! Setting - cell.update(with: setting.appearance) - ManagedObjectObserver.observe(object: setting) - .receive(on: DispatchQueue.main) - .sink(receiveCompletion: { _ in - // do nothing - }, receiveValue: { [weak cell] change in - guard let cell = cell else { return } - guard case .update(let object) = change.changeType, - let setting = object as? Setting else { return } - cell.update(with: setting.appearance) - }) - .store(in: &cell.disposeBag) + UserDefaults.shared.observe(\.customUserInterfaceStyle, options: [.initial, .new]) { [weak cell] defaults, _ in + guard let cell = cell else { return } + switch defaults.customUserInterfaceStyle { + case .unspecified: cell.update(with: .automatic) + case .dark: cell.update(with: .dark) + case .light: cell.update(with: .light) + @unknown default: + assertionFailure() + } } + .store(in: &cell.observations) cell.delegate = settingsAppearanceTableViewCellDelegate return cell case .notification(let objectID, let switchMode): diff --git a/Mastodon/Extension/CoreDataStack/Setting.swift b/Mastodon/Extension/CoreDataStack/Setting.swift index b995b80e3..4d1fc0ca5 100644 --- a/Mastodon/Extension/CoreDataStack/Setting.swift +++ b/Mastodon/Extension/CoreDataStack/Setting.swift @@ -11,9 +11,9 @@ import MastodonSDK extension Setting { - var appearance: SettingsItem.AppearanceMode { - return SettingsItem.AppearanceMode(rawValue: appearanceRaw) ?? .automatic - } +// var appearance: SettingsItem.AppearanceMode { +// return SettingsItem.AppearanceMode(rawValue: appearanceRaw) ?? .automatic +// } var activeSubscription: Subscription? { return (subscriptions ?? Set()) diff --git a/Mastodon/Info.plist b/Mastodon/Info.plist index 129f6bf10..c144fc6e7 100644 --- a/Mastodon/Info.plist +++ b/Mastodon/Info.plist @@ -2,6 +2,8 @@ + UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/Mastodon/Scene/Settings/SettingsViewController.swift b/Mastodon/Scene/Settings/SettingsViewController.swift index 3b4e522e6..04c343647 100644 --- a/Mastodon/Scene/Settings/SettingsViewController.swift +++ b/Mastodon/Scene/Settings/SettingsViewController.swift @@ -439,7 +439,7 @@ extension SettingsViewController { .sink { _ in // do nothing } receiveValue: { _ in - // do nohting + // do nothing } .store(in: &disposeBag) } @@ -451,16 +451,19 @@ extension SettingsViewController: SettingsAppearanceTableViewCellDelegate { guard let dataSource = viewModel.dataSource else { return } guard let indexPath = tableView.indexPath(for: cell) else { return } let item = dataSource.itemIdentifier(for: indexPath) - guard case let .appearance(settingObjectID) = item else { return } + guard case .appearance = item else { return } - context.managedObjectContext.performChanges { - let setting = self.context.managedObjectContext.object(with: settingObjectID) as! Setting - setting.update(appearanceRaw: appearanceMode.rawValue) + switch appearanceMode { + case .automatic: + UserDefaults.shared.customUserInterfaceStyle = .unspecified + case .light: + UserDefaults.shared.customUserInterfaceStyle = .light + case .dark: + UserDefaults.shared.customUserInterfaceStyle = .dark } - .sink { _ in - let feedbackGenerator = UIImpactFeedbackGenerator(style: .light) - feedbackGenerator.impactOccurred() - }.store(in: &disposeBag) + + let feedbackGenerator = UIImpactFeedbackGenerator(style: .light) + feedbackGenerator.impactOccurred() } } diff --git a/Mastodon/Scene/Settings/View/Cell/SettingsAppearanceTableViewCell.swift b/Mastodon/Scene/Settings/View/Cell/SettingsAppearanceTableViewCell.swift index c4eb998e4..a4904136b 100644 --- a/Mastodon/Scene/Settings/View/Cell/SettingsAppearanceTableViewCell.swift +++ b/Mastodon/Scene/Settings/View/Cell/SettingsAppearanceTableViewCell.swift @@ -15,6 +15,7 @@ protocol SettingsAppearanceTableViewCellDelegate: AnyObject { class SettingsAppearanceTableViewCell: UITableViewCell { var disposeBag = Set() + var observations = Set() static let spacing: CGFloat = 18 @@ -59,6 +60,7 @@ class SettingsAppearanceTableViewCell: UITableViewCell { super.prepareForReuse() disposeBag.removeAll() + observations.removeAll() } // MARK: - Methods diff --git a/Mastodon/Service/SettingService.swift b/Mastodon/Service/SettingService.swift index 1c030c519..79ed47abf 100644 --- a/Mastodon/Service/SettingService.swift +++ b/Mastodon/Service/SettingService.swift @@ -54,8 +54,7 @@ final class SettingService { into: managedObjectContext, property: Setting.Property( domain: domain, - userID: userID, - appearanceRaw: SettingsItem.AppearanceMode.automatic.rawValue + userID: userID ) ) } // end for @@ -190,16 +189,16 @@ extension SettingService { static func updatePreference(setting: Setting) { // set appearance - let userInterfaceStyle: UIUserInterfaceStyle = { - switch setting.appearance { - case .automatic: return .unspecified - case .light: return .light - case .dark: return .dark - } - }() - if UserDefaults.shared.customUserInterfaceStyle != userInterfaceStyle { - UserDefaults.shared.customUserInterfaceStyle = userInterfaceStyle - } +// let userInterfaceStyle: UIUserInterfaceStyle = { +// switch setting.appearance { +// case .automatic: return .unspecified +// case .light: return .light +// case .dark: return .dark +// } +// }() +// if UserDefaults.shared.customUserInterfaceStyle != userInterfaceStyle { +// UserDefaults.shared.customUserInterfaceStyle = userInterfaceStyle +// } // set theme let themeName: ThemeName = setting.preferredTrueBlackDarkMode ? .system : .mastodon