2018-09-04 07:33:00 +02: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-19 04:29:53 +02:00
import RSWeb
2020-09-06 23:15:46 +02:00
import UserNotifications
2018-09-04 07:33:00 +02:00
final class GeneralPreferencesViewController : NSViewController {
2020-09-06 23:15:46 +02:00
private var userNotificationSettings : UNNotificationSettings ?
2020-05-19 04:29:53 +02:00
@IBOutlet var defaultBrowserPopup : NSPopUpButton !
2020-09-06 19:22:35 +02:00
@IBOutlet weak var showUnreadCountCheckbox : NSButton !
2018-11-26 22:17:16 +01: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-04 07:33:00 +02:00
override func viewWillAppear ( ) {
2018-11-26 22:17:16 +01:00
super . viewWillAppear ( )
updateUI ( )
2020-09-06 23:15:46 +02:00
updateNotificationSettings ( )
2018-11-26 22:17:16 +01: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-19 04:29:53 +02:00
@IBAction func browserPopUpDidChangeValue ( _ sender : Any ? ) {
guard let menuItem = defaultBrowserPopup . selectedItem else {
return
}
let bundleID = menuItem . representedObject as ? String
2020-07-02 05:17:38 +02:00
AppDefaults . shared . defaultBrowserID = bundleID
2020-05-19 04:29:53 +02:00
updateUI ( )
}
2020-09-06 19:22:35 +02:00
@IBAction func toggleShowingUnreadCount ( _ sender : Any ) {
guard let checkbox = sender as ? NSButton else { return }
2020-09-06 23:15:46 +02: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 19:22:35 +02:00
}
2018-09-04 07:33:00 +02:00
}
2018-11-26 22:17:16 +01:00
// MARK: - P r i v a t e
2018-09-04 07:33:00 +02:00
private extension GeneralPreferencesViewController {
2018-11-26 22:17:16 +01:00
func commonInit ( ) {
NotificationCenter . default . addObserver ( self , selector : #selector ( applicationWillBecomeActive ( _ : ) ) , name : NSApplication . willBecomeActiveNotification , object : nil )
}
func updateUI ( ) {
2020-05-19 04:29:53 +02:00
updateBrowserPopup ( )
2020-09-06 19:22:35 +02:00
updateHideUnreadCountCheckbox ( )
2018-11-26 22:17:16 +01:00
}
2020-05-19 04:29:53 +02: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 {
let item = NSMenuItem ( title : browser . name ! , action : nil , keyEquivalent : " " )
item . representedObject = browser . bundleIdentifier
let icon = browser . icon !
icon . size = NSSize ( width : 16.0 , height : 16.0 )
item . image = browser . icon
menu . addItem ( item )
}
2020-07-02 05:17:38 +02:00
defaultBrowserPopup . selectItem ( at : defaultBrowserPopup . indexOfItem ( withRepresentedObject : AppDefaults . shared . defaultBrowserID ) )
2020-05-19 04:29:53 +02:00
}
2020-09-06 19:22:35 +02:00
func updateHideUnreadCountCheckbox ( ) {
showUnreadCountCheckbox . state = AppDefaults . shared . hideDockUnreadCount ? . off : . on
}
2020-09-06 23:15:46 +02: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 {
NSWorkspace . shared . open ( URL ( fileURLWithPath : " x-apple.systempreferences:com.apple.preference.notifications " ) )
}
}
2018-11-26 22:17:16 +01:00
}