import ActivityKit import WidgetKit import SwiftUI @main struct Widgets: WidgetBundle { var body: some Widget { if #available(iOS 16.1, *) { LiveCardWidget() } } } // Color Converter extension Color { init(hex: String, alpha: Double = 1.0) { var hexValue = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() if hexValue.hasPrefix("#") { hexValue.remove(at: hexValue.startIndex) } var rgbValue: UInt64 = 0 Scanner(string: hexValue).scanHexInt64(&rgbValue) let red = Double((rgbValue & 0xFF0000) >> 16) / 255.0 let green = Double((rgbValue & 0x00FF00) >> 8) / 255.0 let blue = Double(rgbValue & 0x0000FF) / 255.0 self.init( .sRGB, red: red, green: green, blue: blue, opacity: alpha ) } } // We need to redefined live activities pipe struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable { public struct ContentState: Codable, Hashable { } var id = UUID() } struct LockScreenLiveActivityView: View { let context: ActivityViewContext let lesson = LessonData() var body: some View { HStack(alignment: .center) { Image(systemName: lesson!.icon) .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(30), height: CGFloat(30)) .padding(.leading, CGFloat(24)) VStack(alignment: .leading) { HStack(alignment: .center) { Text(lesson!.index + lesson!.title) .font(.title3) .bold() Text(lesson!.subtitle) .font(.subheadline) .padding(.trailing, 12) } if (lesson!.description != "") { Text(lesson!.description) .font(.subheadline) } HStack { Image(systemName: "arrow.right") .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(8), height: CGFloat(8)) Text(lesson!.nextSubject) .font(.caption) Text(lesson!.nextRoom) .font(.caption2) } }.padding(15) Spacer() Text(timerInterval: lesson!.date, countsDown: true) .multilineTextAlignment(.center) .frame(width: 85) .font(.title2) .monospacedDigit() .padding(.trailing, CGFloat(24)) } .activityBackgroundTint( lesson!.color != "#676767" ? Color(hex: lesson!.color) // Ha nem megy hat nem megy : Color.clear ) } } @available(iOSApplicationExtension 16.1, *) struct LiveCardWidget: Widget { var body: some WidgetConfiguration { /// Live Activity Notification ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in LockScreenLiveActivityView(context: context) /// Dynamic Island } dynamicIsland: { context in let lesson = LessonData() /// Expanded return DynamicIsland { DynamicIslandExpandedRegion(.leading) { VStack { Spacer() ProgressView( timerInterval: lesson!.date, countsDown: true, label: { Image(systemName: lesson!.icon) .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(32), height: CGFloat(32)) }, currentValueLabel: { Image(systemName: lesson!.icon) .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(32), height: CGFloat(32)) } ).progressViewStyle(.circular) } } DynamicIslandExpandedRegion(.center) { VStack(alignment: .leading) { Text(lesson!.index + lesson!.title) .lineLimit(1) .font(.title3) .bold() Text(lesson!.description) .lineLimit(2) .font(.caption) }.padding(EdgeInsets(top: 0.0, leading: 5.0, bottom: 0.0, trailing: 0.0)) } DynamicIslandExpandedRegion(.trailing) { VStack { Spacer() Text(lesson!.subtitle) .lineLimit(1) .font(.subheadline) Spacer() } } /// Compact } compactLeading: { Label { Text(lesson!.title) } icon: { Image(systemName: lesson!.icon) } .font(.caption2) } compactTrailing: { Text(timerInterval: lesson!.date, countsDown: true) .multilineTextAlignment(.center) .frame(width: 40) .font(.caption2) /// Collapsed } minimal: { VStack(alignment: .center, content: { ProgressView( timerInterval: lesson!.date, countsDown: true, label: { Image(systemName: lesson!.icon) .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(12), height: CGFloat(12)) }, currentValueLabel: { Image(systemName: lesson!.icon) .resizable() .aspectRatio(contentMode: .fit) .frame(width: CGFloat(12), height: CGFloat(12)) } ).progressViewStyle(.circular) }) } .keylineTint( lesson!.color != "#676767" ? Color(hex: lesson!.color) : Color.clear ) } } }