From fa62acb585676f9149e05fe171d47bb277118e21 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 07:22:51 -0500 Subject: [PATCH 1/7] Rebrand Reader API to FreshRSS --- Frameworks/Account/Account.swift | 10 +++++----- Mac/AppAssets.swift | 4 ++-- .../Accounts/AccountsAddViewController.swift | 5 +++-- .../AccountsPreferencesViewController.swift | 4 ++-- .../Accounts/AccountsReaderAPI.xib | 7 +++---- .../AccountsReaderAPIWindowController.swift | 18 ++++++++++++++++-- .../Contents.json | 2 +- .../accountFreshRSS.pdf} | Bin 3998 -> 4206 bytes Mac/Scriptability/Account+Scriptability.swift | 4 ++-- 9 files changed, 34 insertions(+), 20 deletions(-) rename Mac/Resources/Assets.xcassets/{accountReader.imageset => accountFreshRSS.imageset}/Contents.json (82%) rename Mac/Resources/Assets.xcassets/{accountReader.imageset/accountReader.pdf => accountFreshRSS.imageset/accountFreshRSS.pdf} (73%) diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 36066fdf1..2f9682066 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -33,7 +33,7 @@ public enum AccountType: Int { case feedbin = 17 case feedWrangler = 18 case newsBlur = 19 - case readerAPI = 20 + case freshRSS = 20 // TODO: more } @@ -221,7 +221,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, self.delegate = LocalAccountDelegate() case .feedbin: self.delegate = FeedbinAccountDelegate(dataFolder: dataFolder, transport: transport) - case .readerAPI: + case .freshRSS: self.delegate = ReaderAPIAccountDelegate(dataFolder: dataFolder, transport: transport) default: fatalError("Only Local and Feedbin accounts are supported") @@ -250,8 +250,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, defaultName = "FeedWrangler" case .newsBlur: defaultName = "NewsBlur" - case .readerAPI: - defaultName = "Reader API" + case .freshRSS: + defaultName = "FreshRSS" } NotificationCenter.default.addObserver(self, selector: #selector(downloadProgressDidChange(_:)), name: .DownloadProgressDidChange, object: nil) @@ -331,7 +331,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, LocalAccountDelegate.validateCredentials(transport: transport, credentials: credentials, completion: completion) case .feedbin: FeedbinAccountDelegate.validateCredentials(transport: transport, credentials: credentials, completion: completion) - case .readerAPI: + case .freshRSS: ReaderAPIAccountDelegate.validateCredentials(transport: transport, credentials: credentials, endpoint: endpoint, completion: completion) default: break diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index a2610aa89..146af1bb1 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -34,8 +34,8 @@ struct AppAssets { return RSImage(named: "accountFeedbin") }() - static var accountReader: RSImage! = { - return RSImage(named: "accountReader") + static var accountFreshRSS: RSImage! = { + return RSImage(named: "accountFreshRSS") }() static var faviconTemplateImage: RSImage = { diff --git a/Mac/Preferences/Accounts/AccountsAddViewController.swift b/Mac/Preferences/Accounts/AccountsAddViewController.swift index 4e3019ea4..45d7adde6 100644 --- a/Mac/Preferences/Accounts/AccountsAddViewController.swift +++ b/Mac/Preferences/Accounts/AccountsAddViewController.swift @@ -64,8 +64,8 @@ extension AccountsAddViewController: NSTableViewDelegate { cell.accountNameLabel?.stringValue = NSLocalizedString("Feedbin", comment: "Feedbin") cell.accountImageView?.image = AppAssets.accountFeedbin case 2: - cell.accountNameLabel?.stringValue = NSLocalizedString("Reader API", comment: "Reader API") - cell.accountImageView?.image = AppAssets.accountReader + cell.accountNameLabel?.stringValue = NSLocalizedString("FreshRSS", comment: "FreshRSS") + cell.accountImageView?.image = AppAssets.accountFreshRSS default: break } @@ -92,6 +92,7 @@ extension AccountsAddViewController: NSTableViewDelegate { accountsAddWindowController = accountsFeedbinWindowController case 2: let accountsReaderAPIWindowController = AccountsReaderAPIWindowController() + accountsReaderAPIWindowController.accountType = .freshRSS accountsReaderAPIWindowController.runSheetOnWindow(self.view.window!) accountsAddWindowController = accountsReaderAPIWindowController default: diff --git a/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift b/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift index 5ad1aaa7a..4fa3af338 100644 --- a/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift +++ b/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift @@ -107,8 +107,8 @@ extension AccountsPreferencesViewController: NSTableViewDelegate { cell.imageView?.image = AppAssets.accountLocal case .feedbin: cell.imageView?.image = NSImage(named: "accountFeedbin") - case .readerAPI: - cell.imageView?.image = AppAssets.accountReader + case .freshRSS: + cell.imageView?.image = AppAssets.accountFreshRSS default: break } diff --git a/Mac/Preferences/Accounts/AccountsReaderAPI.xib b/Mac/Preferences/Accounts/AccountsReaderAPI.xib index 03f9f638d..ea4ee20e0 100644 --- a/Mac/Preferences/Accounts/AccountsReaderAPI.xib +++ b/Mac/Preferences/Accounts/AccountsReaderAPI.xib @@ -13,6 +13,8 @@ + + @@ -37,7 +39,7 @@ - + @@ -205,7 +207,4 @@ Gw - - - diff --git a/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift b/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift index 4bdf31256..f41a6327d 100644 --- a/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift +++ b/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift @@ -12,6 +12,9 @@ import RSWeb class AccountsReaderAPIWindowController: NSWindowController { + @IBOutlet weak var titleImageView: NSImageView! + @IBOutlet weak var titleLabel: NSTextField! + @IBOutlet weak var progressIndicator: NSProgressIndicator! @IBOutlet weak var usernameTextField: NSTextField! @IBOutlet weak var apiURLTextField: NSTextField! @@ -20,6 +23,7 @@ class AccountsReaderAPIWindowController: NSWindowController { @IBOutlet weak var actionButton: NSButton! var account: Account? + var accountType: AccountType? private weak var hostWindow: NSWindow? @@ -28,6 +32,16 @@ class AccountsReaderAPIWindowController: NSWindowController { } override func windowDidLoad() { + if let accountType = accountType { + switch accountType { + case .freshRSS: + titleImageView.image = AppAssets.accountFreshRSS + titleLabel.stringValue = NSLocalizedString("FreshRSS", comment: "FreshRSS") + default: + break + } + } + if let account = account, let credentials = try? account.retrieveBasicCredentials() { if case .basic(let username, let password) = credentials { usernameTextField.stringValue = username @@ -71,7 +85,7 @@ class AccountsReaderAPIWindowController: NSWindowController { } let credentials = Credentials.readerAPIBasicLogin(username: usernameTextField.stringValue, password: passwordTextField.stringValue) - Account.validateCredentials(type: .readerAPI, credentials: credentials, endpoint: apiURL) { [weak self] result in + Account.validateCredentials(type: accountType!, credentials: credentials, endpoint: apiURL) { [weak self] result in guard let self = self else { return } @@ -89,7 +103,7 @@ class AccountsReaderAPIWindowController: NSWindowController { var newAccount = false if self.account == nil { - self.account = AccountManager.shared.createAccount(type: .readerAPI) + self.account = AccountManager.shared.createAccount(type: self.accountType!) newAccount = true } diff --git a/Mac/Resources/Assets.xcassets/accountReader.imageset/Contents.json b/Mac/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json similarity index 82% rename from Mac/Resources/Assets.xcassets/accountReader.imageset/Contents.json rename to Mac/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json index d8d735f71..b2c62a136 100644 --- a/Mac/Resources/Assets.xcassets/accountReader.imageset/Contents.json +++ b/Mac/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "accountReader.pdf" + "filename" : "accountFreshRSS.pdf" } ], "info" : { diff --git a/Mac/Resources/Assets.xcassets/accountReader.imageset/accountReader.pdf b/Mac/Resources/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf similarity index 73% rename from Mac/Resources/Assets.xcassets/accountReader.imageset/accountReader.pdf rename to Mac/Resources/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf index 8e49ad8aa5d3892d26cdd25be6177bebec4f3bd5..1ff98e115ed9096d447af7849c78bbd5906f8b00 100644 GIT binary patch delta 931 zcmbOy|4v~-Kz(kIXWn50o;|-sKR0SEaXEd-vVC5&%r6G!*oGwz51selUnryL7%efa z{Yio3sd$Tr+)~`HdbF<;brhOyH_;BsiV!=!+wt12#eUK?lhoHg@_b^mta9bK@;j?6 zB$n{yU9|GozW1@o-{ZuO0}pp>e8skKZkMVr_r;{mSCnpqg(N<%fAjhCm+zPScIgZA z|KIc=`?3`8{r=Ma^Z@nwp9R~~&8lwKDBt7p|Kjdqye9m_l2^7Yo7-ls(JMdjucy;n zUr6Qr5yPX_2YHvTIa{mjJNM4wf3b!4-nXdUV%gKH@um9t(OV3ftiD0QRx_ejd=2MT z4WA#smdD9>##zRfSN(P|S4k$MP1yaN@!$Qg`xgI5cTd&n>E2rI z{U*Qs4PB~Og~Jv1q|0ZYP{~uW`TK?WNN~3?S885LaY<2XVlIf4pOnRAs$if1qKyqr zU_wTd|MQ4W-oRKQukTt>;vQU*Sdyw>W22z&UTmab0aPEv1!Nj3SWcEmIX9qLQ5^4d+0BmXv^o)^I8yX-f_esr5FUe3aGz8hHpzo((tf23hQ<7Sg z2Xc|VOKMqW^5$5kEG{NP!^tOj)R_zoCV${DWj8W4Qvl-0TD)qEMw0`1)p+&8Qj3Z+ z^Yaw+4fRYWm+=;|8yOfHnpl`je#a{VXAAPlFd9$RH1|~*8 zub_$I}1I%$mQs`E}w-0teLMpXEXvyn^LNyhi$ zK8-G3dLJ6H=ZbAJx0gL$GDXVNaO>ryH6d49SGXpw5(++)B-c_u&CJ_%rA?66vY2+x zPpt36C(Mn?+jyvXNw7t?fARCc*)|7!ZkD>ZNBDeb^f}taCAN9pmA!p4%DY0@UquPe zY~kIqdpBdKa_8C9&fb%2svh6C&$@ZK&n~9=<=qC{b>G?-pE`QQr@QKP$yS;C)#qLv z-1Ya^{3@LvN1tEsz8KH(Z?B7$-K2j`yVCDIv8z|(-!eB>=Ni_Xai!*^6qgjGCgy@z`AJz^rV0iMAlk^%bn;ThNt5H4#5jCX^U_N)6f8I2 zU~1)Jw45BztIlXKxr5h~)!bOY+<5X4UNuI8$*+0UCd=~`Xc<}>TAG>|8AKTvr~{Fv zg1&Elic4Zis)B}#m63s=rGXh#$>g1UG75%V25_KYW@>6|s*t7t6*D$5HJ@zAufk$% zY-BcBmR~j9*wRn|tXv@vrpUm=(g0n|*a(X{Q&S5}b>97WtGFbwsHCDOHI2*I%*c>SRn^s>$&CvDcF*?5 diff --git a/Mac/Scriptability/Account+Scriptability.swift b/Mac/Scriptability/Account+Scriptability.swift index 6b338b75b..7b2fde624 100644 --- a/Mac/Scriptability/Account+Scriptability.swift +++ b/Mac/Scriptability/Account+Scriptability.swift @@ -142,8 +142,8 @@ class ScriptableAccount: NSObject, UniqueIdScriptingObject, ScriptingObjectConta osType = "FWrg" case .newsBlur: osType = "NBlr" - case .readerAPI: - osType = "Grdr" + case .freshRSS: + osType = "Frsh" } return osType.fourCharCode() } From 6765206a1b3a818130adbb62b30a6576f4e6f156 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 07:33:17 -0500 Subject: [PATCH 2/7] Update iOS to use FreshRSS branding --- .../accountFreshRSS.imageset/Contents.json | 15 +++++++++++++++ .../accountFreshRSS.imageset/accountFreshRSS.pdf | Bin 0 -> 4206 bytes iOS/Settings/SettingsReaderAPIAccountView.swift | 15 +++++++++------ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf diff --git a/iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json b/iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json new file mode 100644 index 000000000..b2c62a136 --- /dev/null +++ b/iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "accountFreshRSS.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf b/iOS/Resources/Assets.xcassets/accountFreshRSS.imageset/accountFreshRSS.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1ff98e115ed9096d447af7849c78bbd5906f8b00 GIT binary patch literal 4206 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 + var accountType: AccountType var account: Account? = nil - init() { + init(accountType: AccountType) { + self.accountType = accountType } - init(account: Account) { + init(accountType: AccountType, account: Account) { self.account = account + self.accountType = accountType if case .basic(let username, let password) = try? account.retrieveBasicCredentials() { self.email = username self.password = password @@ -181,7 +184,7 @@ struct SettingsReaderAPIAccountView : View { #if DEBUG struct SettingsReaderAPIAccountView_Previews : PreviewProvider { static var previews: some View { - SettingsReaderAPIAccountView(viewModel: SettingsReaderAPIAccountView.ViewModel()) + SettingsReaderAPIAccountView(viewModel: SettingsReaderAPIAccountView.ViewModel(accountType: .freshRSS)) } } #endif From 2756e8f204bbea0abaaa21cd022a673ebb85c266 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 11:18:09 -0500 Subject: [PATCH 3/7] Ensure that invalid username/password combinations throw an error --- Frameworks/Account/Feedbin/FeedbinAPICaller.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift index a8d9757d1..8f46c00bc 100644 --- a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift +++ b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift @@ -55,7 +55,7 @@ final class FeedbinAPICaller: NSObject { switch error { case TransportError.httpError(let status): if status == 401 { - completion(.success(self.credentials)) + completion(.success(nil)) } else { completion(.failure(error)) } From 1ac1144b2d381fcdbdcef07d20e5ebe2efa057d7 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 11:19:15 -0500 Subject: [PATCH 4/7] Reduce footprint of Account credentials API --- Frameworks/Account/Account.swift | 52 +++++++++++-------- .../Feedbin/FeedbinAccountDelegate.swift | 2 +- .../ReaderAPI/ReaderAPIAccountDelegate.swift | 2 +- .../AccountsFeedbinWindowController.swift | 7 ++- .../AccountsReaderAPIWindowController.swift | 7 ++- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 2f9682066..9a1bf5d28 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -295,34 +295,40 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, } - public func retrieveBasicCredentials() throws -> Credentials? { - guard let username = self.username, let server = delegate.server else { + public func retrieveCredentials() throws -> Credentials? { + switch type { + case .feedbin: + guard let username = self.username, let server = delegate.server else { + return nil + } + return try CredentialsManager.retrieveBasicCredentials(server: server, username: username) + case .freshRSS: + guard let username = self.username, let server = delegate.server else { + return nil + } + return try CredentialsManager.retrieveReaderAPIAuthCredentials(server: server, username: username) + default: return nil } - return try CredentialsManager.retrieveBasicCredentials(server: server, username: username) } - public func removeBasicCredentials() throws { - guard let username = self.username, let server = delegate.server else { - return + public func removeCredentials() throws { + switch type { + case .feedbin: + guard let username = self.username, let server = delegate.server else { + return + } + try CredentialsManager.removeBasicCredentials(server: server, username: username) + self.username = nil + case .freshRSS: + guard let username = self.username, let server = delegate.server else { + return + } + try CredentialsManager.removeReaderAPIAuthCredentials(server: server, username: username) + self.username = nil + default: + break } - try CredentialsManager.removeBasicCredentials(server: server, username: username) - self.username = nil - } - - public func retrieveReaderAPIAuthCredentials() throws -> Credentials? { - guard let username = self.username, let server = delegate.server else { - return nil - } - return try CredentialsManager.retrieveReaderAPIAuthCredentials(server: server, username: username) - } - - public func removeReaderAPIAuthCredentials() throws { - guard let username = self.username, let server = delegate.server else { - return - } - try CredentialsManager.removeReaderAPIAuthCredentials(server: server, username: username) - self.username = nil } public static func validateCredentials(transport: Transport = URLSession.webserviceTransport(), type: AccountType, credentials: Credentials, endpoint: URL? = nil, completion: @escaping (Result) -> Void) { diff --git a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift index 05d3c0d0c..2dd9a4f2a 100644 --- a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift @@ -510,7 +510,7 @@ final class FeedbinAccountDelegate: AccountDelegate { } func accountDidInitialize(_ account: Account) { - credentials = try? account.retrieveBasicCredentials() + credentials = try? account.retrieveCredentials() accountMetadata = account.metadata } diff --git a/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift b/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift index 6e80bd3db..6efba4115 100644 --- a/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift +++ b/Frameworks/Account/ReaderAPI/ReaderAPIAccountDelegate.swift @@ -411,7 +411,7 @@ final class ReaderAPIAccountDelegate: AccountDelegate { func accountDidInitialize(_ account: Account) { accountMetadata = account.metadata - credentials = try? account.retrieveReaderAPIAuthCredentials() + credentials = try? account.retrieveCredentials() } static func validateCredentials(transport: Transport, credentials: Credentials, endpoint: URL?, completion: @escaping (Result) -> Void) { diff --git a/Mac/Preferences/Accounts/AccountsFeedbinWindowController.swift b/Mac/Preferences/Accounts/AccountsFeedbinWindowController.swift index 191599c07..a1e0af2cf 100644 --- a/Mac/Preferences/Accounts/AccountsFeedbinWindowController.swift +++ b/Mac/Preferences/Accounts/AccountsFeedbinWindowController.swift @@ -27,10 +27,9 @@ class AccountsFeedbinWindowController: NSWindowController { } override func windowDidLoad() { - if let account = account, let credentials = try? account.retrieveBasicCredentials() { - if case .basic(let username, let password) = credentials { + if let account = account, let credentials = try? account.retrieveCredentials() { + if case .basic(let username, _) = credentials { usernameTextField.stringValue = username - passwordTextField.stringValue = password } actionButton.title = NSLocalizedString("Update", comment: "Update") } else { @@ -87,7 +86,7 @@ class AccountsFeedbinWindowController: NSWindowController { } do { - try self.account?.removeBasicCredentials() + try self.account?.removeCredentials() try self.account?.storeCredentials(validatedCredentials) if newAccount { self.account?.refreshAll() { result in diff --git a/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift b/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift index f41a6327d..d4a986339 100644 --- a/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift +++ b/Mac/Preferences/Accounts/AccountsReaderAPIWindowController.swift @@ -42,10 +42,9 @@ class AccountsReaderAPIWindowController: NSWindowController { } } - if let account = account, let credentials = try? account.retrieveBasicCredentials() { - if case .basic(let username, let password) = credentials { + if let account = account, let credentials = try? account.retrieveCredentials() { + if case .basic(let username, _) = credentials { usernameTextField.stringValue = username - passwordTextField.stringValue = password } actionButton.title = NSLocalizedString("Update", comment: "Update") } else { @@ -110,7 +109,7 @@ class AccountsReaderAPIWindowController: NSWindowController { do { self.account?.endpointURL = apiURL - try self.account?.removeReaderAPIAuthCredentials() + try self.account?.removeCredentials() try self.account?.storeCredentials(validatedCredentials) if newAccount { From 9f471390114cff171d97c7f7ca43a266103b36fe Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 11:27:35 -0500 Subject: [PATCH 5/7] Update iOS to work with the latest Account API --- iOS/Settings/SettingsFeedbinAccountView.swift | 4 ++-- iOS/Settings/SettingsReaderAPIAccountView.swift | 4 ++-- iOS/Settings/UIKit/FeedbinAccountViewController.swift | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iOS/Settings/SettingsFeedbinAccountView.swift b/iOS/Settings/SettingsFeedbinAccountView.swift index 1b3f370fb..62e88069a 100644 --- a/iOS/Settings/SettingsFeedbinAccountView.swift +++ b/iOS/Settings/SettingsFeedbinAccountView.swift @@ -93,7 +93,7 @@ struct SettingsFeedbinAccountView : View { do { do { - try workAccount.removeBasicCredentials() + try workAccount.removeCredentials() } catch {} try workAccount.storeCredentials(credentials) @@ -132,7 +132,7 @@ struct SettingsFeedbinAccountView : View { init(account: Account) { self.account = account - if case .basic(let username, let password) = try? account.retrieveBasicCredentials() { + if case .basic(let username, let password) = try? account.retrieveCredentials() { self.email = username self.password = password } diff --git a/iOS/Settings/SettingsReaderAPIAccountView.swift b/iOS/Settings/SettingsReaderAPIAccountView.swift index 6880518c3..0f4f4f2d5 100644 --- a/iOS/Settings/SettingsReaderAPIAccountView.swift +++ b/iOS/Settings/SettingsReaderAPIAccountView.swift @@ -104,7 +104,7 @@ struct SettingsReaderAPIAccountView : View { do { do { - try workAccount.removeBasicCredentials() + try workAccount.removeCredentials() } catch {} workAccount.endpointURL = apiURL @@ -149,7 +149,7 @@ struct SettingsReaderAPIAccountView : View { init(accountType: AccountType, account: Account) { self.account = account self.accountType = accountType - if case .basic(let username, let password) = try? account.retrieveBasicCredentials() { + if case .basic(let username, let password) = try? account.retrieveCredentials() { self.email = username self.password = password } diff --git a/iOS/Settings/UIKit/FeedbinAccountViewController.swift b/iOS/Settings/UIKit/FeedbinAccountViewController.swift index 3cbf24bea..10ca43c82 100644 --- a/iOS/Settings/UIKit/FeedbinAccountViewController.swift +++ b/iOS/Settings/UIKit/FeedbinAccountViewController.swift @@ -30,7 +30,7 @@ class FeedbinAccountViewController: UIViewController { emailTextField.delegate = self passwordTextField.delegate = self - if let account = account, let credentials = try? account.retrieveBasicCredentials() { + if let account = account, let credentials = try? account.retrieveCredentials() { actionButton.setTitle(NSLocalizedString("Update Credentials", comment: "Update Credentials"), for: .normal) if case .basic(let username, let password) = credentials { emailTextField.text = username @@ -77,7 +77,7 @@ class FeedbinAccountViewController: UIViewController { do { do { - try self.account?.removeBasicCredentials() + try self.account?.removeCredentials() } catch {} try self.account?.storeCredentials(credentials) From 6c55fdd8ec16e1f6a07b40ca8632ae3b814b936d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 11:30:55 -0500 Subject: [PATCH 6/7] Make progress indicator NetNewsWire blue --- iOS/Progress/NavigationProgressView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOS/Progress/NavigationProgressView.swift b/iOS/Progress/NavigationProgressView.swift index be281a047..29f73f061 100644 --- a/iOS/Progress/NavigationProgressView.swift +++ b/iOS/Progress/NavigationProgressView.swift @@ -24,7 +24,7 @@ public final class NavigationProgressView: UIView { internal let bar = UIView() - @objc public dynamic var progressTintColor: UIColor? = UIColor(red: 0, green: 122/255, blue: 1, alpha: 1) { + @objc public dynamic var progressTintColor: UIColor? = AppAssets.netNewsWireBlueColor { didSet { bar.backgroundColor = progressTintColor } From 2ee72125baf043470c72c60d98597a1b3cc20299 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 20 Jun 2019 11:58:26 -0500 Subject: [PATCH 7/7] Support dark mode for small avatars on iOS --- Shared/Extensions/RSImage-Extensions.swift | 2 +- iOS/AppAssets.swift | 10 ++--- .../MasterTimelineViewController.swift | 13 +++++++ .../Contents.json | 38 +++++++++++++++++++ .../Contents.json | 20 ---------- .../Contents.json | 20 ---------- 6 files changed, 55 insertions(+), 48 deletions(-) create mode 100644 iOS/Resources/Assets.xcassets/avatarBackgroundColor.colorset/Contents.json delete mode 100644 iOS/Resources/Assets.xcassets/avatarDarkBackgroundColor.colorset/Contents.json delete mode 100644 iOS/Resources/Assets.xcassets/avatarLightBackgroundColor.colorset/Contents.json diff --git a/Shared/Extensions/RSImage-Extensions.swift b/Shared/Extensions/RSImage-Extensions.swift index 3406a959b..44b1e7fb6 100644 --- a/Shared/Extensions/RSImage-Extensions.swift +++ b/Shared/Extensions/RSImage-Extensions.swift @@ -51,7 +51,7 @@ private extension RSImage { let rect = CGRect(x: 0, y: 0, width: avatarSize, height: avatarSize) UIGraphicsBeginImageContext(rect.size) if let context = UIGraphicsGetCurrentContext() { - context.setFillColor(AppAssets.avatarLightBackgroundColor.cgColor) + context.setFillColor(AppAssets.avatarBackgroundColor.cgColor) context.fill(rect) context.translateBy(x: 0.0, y: CGFloat(integerLiteral: avatarSize)); context.scaleBy(x: 1.0, y: -1.0) diff --git a/iOS/AppAssets.swift b/iOS/AppAssets.swift index d53da2302..c28c5e0d3 100644 --- a/iOS/AppAssets.swift +++ b/iOS/AppAssets.swift @@ -10,14 +10,10 @@ import RSCore struct AppAssets { - static var avatarDarkBackgroundColor: UIColor { - return UIColor(named: "avatarDarkBackgroundColor")! - } + static var avatarBackgroundColor: UIColor = { + return UIColor(named: "avatarBackgroundColor")! + }() - static var avatarLightBackgroundColor: UIColor { - return UIColor(named: "avatarLightBackgroundColor")! - } - static var circleClosedImage: RSImage = { return RSImage(named: "circleClosedImage")! }() diff --git a/iOS/MasterTimeline/MasterTimelineViewController.swift b/iOS/MasterTimeline/MasterTimelineViewController.swift index 4d65c3bc3..456f336c7 100644 --- a/iOS/MasterTimeline/MasterTimelineViewController.swift +++ b/iOS/MasterTimeline/MasterTimelineViewController.swift @@ -73,6 +73,19 @@ class MasterTimelineViewController: ProgressTableViewController, UndoableCommand } } + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + if traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle { + appDelegate.authorAvatarDownloader.resetCache() + appDelegate.feedIconDownloader.resetCache() + appDelegate.faviconDownloader.resetCache() + performBlockAndRestoreSelection { + tableView.reloadData() + } + } + } + // MARK Actions @IBAction func markAllAsRead(_ sender: Any) { diff --git a/iOS/Resources/Assets.xcassets/avatarBackgroundColor.colorset/Contents.json b/iOS/Resources/Assets.xcassets/avatarBackgroundColor.colorset/Contents.json new file mode 100644 index 000000000..518412654 --- /dev/null +++ b/iOS/Resources/Assets.xcassets/avatarBackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "242", + "alpha" : "1.000", + "blue" : "242", + "green" : "242" + } + } + }, + { + "idiom" : "universal", + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "56", + "alpha" : "1.000", + "blue" : "56", + "green" : "56" + } + } + } + ] +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/avatarDarkBackgroundColor.colorset/Contents.json b/iOS/Resources/Assets.xcassets/avatarDarkBackgroundColor.colorset/Contents.json deleted file mode 100644 index de7a620f3..000000000 --- a/iOS/Resources/Assets.xcassets/avatarDarkBackgroundColor.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "colors" : [ - { - "idiom" : "universal", - "color" : { - "color-space" : "srgb", - "components" : { - "red" : "56", - "alpha" : "1.000", - "blue" : "56", - "green" : "56" - } - } - } - ] -} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/avatarLightBackgroundColor.colorset/Contents.json b/iOS/Resources/Assets.xcassets/avatarLightBackgroundColor.colorset/Contents.json deleted file mode 100644 index 57a5cc49d..000000000 --- a/iOS/Resources/Assets.xcassets/avatarLightBackgroundColor.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - }, - "colors" : [ - { - "idiom" : "universal", - "color" : { - "color-space" : "srgb", - "components" : { - "red" : "242", - "alpha" : "1.000", - "blue" : "242", - "green" : "242" - } - } - } - ] -} \ No newline at end of file