diff --git a/FavoritesWidget/AppIntent.swift b/FavoritesWidget/AppIntent.swift new file mode 100644 index 0000000..a632773 --- /dev/null +++ b/FavoritesWidget/AppIntent.swift @@ -0,0 +1,18 @@ +// +// AppIntent.swift +// FavoritesWidget +// +// Created by Platon on 08.08.2025. +// + +import WidgetKit +import AppIntents + +struct ConfigurationAppIntent: WidgetConfigurationIntent { + static var title: LocalizedStringResource { "Configuration" } + static var description: IntentDescription { "This is an example widget." } + + // An example configurable parameter. + @Parameter(title: "Favorite Emoji", default: "πŸ˜ƒ") + var favoriteEmoji: String +} diff --git a/FavoritesWidget/Assets.xcassets/AccentColor.colorset/Contents.json b/FavoritesWidget/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/FavoritesWidget/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FavoritesWidget/Assets.xcassets/AppIcon.appiconset/Contents.json b/FavoritesWidget/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/FavoritesWidget/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FavoritesWidget/Assets.xcassets/Contents.json b/FavoritesWidget/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/FavoritesWidget/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FavoritesWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/FavoritesWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/FavoritesWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FavoritesWidget/FavoritesWidget.swift b/FavoritesWidget/FavoritesWidget.swift new file mode 100644 index 0000000..94f4d3c --- /dev/null +++ b/FavoritesWidget/FavoritesWidget.swift @@ -0,0 +1,88 @@ +// +// FavoritesWidget.swift +// FavoritesWidget +// +// Created by Platon on 08.08.2025. +// + +import WidgetKit +import SwiftUI + +struct Provider: AppIntentTimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), configuration: ConfigurationAppIntent()) + } + + func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> SimpleEntry { + SimpleEntry(date: Date(), configuration: configuration) + } + + func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, configuration: configuration) + entries.append(entry) + } + + return Timeline(entries: entries, policy: .atEnd) + } + +// func relevances() async -> WidgetRelevances { +// // Generate a list containing the contexts this widget is relevant in. +// } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let configuration: ConfigurationAppIntent +} + +struct FavoritesWidgetEntryView : View { + var entry: Provider.Entry + + var body: some View { + VStack { + Text("Time:") + Text(entry.date, style: .time) + + Text("Favorite Emoji:") + Text(entry.configuration.favoriteEmoji) + } + } +} + +struct FavoritesWidget: Widget { + let kind: String = "FavoritesWidget" + + var body: some WidgetConfiguration { + AppIntentConfiguration(kind: kind, intent: ConfigurationAppIntent.self, provider: Provider()) { entry in + FavoritesWidgetEntryView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } + } +} + +extension ConfigurationAppIntent { + fileprivate static var smiley: ConfigurationAppIntent { + let intent = ConfigurationAppIntent() + intent.favoriteEmoji = "πŸ˜€" + return intent + } + + fileprivate static var starEyes: ConfigurationAppIntent { + let intent = ConfigurationAppIntent() + intent.favoriteEmoji = "🀩" + return intent + } +} + +#Preview(as: .systemSmall) { + FavoritesWidget() +} timeline: { + SimpleEntry(date: .now, configuration: .smiley) + SimpleEntry(date: .now, configuration: .starEyes) +} diff --git a/FavoritesWidget/FavoritesWidgetBundle.swift b/FavoritesWidget/FavoritesWidgetBundle.swift new file mode 100644 index 0000000..d34a5e7 --- /dev/null +++ b/FavoritesWidget/FavoritesWidgetBundle.swift @@ -0,0 +1,18 @@ +// +// FavoritesWidgetBundle.swift +// FavoritesWidget +// +// Created by Platon on 08.08.2025. +// + +import WidgetKit +import SwiftUI + +@main +struct FavoritesWidgetBundle: WidgetBundle { + var body: some Widget { + FavoritesWidget() + FavoritesWidgetControl() + FavoritesWidgetLiveActivity() + } +} diff --git a/FavoritesWidget/FavoritesWidgetControl.swift b/FavoritesWidget/FavoritesWidgetControl.swift new file mode 100644 index 0000000..abdaf51 --- /dev/null +++ b/FavoritesWidget/FavoritesWidgetControl.swift @@ -0,0 +1,77 @@ +// +// FavoritesWidgetControl.swift +// FavoritesWidget +// +// Created by Platon on 08.08.2025. +// + +import AppIntents +import SwiftUI +import WidgetKit + +struct FavoritesWidgetControl: ControlWidget { + static let kind: String = "com.mkch.MobileMkch.FavoritesWidget" + + var body: some ControlWidgetConfiguration { + AppIntentControlConfiguration( + kind: Self.kind, + provider: Provider() + ) { value in + ControlWidgetToggle( + "Start Timer", + isOn: value.isRunning, + action: StartTimerIntent(value.name) + ) { isRunning in + Label(isRunning ? "On" : "Off", systemImage: "timer") + } + } + .displayName("Timer") + .description("A an example control that runs a timer.") + } +} + +extension FavoritesWidgetControl { + struct Value { + var isRunning: Bool + var name: String + } + + struct Provider: AppIntentControlValueProvider { + func previewValue(configuration: TimerConfiguration) -> Value { + FavoritesWidgetControl.Value(isRunning: false, name: configuration.timerName) + } + + func currentValue(configuration: TimerConfiguration) async throws -> Value { + let isRunning = true // Check if the timer is running + return FavoritesWidgetControl.Value(isRunning: isRunning, name: configuration.timerName) + } + } +} + +struct TimerConfiguration: ControlConfigurationIntent { + static let title: LocalizedStringResource = "Timer Name Configuration" + + @Parameter(title: "Timer Name", default: "Timer") + var timerName: String +} + +struct StartTimerIntent: SetValueIntent { + static let title: LocalizedStringResource = "Start a timer" + + @Parameter(title: "Timer Name") + var name: String + + @Parameter(title: "Timer is running") + var value: Bool + + init() {} + + init(_ name: String) { + self.name = name + } + + func perform() async throws -> some IntentResult { + // Start the timer… + return .result() + } +} diff --git a/FavoritesWidget/FavoritesWidgetLiveActivity.swift b/FavoritesWidget/FavoritesWidgetLiveActivity.swift new file mode 100644 index 0000000..424e382 --- /dev/null +++ b/FavoritesWidget/FavoritesWidgetLiveActivity.swift @@ -0,0 +1,80 @@ +// +// FavoritesWidgetLiveActivity.swift +// FavoritesWidget +// +// Created by Platon on 08.08.2025. +// + +import ActivityKit +import WidgetKit +import SwiftUI + +struct FavoritesWidgetAttributes: ActivityAttributes { + public struct ContentState: Codable, Hashable { + // Dynamic stateful properties about your activity go here! + var emoji: String + } + + // Fixed non-changing properties about your activity go here! + var name: String +} + +struct FavoritesWidgetLiveActivity: Widget { + var body: some WidgetConfiguration { + ActivityConfiguration(for: FavoritesWidgetAttributes.self) { context in + // Lock screen/banner UI goes here + VStack { + Text("Hello \(context.state.emoji)") + } + .activityBackgroundTint(Color.cyan) + .activitySystemActionForegroundColor(Color.black) + + } dynamicIsland: { context in + DynamicIsland { + // Expanded UI goes here. Compose the expanded UI through + // various regions, like leading/trailing/center/bottom + DynamicIslandExpandedRegion(.leading) { + Text("Leading") + } + DynamicIslandExpandedRegion(.trailing) { + Text("Trailing") + } + DynamicIslandExpandedRegion(.bottom) { + Text("Bottom \(context.state.emoji)") + // more content + } + } compactLeading: { + Text("L") + } compactTrailing: { + Text("T \(context.state.emoji)") + } minimal: { + Text(context.state.emoji) + } + .widgetURL(URL(string: "http://www.apple.com")) + .keylineTint(Color.red) + } + } +} + +extension FavoritesWidgetAttributes { + fileprivate static var preview: FavoritesWidgetAttributes { + FavoritesWidgetAttributes(name: "World") + } +} + +extension FavoritesWidgetAttributes.ContentState { + fileprivate static var smiley: FavoritesWidgetAttributes.ContentState { + FavoritesWidgetAttributes.ContentState(emoji: "πŸ˜€") + } + + fileprivate static var starEyes: FavoritesWidgetAttributes.ContentState { + FavoritesWidgetAttributes.ContentState(emoji: "🀩") + } +} + +#Preview("Notification", as: .content, using: FavoritesWidgetAttributes.preview) { + FavoritesWidgetLiveActivity() +} contentStates: { + FavoritesWidgetAttributes.ContentState.smiley + FavoritesWidgetAttributes.ContentState.starEyes +} diff --git a/FavoritesWidget/Info.plist b/FavoritesWidget/Info.plist new file mode 100644 index 0000000..0f118fb --- /dev/null +++ b/FavoritesWidget/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/FavoritesWidgetExtension.entitlements b/FavoritesWidgetExtension.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/FavoritesWidgetExtension.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/MobileMkch/MobileMkch.entitlements b/MobileMkch/MobileMkch.entitlements new file mode 100644 index 0000000..2eb7e33 --- /dev/null +++ b/MobileMkch/MobileMkch.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.application-groups + + +