forked from firka/student-legacy
206 lines
5.5 KiB
Swift
206 lines
5.5 KiB
Swift
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<LiveActivitiesAppAttributes>
|
|
|
|
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
|
|
)
|
|
}
|
|
}
|
|
}
|