2018-09-03 22:33:00 -07:00
//
// G e n e r a l P r e f e n c e s V i e w C o n t r o l l e r . s w i f t
// N e t N e w s W i r e
//
// C r e a t e d b y B r e n t S i m m o n s o n 9 / 3 / 1 8 .
// C o p y r i g h t © 2 0 1 8 R a n c h e r o S o f t w a r e . A l l r i g h t s r e s e r v e d .
//
import AppKit
import RSCore
2020-05-18 21:29:53 -05:00
import RSWeb
2020-09-06 17:15:46 -04:00
import UserNotifications
2018-09-03 22:33:00 -07:00
final class GeneralPreferencesViewController : NSViewController {
2020-09-06 17:15:46 -04:00
private var userNotificationSettings : UNNotificationSettings ?
2020-05-18 21:29:53 -05:00
@IBOutlet var defaultBrowserPopup : NSPopUpButton !
2020-09-22 19:27:36 -05:00
@IBOutlet weak var showUnreadCountCheckbox : NSButton !
2018-11-26 13:17:16 -08:00
public override init ( nibName nibNameOrNil : NSNib . Name ? , bundle nibBundleOrNil : Bundle ? ) {
super . init ( nibName : nibNameOrNil , bundle : nibBundleOrNil )
commonInit ( )
}
public required init ? ( coder : NSCoder ) {
super . init ( coder : coder )
commonInit ( )
}
2018-09-03 22:33:00 -07:00
override func viewWillAppear ( ) {
2018-11-26 13:17:16 -08:00
super . viewWillAppear ( )
updateUI ( )
2020-09-06 17:15:46 -04:00
updateNotificationSettings ( )
2018-11-26 13:17:16 -08:00
}
// MARK: - N o t i f i c a t i o n s
@objc func applicationWillBecomeActive ( _ note : Notification ) {
updateUI ( )
}
// MARK: - A c t i o n s
2020-05-18 21:29:53 -05:00
@IBAction func browserPopUpDidChangeValue ( _ sender : Any ? ) {
guard let menuItem = defaultBrowserPopup . selectedItem else {
return
}
let bundleID = menuItem . representedObject as ? String
2020-07-02 11:17:38 +08:00
AppDefaults . shared . defaultBrowserID = bundleID
2020-05-18 21:29:53 -05:00
updateUI ( )
}
2020-09-06 13:22:35 -04:00
@IBAction func toggleShowingUnreadCount ( _ sender : Any ) {
guard let checkbox = sender as ? NSButton else { return }
2020-09-06 17:15:46 -04:00
guard userNotificationSettings != nil else {
DispatchQueue . main . async {
self . showUnreadCountCheckbox . setNextState ( )
}
return
}
UNUserNotificationCenter . current ( ) . getNotificationSettings { ( settings ) in
self . updateNotificationSettings ( )
if settings . authorizationStatus = = . denied {
DispatchQueue . main . async {
self . showUnreadCountCheckbox . setNextState ( )
self . showNotificationsDeniedError ( )
}
} else if settings . authorizationStatus = = . authorized {
DispatchQueue . main . async {
AppDefaults . shared . hideDockUnreadCount = ( checkbox . state . rawValue = = 0 )
}
} else {
UNUserNotificationCenter . current ( ) . requestAuthorization ( options : [ . badge ] ) { ( granted , error ) in
self . updateNotificationSettings ( )
if granted {
DispatchQueue . main . async {
AppDefaults . shared . hideDockUnreadCount = checkbox . state . rawValue = = 0
NSApplication . shared . registerForRemoteNotifications ( )
}
} else {
DispatchQueue . main . async {
self . showUnreadCountCheckbox . setNextState ( )
}
}
}
}
}
2020-09-06 13:22:35 -04:00
}
2018-09-03 22:33:00 -07:00
}
2018-11-26 13:17:16 -08:00
// MARK: - P r i v a t e
2018-09-03 22:33:00 -07:00
private extension GeneralPreferencesViewController {
2018-11-26 13:17:16 -08:00
func commonInit ( ) {
NotificationCenter . default . addObserver ( self , selector : #selector ( applicationWillBecomeActive ( _ : ) ) , name : NSApplication . willBecomeActiveNotification , object : nil )
}
func updateUI ( ) {
2020-05-18 21:29:53 -05:00
updateBrowserPopup ( )
2020-09-06 13:22:35 -04:00
updateHideUnreadCountCheckbox ( )
2018-11-26 13:17:16 -08:00
}
2020-09-22 19:27:36 -05:00
func registerAppWithBundleID ( _ bundleID : String ) {
NSWorkspace . shared . setDefaultAppBundleID ( forURLScheme : " feed " , to : bundleID )
NSWorkspace . shared . setDefaultAppBundleID ( forURLScheme : " feeds " , to : bundleID )
}
2020-05-18 21:29:53 -05:00
func updateBrowserPopup ( ) {
let menu = defaultBrowserPopup . menu !
let allBrowsers = MacWebBrowser . sortedBrowsers ( )
menu . removeAllItems ( )
let defaultBrowser = MacWebBrowser . default
let defaultBrowserFormat = NSLocalizedString ( " System Default (%@) " , comment : " Default browser item title format " )
let defaultBrowserTitle = String ( format : defaultBrowserFormat , defaultBrowser . name ! )
let item = NSMenuItem ( title : defaultBrowserTitle , action : nil , keyEquivalent : " " )
let icon = defaultBrowser . icon !
icon . size = NSSize ( width : 16.0 , height : 16.0 )
item . image = icon
menu . addItem ( item )
menu . addItem ( NSMenuItem . separator ( ) )
for browser in allBrowsers {
2020-10-20 12:02:27 -05:00
guard let name = browser . name else { continue }
let item = NSMenuItem ( title : name , action : nil , keyEquivalent : " " )
2020-05-18 21:29:53 -05:00
item . representedObject = browser . bundleIdentifier
2020-10-20 12:02:27 -05:00
let icon = browser . icon ? ? NSWorkspace . shared . icon ( forFileType : kUTTypeApplicationBundle as String )
2020-05-18 21:29:53 -05:00
icon . size = NSSize ( width : 16.0 , height : 16.0 )
item . image = browser . icon
menu . addItem ( item )
}
2020-07-02 11:17:38 +08:00
defaultBrowserPopup . selectItem ( at : defaultBrowserPopup . indexOfItem ( withRepresentedObject : AppDefaults . shared . defaultBrowserID ) )
2020-05-18 21:29:53 -05:00
}
2020-09-06 13:22:35 -04:00
func updateHideUnreadCountCheckbox ( ) {
showUnreadCountCheckbox . state = AppDefaults . shared . hideDockUnreadCount ? . off : . on
}
2020-09-06 17:15:46 -04:00
func updateNotificationSettings ( ) {
UNUserNotificationCenter . current ( ) . getNotificationSettings { ( settings ) in
self . userNotificationSettings = settings
if settings . authorizationStatus = = . authorized {
DispatchQueue . main . async {
NSApplication . shared . registerForRemoteNotifications ( )
}
}
}
}
func showNotificationsDeniedError ( ) {
let updateAlert = NSAlert ( )
updateAlert . alertStyle = . informational
updateAlert . messageText = NSLocalizedString ( " Enable Notifications " , comment : " Notifications " )
updateAlert . informativeText = NSLocalizedString ( " To enable notifications, open Notifications in System Preferences, then find NetNewsWire in the list. " , comment : " To enable notifications, open Notifications in System Preferences, then find NetNewsWire in the list. " )
updateAlert . addButton ( withTitle : NSLocalizedString ( " Open System Preferences " , comment : " Open System Preferences " ) )
updateAlert . addButton ( withTitle : NSLocalizedString ( " Close " , comment : " Close " ) )
let modalResponse = updateAlert . runModal ( )
if modalResponse = = . alertFirstButtonReturn {
2020-09-22 19:27:36 -05:00
NSWorkspace . shared . open ( URL ( string : " x-apple.systempreferences:com.apple.preference.notifications " ) ! )
2020-09-06 17:15:46 -04:00
}
}
2018-11-26 13:17:16 -08:00
}