Mercurial > public > lazybear
changeset 287:22eba376075e
Add custom haptics
author | Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com> |
---|---|
date | Sat, 20 Mar 2021 15:01:05 +0100 |
parents | c1f9ccb421d4 |
children | 53b1c504428a |
files | LazyBear/ContentView.swift LazyBear/Functions/Haptics.swift LazyBear/HapticsManager.swift LazyBear/LazyBearApp.swift LazyBear/UI/CompanyView.swift LazyBear/UI/IconPicker.swift LazyBear/UI/LanguagePicker.swift LazyBear/UI/LineView.swift LazyBear/UI/ThemePicker.swift |
diffstat | 9 files changed, 65 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/LazyBear/ContentView.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/ContentView.swift Sat Mar 20 15:01:05 2021 +0100 @@ -10,6 +10,7 @@ struct ContentView: View { @EnvironmentObject var hudManager: HudManager @EnvironmentObject var deviceSize: DeviceSize + @EnvironmentObject var hapticsManager: HapticsManager // Fetch user appearence settings @FetchRequest(entity: UserSettings.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \UserSettings.changedAt, ascending: false)]) @@ -64,6 +65,7 @@ // Assign device screen size to the class self.deviceSize.width = geo.size.width self.deviceSize.height = geo.size.height + hapticsManager.prepareHaptics() } } }
--- a/LazyBear/Functions/Haptics.swift Fri Mar 19 23:03:57 2021 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -// -// Haptics.swift -// LazyBear -// -// Created by Dennis Concepción Martín on 18/3/21. -// - -import SwiftUI -import CoreHaptics - -class Haptics { - - func simpleSuccess() { - let generator = UINotificationFeedbackGenerator() - generator.notificationOccurred(.success) - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LazyBear/HapticsManager.swift Sat Mar 20 15:01:05 2021 +0100 @@ -0,0 +1,50 @@ +// +// Haptics.swift +// LazyBear +// +// Created by Dennis Concepción Martín on 20/3/21. +// + +import SwiftUI +import CoreHaptics + +class HapticsManager: ObservableObject { + @Published var engine: CHHapticEngine? + + func prepareHaptics() { + guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return } + + do { + self.engine = try CHHapticEngine() + try engine?.start() + } catch { + print("There was an error creating the engine: \(error.localizedDescription)") + } + } + + func simpleSuccess() { + let generator = UINotificationFeedbackGenerator() + generator.notificationOccurred(.success) + } + + func complexSuccess() { + // make sure that the device supports haptics + guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else { return } + var events = [CHHapticEvent]() + + // create one intense, sharp tap + let intensity = CHHapticEventParameter(parameterID: .hapticIntensity, value: 2) + let sharpness = CHHapticEventParameter(parameterID: .hapticSharpness, value: 1) + let event = CHHapticEvent(eventType: .hapticTransient, parameters: [intensity, sharpness], relativeTime: 0) + events.append(event) + + // convert those events into a pattern and play it immediately + do { + let pattern = try CHHapticPattern(events: events, parameters: []) + let player = try engine?.makePlayer(with: pattern) + try player?.start(atTime: 0) + } catch { + print("Failed to play pattern: \(error.localizedDescription).") + } + } +}
--- a/LazyBear/LazyBearApp.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/LazyBearApp.swift Sat Mar 20 15:01:05 2021 +0100 @@ -15,6 +15,7 @@ @ObservedObject var hudManager = HudManager() @ObservedObject var companyOption = CompanyOption() @ObservedObject var deviceSize = DeviceSize() + @ObservedObject var hapticsManager = HapticsManager() var body: some Scene { WindowGroup { @@ -23,6 +24,7 @@ .environmentObject(hudManager) .environmentObject(companyOption) .environmentObject(deviceSize) + .environmentObject(hapticsManager) } } }
--- a/LazyBear/UI/CompanyView.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/UI/CompanyView.swift Sat Mar 20 15:01:05 2021 +0100 @@ -14,10 +14,10 @@ struct CompanyView: View { var name: String var symbol: String - let haptics = Haptics() @State private var scale: CGFloat = 1 @EnvironmentObject var hudManager: HudManager @EnvironmentObject var companyOption: CompanyOption + @EnvironmentObject var hapticsManager: HapticsManager @Environment(\.managedObjectContext) private var moc @FetchRequest(entity: Company.entity(), sortDescriptors: []) var companies: FetchedResults<Company> @@ -37,7 +37,7 @@ .onAppear { companyOption.view = .stock } .toolbar { ToolbarItem(placement: .principal) { - Button(action: { self.hudManager.showAction.toggle(); haptics.simpleSuccess()}) { + Button(action: { self.hudManager.showAction.toggle(); hapticsManager.complexSuccess()}) { HStack { if companyOption.view == .stock { Text("Stock") @@ -75,7 +75,7 @@ do { try moc.save() hudManager.selectHud(type: .notification) - haptics.simpleSuccess() + hapticsManager.simpleSuccess() print("Company saved") } catch { print(error.localizedDescription)
--- a/LazyBear/UI/IconPicker.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/UI/IconPicker.swift Sat Mar 20 15:01:05 2021 +0100 @@ -32,11 +32,11 @@ struct IconRow: View { @Environment(\.colorScheme) var colorScheme // Detect dark mode + @EnvironmentObject var hapticsManager: HapticsManager var icon: IconModel - let haptics = Haptics() var body: some View { - Button(action: { haptics.simpleSuccess(); changeIcon(key: icon.file) }) { + Button(action: { hapticsManager.complexSuccess(); changeIcon(key: icon.file) }) { HStack { Image(icon.file) .resizable()
--- a/LazyBear/UI/LanguagePicker.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/UI/LanguagePicker.swift Sat Mar 20 15:01:05 2021 +0100 @@ -9,8 +9,8 @@ struct LanguagePicker: View { @Environment(\.managedObjectContext) private var moc + @EnvironmentObject var hapticsManager: HapticsManager @State var language: String - let haptics = Haptics() var body: some View { Picker("News language", selection: $language) { @@ -30,7 +30,7 @@ userSettings.newsLanguage = change as? String do { try moc.save() - haptics.simpleSuccess() + hapticsManager.complexSuccess() print("Settings saved") } catch { print(error.localizedDescription)
--- a/LazyBear/UI/LineView.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/UI/LineView.swift Sat Mar 20 15:01:05 2021 +0100 @@ -12,7 +12,6 @@ var width: CGFloat var height: CGFloat var normalizedData: [Double] - let haptics = Haptics() // Drag gesture @Binding var showingChartIndicator: Bool @@ -21,6 +20,7 @@ @FetchRequest(entity: UserSettings.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \UserSettings.changedAt, ascending: false)]) var userSettings: FetchedResults<UserSettings> + @EnvironmentObject var hapticsManager: HapticsManager var body: some View { let colour = Color("\(userSettings.first?.theme?.lowercased() ?? "default")Accent") @@ -69,7 +69,7 @@ self.showingChartIndicator = true self.indexValue = yPointIndex } else { - haptics.simpleSuccess() + hapticsManager.simpleSuccess() } default: break
--- a/LazyBear/UI/ThemePicker.swift Fri Mar 19 23:03:57 2021 +0100 +++ b/LazyBear/UI/ThemePicker.swift Sat Mar 20 15:01:05 2021 +0100 @@ -9,8 +9,8 @@ struct ThemePicker: View { @Environment(\.managedObjectContext) private var moc + @EnvironmentObject var hapticsManager: HapticsManager @State var theme: String - let haptics = Haptics() var body: some View { Picker("Themes", selection: $theme) { @@ -36,7 +36,7 @@ userSettings.theme = change as? String do { try moc.save() - haptics.simpleSuccess() + hapticsManager.complexSuccess() print("Settings saved") } catch { print(error.localizedDescription)