This commit is contained in:
Trey t
2023-08-12 13:41:53 -05:00
parent 4824fbc0fe
commit 2aa83f12f2
6 changed files with 89 additions and 6 deletions

View File

@@ -22,6 +22,8 @@
1C4AFF1B2A65FB190027710B /* CurrentWorkoutInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */; }; 1C4AFF1B2A65FB190027710B /* CurrentWorkoutInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */; };
1C4AFF1C2A65FB2B0027710B /* CurrentWorkoutInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */; }; 1C4AFF1C2A65FB2B0027710B /* CurrentWorkoutInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */; };
1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1D2A7579410027710B /* NSFWVideo.swift */; }; 1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1D2A7579410027710B /* NSFWVideo.swift */; };
1C4AFF202A8800860027710B /* AudioQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1F2A8800860027710B /* AudioQueue.swift */; };
1C4AFF212A8801090027710B /* AudioQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AFF1F2A8800860027710B /* AudioQueue.swift */; };
1C5190C22A57CA5F00885849 /* OvalTextFieldStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */; }; 1C5190C22A57CA5F00885849 /* OvalTextFieldStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */; };
1C5190C42A589CAC00885849 /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C32A589CAC00885849 /* InfoView.swift */; }; 1C5190C42A589CAC00885849 /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C32A589CAC00885849 /* InfoView.swift */; };
1C5190C62A589CC100885849 /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C52A589CC100885849 /* ActionsView.swift */; }; 1C5190C62A589CC100885849 /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5190C52A589CC100885849 /* ActionsView.swift */; };
@@ -137,6 +139,7 @@
1C4AFF172A65CD290027710B /* Superset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Superset.swift; sourceTree = "<group>"; }; 1C4AFF172A65CD290027710B /* Superset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Superset.swift; sourceTree = "<group>"; };
1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentWorkoutInfo.swift; sourceTree = "<group>"; }; 1C4AFF1A2A65FB190027710B /* CurrentWorkoutInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentWorkoutInfo.swift; sourceTree = "<group>"; };
1C4AFF1D2A7579410027710B /* NSFWVideo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSFWVideo.swift; sourceTree = "<group>"; }; 1C4AFF1D2A7579410027710B /* NSFWVideo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSFWVideo.swift; sourceTree = "<group>"; };
1C4AFF1F2A8800860027710B /* AudioQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioQueue.swift; sourceTree = "<group>"; };
1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OvalTextFieldStyle.swift; sourceTree = "<group>"; }; 1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OvalTextFieldStyle.swift; sourceTree = "<group>"; };
1C5190C32A589CAC00885849 /* InfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoView.swift; sourceTree = "<group>"; }; 1C5190C32A589CAC00885849 /* InfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoView.swift; sourceTree = "<group>"; };
1C5190C52A589CC100885849 /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = "<group>"; }; 1C5190C52A589CC100885849 /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = "<group>"; };
@@ -325,6 +328,7 @@
1CF65A422A39FB410042FFBD /* Workout.swift */, 1CF65A422A39FB410042FFBD /* Workout.swift */,
1C4AFF172A65CD290027710B /* Superset.swift */, 1C4AFF172A65CD290027710B /* Superset.swift */,
1C4AFF1D2A7579410027710B /* NSFWVideo.swift */, 1C4AFF1D2A7579410027710B /* NSFWVideo.swift */,
1C4AFF1F2A8800860027710B /* AudioQueue.swift */,
); );
path = APIModels; path = APIModels;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -602,6 +606,7 @@
1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */, 1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */,
1C5190D02A589D5F00885849 /* AllWorkoutsListView.swift in Sources */, 1C5190D02A589D5F00885849 /* AllWorkoutsListView.swift in Sources */,
1C5190CA2A589CEC00885849 /* ExerciseListView.swift in Sources */, 1C5190CA2A589CEC00885849 /* ExerciseListView.swift in Sources */,
1C4AFF202A8800860027710B /* AudioQueue.swift in Sources */,
1CAF4D8A2A5132F900B00E50 /* PlannedWorkout.swift in Sources */, 1CAF4D8A2A5132F900B00E50 /* PlannedWorkout.swift in Sources */,
1C5190C22A57CA5F00885849 /* OvalTextFieldStyle.swift in Sources */, 1C5190C22A57CA5F00885849 /* OvalTextFieldStyle.swift in Sources */,
1C5190CC2A589D0000885849 /* CountdownView.swift in Sources */, 1C5190CC2A589D0000885849 /* CountdownView.swift in Sources */,
@@ -637,6 +642,7 @@
1CF65AA92A452D9C0042FFBD /* Workout.swift in Sources */, 1CF65AA92A452D9C0042FFBD /* Workout.swift in Sources */,
1CF65AA62A452D9C0042FFBD /* Equipment.swift in Sources */, 1CF65AA62A452D9C0042FFBD /* Equipment.swift in Sources */,
1C4AFF162A60F27E0027710B /* ThotStyle.swift in Sources */, 1C4AFF162A60F27E0027710B /* ThotStyle.swift in Sources */,
1C4AFF212A8801090027710B /* AudioQueue.swift in Sources */,
1CF65AB12A452E1A0042FFBD /* BridgeModule.swift in Sources */, 1CF65AB12A452E1A0042FFBD /* BridgeModule.swift in Sources */,
1CF65AAA2A452D9C0042FFBD /* RegisteredUser.swift in Sources */, 1CF65AAA2A452D9C0042FFBD /* RegisteredUser.swift in Sources */,
1CF65AB62A4532940042FFBD /* WatchMainViewModel.swift in Sources */, 1CF65AB62A4532940042FFBD /* WatchMainViewModel.swift in Sources */,

View File

@@ -0,0 +1,40 @@
//
// AudioQueue.swift
// Werkout_ios
//
// Created by Trey Tartt on 8/12/23.
//
import Foundation
enum AudioType {
case shortBeep
case finishBeep
case remoteURL(URL)
}
struct AudioQueue: Codable, Identifiable, Equatable {
var id = UUID()
let playAt: Int
let audioURL: String
enum CodingKeys: String, CodingKey {
case playAt = "play_at"
case audioURL = "audio_url"
}
var audioType: AudioType {
if audioURL == "short_beep" {
return .shortBeep
} else if audioURL == "long_beep" {
return .finishBeep
} else {
if let url = URL(string: BaseURLs.currentBaseURL + "/media/" + audioURL) {
return .remoteURL(url)
} else {
return .shortBeep
}
}
}
}

View File

@@ -21,6 +21,7 @@ struct SupersetExercise: Identifiable, Codable, Equatable, Hashable {
let order, superset: Int? let order, superset: Int?
let uniqueID: String? let uniqueID: String?
let description: String? let description: String?
let audioQueues: [AudioQueue]?
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case workout, exercise, weight, reps, duration, order, superset, id, description case workout, exercise, weight, reps, duration, order, superset, id, description
@@ -28,6 +29,7 @@ struct SupersetExercise: Identifiable, Codable, Equatable, Hashable {
case weightAudio = "weight_audio" case weightAudio = "weight_audio"
case createdAt = "created_at" case createdAt = "created_at"
case uniqueID = "unique_id" case uniqueID = "unique_id"
case audioQueues = "audio_queues"
} }
public func hash(into hasher: inout Hasher) { public func hash(into hasher: inout Hasher) {

View File

@@ -12,6 +12,6 @@ enum BaseURLs: String {
case dev = "https://dev.werkout.fitness" case dev = "https://dev.werkout.fitness"
static var currentBaseURL: String { static var currentBaseURL: String {
return BaseURLs.dev.rawValue return BaseURLs.local.rawValue
} }
} }

View File

@@ -54,6 +54,7 @@ class BridgeModule: NSObject, ObservableObject {
public private(set) var heartRates: [Int]? public private(set) var heartRates: [Int]?
var audioPlayer: AVAudioPlayer? var audioPlayer: AVAudioPlayer?
var avPlayer: AVPlayer?
func start(workout: Workout) { func start(workout: Workout) {
currentExerciseInfo.complete = { currentExerciseInfo.complete = {
@@ -130,11 +131,23 @@ class BridgeModule: NSObject, ObservableObject {
} }
@objc func updateCurrentExerciseTimer() { @objc func updateCurrentExerciseTimer() {
if currentExerciseTimeLeft > 0 { if currentExerciseTimeLeft > 1 {
currentExerciseTimeLeft -= 1 currentExerciseTimeLeft -= 1
if currentExerciseTimeLeft <= 3 { if let currentExercise = currentExerciseInfo.allSupersetExecercise, let audioQueues = currentExercise.audioQueues {
playBeep() if let audioQueue = audioQueues.first(where: {
$0.playAt == currentExerciseTimeLeft
}) {
switch audioQueue.audioType {
case .shortBeep:
playBeep()
case .finishBeep:
playFinished()
case .remoteURL(let url):
playRemoteAudio(fromURL: url)
}
}
} }
sendCurrentExerciseToWatch() sendCurrentExerciseToWatch()
} else { } else {
@@ -154,7 +167,6 @@ class BridgeModule: NSObject, ObservableObject {
func nextExercise() { func nextExercise() {
if let nextSupersetExercise = currentExerciseInfo.nextExercise { if let nextSupersetExercise = currentExerciseInfo.nextExercise {
updateCurrent(exercise: nextSupersetExercise) updateCurrent(exercise: nextSupersetExercise)
playFinished()
} else { } else {
completeWorkout() completeWorkout()
} }
@@ -205,6 +217,23 @@ class BridgeModule: NSObject, ObservableObject {
} }
} }
func playRemoteAudio(fromURL url: URL) {
#if os(iOS)
let playerItem = AVPlayerItem(url: url)
do {
try AVAudioSession.sharedInstance().setCategory(.playback,
mode: .default,
options: [.mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
avPlayer = AVPlayer(playerItem: playerItem)
avPlayer?.play()
} catch {
print("ERROR")
}
#endif
}
func playBeep() { func playBeep() {
#if os(iOS) #if os(iOS)
if let path = Bundle.main.path(forResource: "short_beep", ofType: "m4a") { if let path = Bundle.main.path(forResource: "short_beep", ofType: "m4a") {
@@ -283,6 +312,7 @@ extension BridgeModule: WCSessionDelegate {
switch model { switch model {
case .nextExercise: case .nextExercise:
nextExercise() nextExercise()
playFinished()
case .workoutComplete(let data): case .workoutComplete(let data):
let model = try! JSONDecoder().decode(WatchFinishWorkoutModel.self, from: data) let model = try! JSONDecoder().decode(WatchFinishWorkoutModel.self, from: data)
totalCaloire = Float(model.totalBurnedEnergery) totalCaloire = Float(model.totalBurnedEnergery)

View File

@@ -33,6 +33,11 @@ class CurrentWorkoutInfo {
return exercise return exercise
} }
var allSupersetExecercise: SupersetExercise? {
let obj = workout?.allSupersetExecercise?[allSupersetExecerciseIndex]
return obj
}
var nextExercise: SupersetExercise? { var nextExercise: SupersetExercise? {
guard let workout = workout else { return nil } guard let workout = workout else { return nil }
guard let supersets = workout.supersets else { return nil } guard let supersets = workout.supersets else { return nil }