// // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // import Foundation protocol SelectionHapticFeedbackAdapter { func selectionChanged() } class SelectionHapticFeedback: SelectionHapticFeedbackAdapter { let adapter: SelectionHapticFeedbackAdapter init() { if #available(iOS 10, *) { adapter = ModernSelectionHapticFeedbackAdapter() } else { adapter = LegacySelectionHapticFeedbackAdapter() } } func selectionChanged() { adapter.selectionChanged() } } class LegacySelectionHapticFeedbackAdapter: NSObject, SelectionHapticFeedbackAdapter { func selectionChanged() { // do nothing } } @available(iOS 10, *) class ModernSelectionHapticFeedbackAdapter: NSObject, SelectionHapticFeedbackAdapter { let selectionFeedbackGenerator: UISelectionFeedbackGenerator override init() { selectionFeedbackGenerator = UISelectionFeedbackGenerator() selectionFeedbackGenerator.prepare() } // MARK: HapticAdapter func selectionChanged() { selectionFeedbackGenerator.selectionChanged() selectionFeedbackGenerator.prepare() } } enum NotificationHapticFeedbackType { case error, success, warning } extension NotificationHapticFeedbackType { var uiNotificationFeedbackType: UINotificationFeedbackGenerator.FeedbackType { switch self { case .error: return .error case .success: return .success case .warning: return .warning } } } protocol NotificationHapticFeedbackAdapter { func notificationOccurred(_ notificationType: NotificationHapticFeedbackType) } class NotificationHapticFeedback: NotificationHapticFeedbackAdapter { let adapter: NotificationHapticFeedbackAdapter init() { adapter = ModernNotificationHapticFeedbackAdapter() } func notificationOccurred(_ notificationType: NotificationHapticFeedbackType) { adapter.notificationOccurred(notificationType) } } class ModernNotificationHapticFeedbackAdapter: NotificationHapticFeedbackAdapter { let feedbackGenerator = UINotificationFeedbackGenerator() init() { feedbackGenerator.prepare() } func notificationOccurred(_ notificationType: NotificationHapticFeedbackType) { feedbackGenerator.notificationOccurred(notificationType.uiNotificationFeedbackType) feedbackGenerator.prepare() } }