Merge branch 'mac-candidate'
This commit is contained in:
commit
424daa0a5c
@ -18,6 +18,8 @@ import ArticlesDatabase
|
|||||||
import RSWeb
|
import RSWeb
|
||||||
import os.log
|
import os.log
|
||||||
|
|
||||||
|
// Main thread only.
|
||||||
|
|
||||||
public extension Notification.Name {
|
public extension Notification.Name {
|
||||||
static let AccountRefreshDidBegin = Notification.Name(rawValue: "AccountRefreshDidBegin")
|
static let AccountRefreshDidBegin = Notification.Name(rawValue: "AccountRefreshDidBegin")
|
||||||
static let AccountRefreshDidFinish = Notification.Name(rawValue: "AccountRefreshDidFinish")
|
static let AccountRefreshDidFinish = Notification.Name(rawValue: "AccountRefreshDidFinish")
|
||||||
@ -684,6 +686,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
|
|||||||
// MARK: - Container
|
// MARK: - Container
|
||||||
|
|
||||||
public func flattenedFeeds() -> Set<Feed> {
|
public func flattenedFeeds() -> Set<Feed> {
|
||||||
|
assert(Thread.isMainThread)
|
||||||
if flattenedFeedsNeedUpdate {
|
if flattenedFeedsNeedUpdate {
|
||||||
updateFlattenedFeeds()
|
updateFlattenedFeeds()
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import Foundation
|
|||||||
import RSCore
|
import RSCore
|
||||||
import Articles
|
import Articles
|
||||||
|
|
||||||
|
// Main thread only.
|
||||||
|
|
||||||
public extension Notification.Name {
|
public extension Notification.Name {
|
||||||
static let AccountsDidChange = Notification.Name(rawValue: "AccountsDidChange")
|
static let AccountsDidChange = Notification.Name(rawValue: "AccountsDidChange")
|
||||||
}
|
}
|
||||||
@ -51,6 +53,7 @@ public final class AccountManager: UnreadCountProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public var activeAccounts: [Account] {
|
public var activeAccounts: [Account] {
|
||||||
|
assert(Thread.isMainThread)
|
||||||
return Array(accountsDictionary.values.filter { $0.isActive })
|
return Array(accountsDictionary.values.filter { $0.isActive })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,8 +602,8 @@ private extension FeedbinAccountDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func syncFolders(_ account: Account, _ tags: [FeedbinTag]?) {
|
func syncFolders(_ account: Account, _ tags: [FeedbinTag]?) {
|
||||||
|
|
||||||
guard let tags = tags else { return }
|
guard let tags = tags else { return }
|
||||||
|
assert(Thread.isMainThread)
|
||||||
|
|
||||||
os_log(.debug, log: log, "Syncing folders with %ld tags.", tags.count)
|
os_log(.debug, log: log, "Syncing folders with %ld tags.", tags.count)
|
||||||
|
|
||||||
@ -613,13 +613,11 @@ private extension FeedbinAccountDelegate {
|
|||||||
if let folders = account.folders {
|
if let folders = account.folders {
|
||||||
folders.forEach { folder in
|
folders.forEach { folder in
|
||||||
if !tagNames.contains(folder.name ?? "") {
|
if !tagNames.contains(folder.name ?? "") {
|
||||||
DispatchQueue.main.sync {
|
for feed in folder.topLevelFeeds {
|
||||||
for feed in folder.topLevelFeeds {
|
account.addFeed(feed)
|
||||||
account.addFeed(feed)
|
clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
|
||||||
clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
|
|
||||||
}
|
|
||||||
account.removeFolder(folder)
|
|
||||||
}
|
}
|
||||||
|
account.removeFolder(folder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -635,9 +633,7 @@ private extension FeedbinAccountDelegate {
|
|||||||
// Make any folders Feedbin has, but we don't
|
// Make any folders Feedbin has, but we don't
|
||||||
tagNames.forEach { tagName in
|
tagNames.forEach { tagName in
|
||||||
if !folderNames.contains(tagName) {
|
if !folderNames.contains(tagName) {
|
||||||
DispatchQueue.main.sync {
|
_ = account.ensureFolder(with: tagName)
|
||||||
_ = account.ensureFolder(with: tagName)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -691,6 +687,7 @@ private extension FeedbinAccountDelegate {
|
|||||||
func syncFeeds(_ account: Account, _ subscriptions: [FeedbinSubscription]?) {
|
func syncFeeds(_ account: Account, _ subscriptions: [FeedbinSubscription]?) {
|
||||||
|
|
||||||
guard let subscriptions = subscriptions else { return }
|
guard let subscriptions = subscriptions else { return }
|
||||||
|
assert(Thread.isMainThread)
|
||||||
|
|
||||||
os_log(.debug, log: log, "Syncing feeds with %ld subscriptions.", subscriptions.count)
|
os_log(.debug, log: log, "Syncing feeds with %ld subscriptions.", subscriptions.count)
|
||||||
|
|
||||||
@ -701,9 +698,7 @@ private extension FeedbinAccountDelegate {
|
|||||||
for folder in folders {
|
for folder in folders {
|
||||||
for feed in folder.topLevelFeeds {
|
for feed in folder.topLevelFeeds {
|
||||||
if !subFeedIds.contains(feed.feedID) {
|
if !subFeedIds.contains(feed.feedID) {
|
||||||
DispatchQueue.main.sync {
|
folder.removeFeed(feed)
|
||||||
folder.removeFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -711,9 +706,7 @@ private extension FeedbinAccountDelegate {
|
|||||||
|
|
||||||
for feed in account.topLevelFeeds {
|
for feed in account.topLevelFeeds {
|
||||||
if !subFeedIds.contains(feed.feedID) {
|
if !subFeedIds.contains(feed.feedID) {
|
||||||
DispatchQueue.main.sync {
|
account.removeFeed(feed)
|
||||||
account.removeFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,27 +715,24 @@ private extension FeedbinAccountDelegate {
|
|||||||
|
|
||||||
let subFeedId = String(subscription.feedID)
|
let subFeedId = String(subscription.feedID)
|
||||||
|
|
||||||
DispatchQueue.main.sync {
|
if let feed = account.idToFeedDictionary[subFeedId] {
|
||||||
if let feed = account.idToFeedDictionary[subFeedId] {
|
feed.name = subscription.name
|
||||||
feed.name = subscription.name
|
// If the name has been changed on the server remove the locally edited name
|
||||||
// If the name has been changed on the server remove the locally edited name
|
feed.editedName = nil
|
||||||
feed.editedName = nil
|
feed.homePageURL = subscription.homePageURL
|
||||||
feed.homePageURL = subscription.homePageURL
|
feed.subscriptionID = String(subscription.subscriptionID)
|
||||||
feed.subscriptionID = String(subscription.subscriptionID)
|
} else {
|
||||||
} else {
|
let feed = account.createFeed(with: subscription.name, url: subscription.url, feedID: subFeedId, homePageURL: subscription.homePageURL)
|
||||||
let feed = account.createFeed(with: subscription.name, url: subscription.url, feedID: subFeedId, homePageURL: subscription.homePageURL)
|
feed.subscriptionID = String(subscription.subscriptionID)
|
||||||
feed.subscriptionID = String(subscription.subscriptionID)
|
account.addFeed(feed)
|
||||||
account.addFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncTaggings(_ account: Account, _ taggings: [FeedbinTagging]?) {
|
func syncTaggings(_ account: Account, _ taggings: [FeedbinTagging]?) {
|
||||||
|
|
||||||
guard let taggings = taggings else { return }
|
guard let taggings = taggings else { return }
|
||||||
|
assert(Thread.isMainThread)
|
||||||
|
|
||||||
os_log(.debug, log: log, "Syncing taggings with %ld taggings.", taggings.count)
|
os_log(.debug, log: log, "Syncing taggings with %ld taggings.", taggings.count)
|
||||||
|
|
||||||
@ -776,11 +766,9 @@ private extension FeedbinAccountDelegate {
|
|||||||
// Move any feeds not in the folder to the account
|
// Move any feeds not in the folder to the account
|
||||||
for feed in folder.topLevelFeeds {
|
for feed in folder.topLevelFeeds {
|
||||||
if !taggingFeedIDs.contains(feed.feedID) {
|
if !taggingFeedIDs.contains(feed.feedID) {
|
||||||
DispatchQueue.main.sync {
|
folder.removeFeed(feed)
|
||||||
folder.removeFeed(feed)
|
clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
|
||||||
clearFolderRelationship(for: feed, withFolderName: folder.name ?? "")
|
account.addFeed(feed)
|
||||||
account.addFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -793,10 +781,8 @@ private extension FeedbinAccountDelegate {
|
|||||||
guard let feed = account.idToFeedDictionary[taggingFeedID] else {
|
guard let feed = account.idToFeedDictionary[taggingFeedID] else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
DispatchQueue.main.sync {
|
saveFolderRelationship(for: feed, withFolderName: folderName, id: String(tagging.taggingID))
|
||||||
saveFolderRelationship(for: feed, withFolderName: folderName, id: String(tagging.taggingID))
|
folder.addFeed(feed)
|
||||||
folder.addFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -805,14 +791,11 @@ private extension FeedbinAccountDelegate {
|
|||||||
let taggedFeedIDs = Set(taggings.map { String($0.feedID) })
|
let taggedFeedIDs = Set(taggings.map { String($0.feedID) })
|
||||||
|
|
||||||
// Remove all feeds from the account container that have a tag
|
// Remove all feeds from the account container that have a tag
|
||||||
DispatchQueue.main.sync {
|
for feed in account.topLevelFeeds {
|
||||||
for feed in account.topLevelFeeds {
|
if taggedFeedIDs.contains(feed.feedID) {
|
||||||
if taggedFeedIDs.contains(feed.feedID) {
|
account.removeFeed(feed)
|
||||||
account.removeFeed(feed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncFavicons(_ account: Account, _ icons: [FeedbinIcon]?) {
|
func syncFavicons(_ account: Account, _ icons: [FeedbinIcon]?) {
|
||||||
@ -826,14 +809,11 @@ private extension FeedbinAccountDelegate {
|
|||||||
for feed in account.flattenedFeeds() {
|
for feed in account.flattenedFeeds() {
|
||||||
for (key, value) in iconDict {
|
for (key, value) in iconDict {
|
||||||
if feed.homePageURL?.contains(key) ?? false {
|
if feed.homePageURL?.contains(key) ?? false {
|
||||||
DispatchQueue.main.sync {
|
feed.faviconURL = value
|
||||||
feed.faviconURL = value
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit afcbd0819c85b263acc892361ed840a9628eba4d
|
Subproject commit b236f57627cb8aa3feac835689754d4863eb1788
|
Loading…
x
Reference in New Issue
Block a user