Merge pull request #10 from Ebullioscopic/feature/media

Feature/media
This commit is contained in:
Hariharan Mudaliar 2025-08-03 23:21:07 +05:30 • committed by GitHub
commit a3c74bbde3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 3 deletions

View file

@ -97,6 +97,7 @@ struct AlbumArtView: View {
struct MusicControlsView: View {
@ObservedObject var musicManager = MusicManager.shared
@EnvironmentObject var vm: DynamicIslandViewModel
@State private var sliderValue: Double = 0
@State private var dragging: Bool = false
@State private var lastDragged: Date = .distantPast
@ -108,6 +109,16 @@ struct MusicControlsView: View {
}
.buttonStyle(PlainButtonStyle())
.frame(minWidth: Defaults[.showMirror] && Defaults[.showCalendar] ? 140 : 180)
.onAppear {
// Initialize slider value when view appears
sliderValue = musicManager.elapsedTime
}
.onChange(of: vm.notchState) { _, newState in
// Reset slider value when notch opens to prevent stuck state
if newState == .open && !dragging {
sliderValue = musicManager.elapsedTime
}
}
}
private var songInfoAndSlider: some View {
@ -137,7 +148,7 @@ struct MusicControlsView: View {
}
private var musicSlider: some View {
TimelineView(.animation(minimumInterval: musicManager.playbackRate > 0 ? 0.1 : nil)) { timeline in
TimelineView(.animation(minimumInterval: 0.05)) { timeline in
MusicSliderView(
sliderValue: $sliderValue,
duration: $musicManager.songDuration,
@ -278,7 +289,7 @@ struct MusicSliderView: View {
var currentElapsedTime: Double {
// A small buffer is needed to ensure a meaningful difference between the two dates
guard !dragging, timestampDate.timeIntervalSince(lastDragged) > -0.0001, (timestampDate > lastUpdated || ignoreLastUpdated) else { return sliderValue }
guard !dragging, timestampDate.timeIntervalSince(lastDragged) > -1 else { return sliderValue }
let timeDifference = isPlaying ? currentDate.timeIntervalSince(timestampDate) : 0
let elapsed = elapsedTime + (timeDifference * playbackRate)
return min(elapsed, duration)

View file

@ -274,7 +274,17 @@ class MusicManager: ObservableObject {
self.repeatMode = state.repeatMode
}
self.timestampDate = state.lastUpdated
// Update timestamp - use current time if state doesn't provide recent timestamp
let stateTimestamp = state.lastUpdated
let now = Date()
// If the state timestamp is very recent (within 1 second), use it
// Otherwise, use current time for better real-time calculation
if abs(stateTimestamp.timeIntervalSince(now)) < 1.0 {
self.timestampDate = stateTimestamp
} else {
self.timestampDate = now
}
}
// Execute the batch update on the main thread