IceCubesApp/Packages/Env/Sources/Env/HapticManager.swift

75 lines
1.9 KiB
Swift
Raw Normal View History

import CoreHaptics
2023-02-02 15:56:42 +00:00
import UIKit
@MainActor
2023-02-02 15:56:42 +00:00
public class HapticManager {
public static let shared: HapticManager = .init()
2023-02-04 16:17:38 +00:00
#if os(visionOS)
2024-02-14 11:48:14 +00:00
public enum FeedbackType: Int {
case success, warning, error
}
#endif
2024-02-14 11:48:14 +00:00
public enum HapticType {
case buttonPress
case dataRefresh(intensity: CGFloat)
#if os(visionOS)
2024-02-14 11:48:14 +00:00
case notification(_ type: FeedbackType)
#else
2024-02-14 11:48:14 +00:00
case notification(_ type: UINotificationFeedbackGenerator.FeedbackType)
#endif
case tabSelection
case timeline
}
#if !os(visionOS)
2024-02-14 11:48:14 +00:00
private let selectionGenerator = UISelectionFeedbackGenerator()
private let impactGenerator = UIImpactFeedbackGenerator(style: .heavy)
private let notificationGenerator = UINotificationFeedbackGenerator()
#endif
2023-02-04 16:17:38 +00:00
private let userPreferences = UserPreferences.shared
2023-02-02 15:56:42 +00:00
private init() {
#if !os(visionOS)
2024-02-14 11:48:14 +00:00
selectionGenerator.prepare()
impactGenerator.prepare()
#endif
2023-02-02 15:56:42 +00:00
}
2023-02-04 16:17:38 +00:00
@MainActor
public func fireHaptic(_ type: HapticType) {
#if !os(visionOS)
2024-02-14 11:48:14 +00:00
guard supportsHaptics else { return }
2023-02-04 16:17:38 +00:00
2024-02-14 11:48:14 +00:00
switch type {
case .buttonPress:
if userPreferences.hapticButtonPressEnabled {
impactGenerator.impactOccurred()
}
case let .dataRefresh(intensity):
if userPreferences.hapticTimelineEnabled {
impactGenerator.impactOccurred(intensity: intensity)
}
case let .notification(type):
if userPreferences.hapticButtonPressEnabled {
notificationGenerator.notificationOccurred(type)
}
case .tabSelection:
if userPreferences.hapticTabSelectionEnabled {
selectionGenerator.selectionChanged()
}
case .timeline:
if userPreferences.hapticTimelineEnabled {
selectionGenerator.selectionChanged()
}
}
#endif
2023-02-02 15:56:42 +00:00
}
2023-02-04 16:17:38 +00:00
public var supportsHaptics: Bool {
CHHapticEngine.capabilitiesForHardware().supportsHaptics
2023-02-02 15:56:42 +00:00
}
}