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)