Refined the Recording Live Activity presentation in the Attendi widget target.

This commit is contained in:
2026-07-06 04:07:14 +02:00
parent a1a27a51c2
commit 0f889e22e4
3 changed files with 39 additions and 42 deletions
@@ -37,8 +37,8 @@ struct ActionButtonStyle: PrimitiveButtonStyle {
width: Constant.Size.icon.width,
height: Constant.Size.icon.height
)
.foregroundStyle(.primary)
.padding(Constant.Padding.icon)
.foregroundStyle(.windowBackground)
.background {
Circle()
.foregroundStyle(backgroundColor)
@@ -18,13 +18,12 @@ struct RecordingLiveActivityView: View {
alignment: .center,
spacing: Constant.Spacing.stack
) {
RecordingStateLabel(state: state)
RecordingTimerText(state: state)
.font(.largeTitle)
.fontWeight(.bold)
.monospacedDigit()
RecordingStateLabel(state: state)
RecordingControls(state: state)
}
}
@@ -35,35 +34,11 @@ struct RecordingLiveActivityView: View {
/// The constant values used across the recording Live Activity.
private enum Constant {
/// The size constants.
enum Size {
/// The maximum width of the timer in the compact trailing presentation of the Dynamic Island.
static let compactTimer: CGFloat = 44
}
/// The spacing constants.
enum Spacing {
/// The spacing between the elements of a stack.
static let stack: CGFloat = 8
}
/// The system symbol constants.
enum Symbol {
/// The symbol of the discard button.
static let discard = "trash"
/// The symbol marking the recording flow.
static let microphone = "mic.fill"
/// The symbol of the main button while recording.
static let pause = "pause.fill"
/// The symbol of the main button while paused.
static let record = "record.circle"
}
/// The time constants.
enum Time {
/// The span of the running timer, comfortably beyond the maximum lifetime of a Live Activity.
static let span: TimeInterval = 24 * 60 * 60
}
}
// MARK: - Previews
@@ -22,27 +22,49 @@ struct RecordingLiveActivity: Widget {
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedRegion(.leading) {
RecordingStateLabel(state: context.state)
RecordingStateLabel(
state: context.state
)
}
DynamicIslandExpandedRegion(.trailing) {
RecordingTimerText(state: context.state)
.font(.title2)
.fontWeight(.bold)
.monospacedDigit()
RecordingTimerText(
state: context.state
)
}
DynamicIslandExpandedRegion(.bottom) {
RecordingControls(state: context.state)
RecordingControls(
state: context.state
)
}
} compactLeading: {
Image(systemName: Constant.Symbol.microphone)
.foregroundStyle(.red)
switch context.state.state {
case .paused:
Image.Symbol.pause
.foregroundStyle(.yellow)
case .processing:
Image.Symbol.send
.foregroundStyle(.green)
case .recording:
Image.Symbol.microphone
.foregroundStyle(.yellow)
}
} compactTrailing: {
RecordingTimerText(state: context.state)
.monospacedDigit()
.frame(maxWidth: Constant.Size.compactTimer)
RecordingTimerText(
state: context.state
)
.frame(maxWidth: Constant.Size.compactTimer)
} minimal: {
Image(systemName: Constant.Symbol.microphone)
.foregroundStyle(.red)
switch context.state.state {
case .paused:
Image.Symbol.pause
.foregroundStyle(.yellow)
case .processing:
Image.Symbol.send
.foregroundStyle(.green)
case .recording:
Image.Symbol.microphone
.foregroundStyle(.yellow)
}
}
}
}