Skip to content

Commit b540129

Browse files
committed
multiple: remove references to MusicController in exercises and begin implementation of heart range notifications
1 parent 8cf919c commit b540129

12 files changed

Lines changed: 149 additions & 190 deletions

File tree

.DS_Store

0 Bytes
Binary file not shown.

InfiniLink/BLE/BLECharacteristicHandler.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct BLECharacteristicHandler {
2727

2828
@AppStorage("lastHeartRateUpdateTimestamp") var lastHeartRateUpdateTimestamp: Double = 0
2929
@AppStorage("lastTimeCheckCompleted") var lastTimeCheckCompleted: Double = 0
30-
@AppStorage("lastTimeStepGoalNotified") var lastTimeStepGoalNotified: Double = 86400
30+
@AppStorage("lastTimeStepGoalNotified") var lastTimeStepGoalNotified: Double = 0
3131

3232
func fetchHeartPoints() -> [HeartDataPoint] {
3333
let fetchRequest: NSFetchRequest<HeartDataPoint> = HeartDataPoint.fetchRequest()
@@ -234,7 +234,10 @@ struct BLECharacteristicHandler {
234234
}
235235
private func updateHeartRate(bpm: Int) {
236236
lastHeartRateUpdateTimestamp = Date().timeIntervalSince1970
237+
237238
healthKitManager.writeHeartRate(date: Date(), dataToAdd: bleManager.heartRate)
238239
chartManager.addHeartRateDataPoint(heartRate: Double(bpm), time: Date())
240+
241+
notificationManager.sendHeartRangeNotification(bpm)
239242
}
240243
}

InfiniLink/Core/Components/ActionView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct ActionView: View {
4545
.padding(10)
4646
.font(.body.weight(.semibold))
4747
.background(action.accent)
48-
.foregroundStyle(.white) // TODO: check this works for all accents
48+
.foregroundStyle(.white)
4949
.clipShape(RoundedRectangle(cornerRadius: 10))
5050
Text(NSLocalizedString(action.title, comment: ""))
5151
.font(.system(size: 28).weight(.bold))

InfiniLink/Core/Exercise/View Model/ExerciseViewModel.swift

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class ExerciseViewModel: ObservableObject {
1414

1515
let healthKitManager = HealthKitManager.shared
1616

17-
@Published var playedTracks = [PlayedTrack]()
1817
@Published var exerciseTime: TimeInterval = 0
1918
@Published var stepsTaken: Int = 0
2019
@Published var currentExercise: Exercise?
@@ -60,18 +59,6 @@ class ExerciseViewModel: ObservableObject {
6059
}
6160
}
6261

63-
func addTrackToExercise(title: String, artist: String) {
64-
let track = PlayedTrack(context: PersistenceController.shared.container.viewContext)
65-
track.id = UUID()
66-
track.timestamp = Date()
67-
track.title = title
68-
track.artist = artist
69-
70-
if !playedTracks.contains(where: { $0.title == track.title && $0.artist == track.artist }) {
71-
playedTracks.append(track)
72-
}
73-
}
74-
7562
func reset() {
7663
stepsTaken = 0
7764
exerciseTime = 0
@@ -97,7 +84,6 @@ class ExerciseViewModel: ObservableObject {
9784
newExercise.startDate = startDate
9885
newExercise.endDate = Date()
9986
newExercise.exerciseId = exercise
100-
newExercise.playedTracks = NSSet(array: playedTracks)
10187
newExercise.heartPoints = NSSet(array: heartPoints)
10288
newExercise.steps = Int32(stepsTaken)
10389

InfiniLink/Core/Exercise/Views/ActiveExerciseView.swift

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ struct ActiveExerciseView: View {
1414
@Environment(\.managedObjectContext) var viewContext
1515

1616
@ObservedObject var exerciseViewModel = ExerciseViewModel.shared
17-
@ObservedObject var musicController = MusicController.shared
1817
@ObservedObject var bleManager = BLEManager.shared
1918

2019
@Binding var exercise: Exercise?
@@ -55,43 +54,6 @@ struct ActiveExerciseView: View {
5554
}
5655
}
5756
Spacer()
58-
if musicController.musicPlaying != 0 {
59-
HStack(spacing: 12) {
60-
if let artwork = musicController.musicPlayer.nowPlayingItem?.artwork, let image = artwork.image(at: CGSize(width: 52, height: 52)) {
61-
Image(uiImage: image)
62-
.resizable()
63-
.aspectRatio(contentMode: .fit)
64-
.frame(width: 52, height: 52)
65-
.clipShape(RoundedRectangle(cornerRadius: 10))
66-
}
67-
VStack(alignment: .leading, spacing: 2) {
68-
Text(musicController.musicPlayer.nowPlayingItem?.title ?? "Not Playing")
69-
.fontWeight(.bold)
70-
if let artist = musicController.musicPlayer.nowPlayingItem?.artist {
71-
Text(artist)
72-
}
73-
}
74-
Spacer()
75-
HStack(spacing: 16) {
76-
Button {
77-
musicController.musicPlaying == 1 ? musicController.pause() : musicController.play()
78-
} label: {
79-
Image(systemName: musicController.musicPlaying == 1 ? "pause.fill" : "play.fill")
80-
.font(.system(size: 21))
81-
}
82-
Button {
83-
musicController.skipForward()
84-
} label: {
85-
Image(systemName: "forward.fill")
86-
.font(.system(size: 22))
87-
}
88-
}
89-
}
90-
.padding(14)
91-
.foregroundStyle(Color.primary)
92-
.background(Material.regular)
93-
.clipShape(RoundedRectangle(cornerRadius: 20))
94-
}
9557
HStack(spacing: 14) {
9658
Spacer()
9759
Button {
@@ -145,7 +107,6 @@ struct ActiveExerciseView: View {
145107
currentStepCount = bleManager.stepCount
146108
DispatchQueue.main.async {
147109
startTimer()
148-
musicController.updateMusicInformation()
149110
}
150111
}
151112
// Should these onChanges go in BLECharacteristicHandler?

InfiniLink/Core/Exercise/Views/ExerciseDetailView.swift

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,35 +93,13 @@ struct ExerciseDetailView: View {
9393
.foregroundStyle(.gray)
9494
}
9595
}
96-
if let tracks = userExercise.playedTracks, tracks.count > 1 {
97-
HStack {
98-
Text("Total Tracks Played")
99-
Text("\(tracks.count)")
100-
.foregroundStyle(.gray)
101-
}
102-
}
10396
}
10497
if heartPoints.count > 1 {
10598
Section("Heart Rate") {
10699
HeartChartView(showHeader: false)
107100
}
108101
.listRowBackground(Color.clear)
109102
}
110-
if let tracksSet = userExercise.playedTracks as? Set<PlayedTrack>, tracksSet.count > 1 {
111-
let tracks = Array(tracksSet).sorted(by: { $0.timestamp ?? Date() < $1.timestamp ?? Date() })
112-
113-
Section("Played Tracks") {
114-
ForEach(tracks) { track in
115-
if let title = track.title, let artist = track.artist {
116-
VStack(alignment: .leading, spacing: 5) {
117-
Text(title)
118-
.fontWeight(.bold)
119-
Text(artist)
120-
}
121-
}
122-
}
123-
}
124-
}
125103
}
126104
}
127105
}

InfiniLink/Core/Settings/General/GeneralSettingsView.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,6 @@ struct GeneralSettingsView: View {
3636
}
3737
.disabled(bleManager.blefsTransfer == nil)
3838
}
39-
Section {
40-
// TODO: implement non-dummy input form in SetUpDetailsView
41-
/*
42-
NavigationLink {
43-
SetUpDetailsView(listOnly: true)
44-
.navigationBarTitle("Health Details")
45-
} label: {
46-
Text("Health Details")
47-
}
48-
*/
49-
}
5039
Section {
5140
NavigationLink {
5241
AppearanceView()

InfiniLink/Core/Settings/Notifications/NotificationsSettingsView.swift

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ struct NotificationsSettingsView: View {
1515
@AppStorage("waterReminder") var waterReminder = true
1616
@AppStorage("waterReminderAmount") var waterReminderAmount = 7
1717
@AppStorage("standUpReminder") var standUpReminder = true
18+
@AppStorage("heartRangeReminder") var heartRangeReminder = true
19+
@AppStorage("minHeartRange") var minHeartRange = 40
20+
@AppStorage("maxHeartRange") var maxHeartRange = 150
1821
@AppStorage("watchNotifications") var watchNotifications = true
1922
@AppStorage("enableReminders") var enableReminders = true
2023
@AppStorage("enableCalendarNotifications") var enableCalendarNotifications = true
@@ -49,7 +52,7 @@ struct NotificationsSettingsView: View {
4952
Toggle("Water Reminder", isOn: $waterReminder)
5053
if waterReminder {
5154
Picker("Interval", selection: $waterReminderAmount) {
52-
ForEach(0..<9) { amount in
55+
ForEach(0..<9, id: \.self) { amount in
5356
Text("\(amount + 1) time\(amount == 0 ? "" : "s")")
5457
}
5558
}
@@ -60,6 +63,21 @@ struct NotificationsSettingsView: View {
6063
Toggle("Stand-up Reminder", isOn: $standUpReminder)
6164
}
6265
*/
66+
Section(footer: Text("Get a notification whenn your heart rate goes above or below the specified range.")) {
67+
Toggle("Heart Range Notifications", isOn: $heartRangeReminder)
68+
if heartRangeReminder {
69+
HStack {
70+
Text("Minimum")
71+
Stepper("\(minHeartRange)", value: $minHeartRange, in: 40...(maxHeartRange - 1), step: 1)
72+
.fontWeight(.semibold)
73+
}
74+
HStack {
75+
Text("Maximum")
76+
Stepper("\(maxHeartRange)", value: $maxHeartRange, in: (minHeartRange + 1)...220, step: 1)
77+
.fontWeight(.semibold)
78+
}
79+
}
80+
}
6381
Section(header: Text("Daily Goals"), footer: Text("Get notified when you reach your daily fitness goals.")) {
6482
Toggle("Steps", isOn: $remindOnStepGoalCompletion)
6583
}

InfiniLink/InfiniLink.xcdatamodeld/InfiniLink.xcdatamodel/contents

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23605" systemVersion="24C5089c" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
2+
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23605" systemVersion="24D5040f" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithSwiftData="YES" userDefinedModelVersionIdentifier="">
33
<entity name="BatteryDataPoint" representedClassName="BatteryDataPoint" syncable="YES" codeGenerationType="class">
44
<attribute name="deviceId" optional="YES" attributeType="String"/>
55
<attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
@@ -51,13 +51,6 @@
5151
<attribute name="weatherEnable" attributeType="Integer 16" defaultValueString="1" usesScalarValueType="YES"/>
5252
<relationship name="device" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Device" inverseName="pineTimeStyle" inverseEntity="Device"/>
5353
</entity>
54-
<entity name="PlayedTrack" representedClassName="PlayedTrack" syncable="YES" codeGenerationType="class">
55-
<attribute name="artist" optional="YES" attributeType="String"/>
56-
<attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
57-
<attribute name="timestamp" attributeType="Date" usesScalarValueType="NO"/>
58-
<attribute name="title" attributeType="String"/>
59-
<relationship name="exercise" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="UserExercise" inverseName="playedTracks" inverseEntity="UserExercise"/>
60-
</entity>
6154
<entity name="SleepDataPoint" representedClassName="SleepDataPoint" syncable="YES" codeGenerationType="class">
6255
<attribute name="deviceId" optional="YES" attributeType="String"/>
6356
<attribute name="id" attributeType="UUID" usesScalarValueType="NO"/>
@@ -77,6 +70,5 @@
7770
<attribute name="startDate" attributeType="Date" usesScalarValueType="NO"/>
7871
<attribute name="steps" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
7972
<relationship name="heartPoints" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="HeartDataPoint" inverseName="exercise" inverseEntity="HeartDataPoint"/>
80-
<relationship name="playedTracks" toMany="YES" deletionRule="Nullify" destinationEntity="PlayedTrack" inverseName="exercise" inverseEntity="PlayedTrack"/>
8173
</entity>
82-
</model>
74+
</model>

InfiniLink/Localizable.xcstrings

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,9 @@
408408
},
409409
"General" : {
410410

411+
},
412+
"Get a notification whenn your heart rate goes above or below the specified range." : {
413+
411414
},
412415
"Get notifications on your watch when you reach goals, when it's time to drink water, and more." : {
413416

@@ -441,9 +444,18 @@
441444
},
442445
"Health Details" : {
443446

447+
},
448+
"Heart Range Notifications" : {
449+
444450
},
445451
"Heart Rate" : {
446452

453+
},
454+
"Heart Rate High" : {
455+
456+
},
457+
"Heart Rate Low" : {
458+
447459
},
448460
"Height" : {
449461

@@ -525,9 +537,15 @@
525537
},
526538
"M" : {
527539

540+
},
541+
"Maximum" : {
542+
528543
},
529544
"Metric" : {
530545

546+
},
547+
"Minimum" : {
548+
531549
},
532550
"Music" : {
533551

@@ -579,9 +597,6 @@
579597
},
580598
"Pair New Device" : {
581599

582-
},
583-
"Played Tracks" : {
584-
585600
},
586601
"Pull Request #2217 on GitHub" : {
587602

@@ -711,9 +726,6 @@
711726
},
712727
"Total Steps" : {
713728

714-
},
715-
"Total Tracks Played" : {
716-
717729
},
718730
"Units" : {
719731

0 commit comments

Comments
 (0)