Add Home Page Quick Actions
This commit is contained in:
parent
189af8d816
commit
33882ab276
|
@ -75,24 +75,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
|
||||||
let localAccount = AccountManager.shared.defaultAccount
|
let localAccount = AccountManager.shared.defaultAccount
|
||||||
DefaultFeedsImporter.importIfNeeded(isFirstRun, account: localAccount)
|
DefaultFeedsImporter.importIfNeeded(isFirstRun, account: localAccount)
|
||||||
|
|
||||||
let tempDir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
|
initializeDownloaders()
|
||||||
let faviconsFolderURL = tempDir.appendingPathComponent("Favicons")
|
initializeHomeScreenQuickActions()
|
||||||
try! FileManager.default.createDirectory(at: faviconsFolderURL, withIntermediateDirectories: true, attributes: nil)
|
|
||||||
let faviconsFolder = faviconsFolderURL.absoluteString
|
|
||||||
let faviconsFolderPath = faviconsFolder.suffix(from: faviconsFolder.index(faviconsFolder.startIndex, offsetBy: 7))
|
|
||||||
faviconDownloader = FaviconDownloader(folder: String(faviconsFolderPath))
|
|
||||||
|
|
||||||
let imagesFolderURL = tempDir.appendingPathComponent("Images")
|
|
||||||
let imagesFolder = imagesFolderURL.absoluteString
|
|
||||||
let imagesFolderPath = imagesFolder.suffix(from: imagesFolder.index(imagesFolder.startIndex, offsetBy: 7))
|
|
||||||
try! FileManager.default.createDirectory(at: imagesFolderURL, withIntermediateDirectories: true, attributes: nil)
|
|
||||||
imageDownloader = ImageDownloader(folder: String(imagesFolderPath))
|
|
||||||
|
|
||||||
authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader)
|
|
||||||
|
|
||||||
let tempFolder = tempDir.absoluteString
|
|
||||||
let tempFolderPath = tempFolder.suffix(from: tempFolder.index(tempFolder.startIndex, offsetBy: 7))
|
|
||||||
feedIconDownloader = FeedIconDownloader(imageDownloader: imageDownloader, folder: String(tempFolderPath))
|
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.unreadCount = AccountManager.shared.unreadCount
|
self.unreadCount = AccountManager.shared.unreadCount
|
||||||
|
@ -188,8 +172,47 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: App Initialization
|
||||||
|
|
||||||
|
private extension AppDelegate {
|
||||||
|
|
||||||
|
private func initializeDownloaders() {
|
||||||
|
let tempDir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
|
||||||
|
let faviconsFolderURL = tempDir.appendingPathComponent("Favicons")
|
||||||
|
try! FileManager.default.createDirectory(at: faviconsFolderURL, withIntermediateDirectories: true, attributes: nil)
|
||||||
|
let faviconsFolder = faviconsFolderURL.absoluteString
|
||||||
|
let faviconsFolderPath = faviconsFolder.suffix(from: faviconsFolder.index(faviconsFolder.startIndex, offsetBy: 7))
|
||||||
|
faviconDownloader = FaviconDownloader(folder: String(faviconsFolderPath))
|
||||||
|
|
||||||
|
let imagesFolderURL = tempDir.appendingPathComponent("Images")
|
||||||
|
let imagesFolder = imagesFolderURL.absoluteString
|
||||||
|
let imagesFolderPath = imagesFolder.suffix(from: imagesFolder.index(imagesFolder.startIndex, offsetBy: 7))
|
||||||
|
try! FileManager.default.createDirectory(at: imagesFolderURL, withIntermediateDirectories: true, attributes: nil)
|
||||||
|
imageDownloader = ImageDownloader(folder: String(imagesFolderPath))
|
||||||
|
|
||||||
|
authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader)
|
||||||
|
|
||||||
|
let tempFolder = tempDir.absoluteString
|
||||||
|
let tempFolderPath = tempFolder.suffix(from: tempFolder.index(tempFolder.startIndex, offsetBy: 7))
|
||||||
|
feedIconDownloader = FeedIconDownloader(imageDownloader: imageDownloader, folder: String(tempFolderPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
private func initializeHomeScreenQuickActions() {
|
||||||
|
let unreadTitle = NSLocalizedString("First Unread", comment: "First Unread")
|
||||||
|
let unreadIcon = UIApplicationShortcutIcon(systemImageName: "arrow.down.circle")
|
||||||
|
let unreadItem = UIApplicationShortcutItem(type: "com.ranchero.NetNewsWire.FirstUnread", localizedTitle: unreadTitle, localizedSubtitle: nil, icon: unreadIcon, userInfo: nil)
|
||||||
|
|
||||||
|
let searchTitle = NSLocalizedString("Search", comment: "Search")
|
||||||
|
let searchIcon = UIApplicationShortcutIcon(systemImageName: "magnifyingglass")
|
||||||
|
let searchItem = UIApplicationShortcutItem(type: "com.ranchero.NetNewsWire.ShowSearch", localizedTitle: searchTitle, localizedSubtitle: nil, icon: searchIcon, userInfo: nil)
|
||||||
|
|
||||||
|
UIApplication.shared.shortcutItems = [searchItem, unreadItem]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Background Tasks
|
||||||
|
|
||||||
// MARK: - Background Tasks
|
|
||||||
private extension AppDelegate {
|
private extension AppDelegate {
|
||||||
|
|
||||||
/// Register all background tasks.
|
/// Register all background tasks.
|
||||||
|
@ -264,7 +287,6 @@ private extension AppDelegate {
|
||||||
|
|
||||||
private extension AppDelegate {
|
private extension AppDelegate {
|
||||||
|
|
||||||
|
|
||||||
func sendReceivedArticlesUserNotification(newArticleCount: Int) {
|
func sendReceivedArticlesUserNotification(newArticleCount: Int) {
|
||||||
|
|
||||||
let content = UNMutableNotificationContent()
|
let content = UNMutableNotificationContent()
|
||||||
|
|
|
@ -584,6 +584,11 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func selectFirstUnreadInAllUnread() {
|
||||||
|
selectFeed(IndexPath(row: 1, section: 0))
|
||||||
|
selectFirstUnreadArticleInTimeline()
|
||||||
|
}
|
||||||
|
|
||||||
func selectFirstUnread() {
|
func selectFirstUnread() {
|
||||||
selectFirstUnreadArticleInTimeline()
|
selectFirstUnreadArticleInTimeline()
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||||
window!.rootViewController = coordinator.start()
|
window!.rootViewController = coordinator.start()
|
||||||
window!.makeKeyAndVisible()
|
window!.makeKeyAndVisible()
|
||||||
|
|
||||||
|
if let shortcutItem = connectionOptions.shortcutItem {
|
||||||
|
handleShortcutItem(shortcutItem)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if let userActivity = connectionOptions.userActivities.first ?? session.stateRestorationActivity {
|
if let userActivity = connectionOptions.userActivities.first ?? session.stateRestorationActivity {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
||||||
self.coordinator.handle(userActivity)
|
self.coordinator.handle(userActivity)
|
||||||
|
@ -28,6 +33,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
|
||||||
|
handleShortcutItem(shortcutItem)
|
||||||
|
completionHandler(true)
|
||||||
|
}
|
||||||
|
|
||||||
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
|
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
|
||||||
coordinator.handle(userActivity)
|
coordinator.handle(userActivity)
|
||||||
}
|
}
|
||||||
|
@ -45,3 +55,16 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private extension SceneDelegate {
|
||||||
|
|
||||||
|
func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem) {
|
||||||
|
switch shortcutItem.type {
|
||||||
|
case "com.ranchero.NetNewsWire.FirstUnread":
|
||||||
|
coordinator.selectFirstUnreadInAllUnread()
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue