diff --git a/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json b/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CoinWidgetExtension/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json b/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/CoinWidgetExtension/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoinWidgetExtension/Assets.xcassets/Contents.json b/CoinWidgetExtension/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CoinWidgetExtension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json b/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CoinWidgetExtension/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CoinWidgetExtension/CoinWidgetExtension.entitlements b/CoinWidgetExtension/CoinWidgetExtension.entitlements new file mode 100644 index 0000000..0b4100d --- /dev/null +++ b/CoinWidgetExtension/CoinWidgetExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.adesso.SampleAppSwiftUI + + + diff --git a/CoinWidgetExtension/CoinWidgetExtension.swift b/CoinWidgetExtension/CoinWidgetExtension.swift new file mode 100644 index 0000000..c718b63 --- /dev/null +++ b/CoinWidgetExtension/CoinWidgetExtension.swift @@ -0,0 +1,106 @@ +// +// CoinWidgetExtension.swift +// CoinWidgetExtension +// +// Created by Sahin, Meryem on 11.08.2023. +// + +import WidgetKit +import SwiftUI + +struct Provider: TimelineProvider { + @AppStorage("favoriteCoins", store: UserDefaults(suiteName: "group.com.adesso.SampleAppSwiftUI")) var favoriteCoins: [CoinData] = [] + + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(favoriteCoins: favoriteCoins) + } + + func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(favoriteCoins: favoriteCoins) + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + let timeline = Timeline(entries: [SimpleEntry(favoriteCoins: favoriteCoins)], policy: .atEnd) + completion(timeline) + } +} + +struct SimpleEntry: TimelineEntry { + let date = Date() + var favoriteCoins: [CoinData] +} + +struct CoinWidgetExtensionEntryView: View { + @Environment(\.widgetFamily) var widgetFamily + var entry: Provider.Entry + + @ViewBuilder + var emptyView: some View { + Text("There are no favorite coins") + } + + @ViewBuilder + var coinsView: some View { + VStack { + ForEach(entry.favoriteCoins) { val in + HStack { + Text(val.coinInfo?.title ?? "") + } + } + } + } + + var body: some View { + switch widgetFamily { + case .systemSmall: + entry.favoriteCoins.isEmpty ? AnyView(emptyView) : AnyView(coinsView) + case .systemMedium: + entry.favoriteCoins.isEmpty ? AnyView(emptyView) : AnyView(coinsView) + default: + Text(entry.date, style: .time) + } + } +} + +struct CoinWidgetExtension: Widget { + let kind: String = "CoinWidgetExtension" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { entry in + CoinWidgetExtensionEntryView(entry: entry) + } + .configurationDisplayName("My Widget") + .description("This is an example widget.") + .supportedFamilies([.systemSmall, .systemMedium]) + } +} + +struct CoinWidgetExtension_Previews: PreviewProvider { + static var previews: some View { + + CoinWidgetExtensionEntryView(entry: SimpleEntry(favoriteCoins: [])).previewContext(WidgetPreviewContext(family: .systemSmall)) + CoinWidgetExtensionEntryView(entry: SimpleEntry(favoriteCoins: [])).previewContext(WidgetPreviewContext(family: .systemMedium)) + + } +} + +extension Array: RawRepresentable where Element: Codable { +public init?(rawValue: String) { + guard let data = rawValue.data(using: .utf8), + let result = try? JSONDecoder().decode([Element].self, from: data) + else { + return nil + } + self = result +} + +public var rawValue: String { + guard let data = try? JSONEncoder().encode(self), + let result = String(data: data, encoding: .utf8) + else { + return "[]" + } + return result + } +} diff --git a/CoinWidgetExtension/CoinWidgetExtensionBundle.swift b/CoinWidgetExtension/CoinWidgetExtensionBundle.swift new file mode 100644 index 0000000..be00867 --- /dev/null +++ b/CoinWidgetExtension/CoinWidgetExtensionBundle.swift @@ -0,0 +1,16 @@ +// +// CoinWidgetExtensionBundle.swift +// CoinWidgetExtension +// +// Created by Sahin, Meryem on 11.08.2023. +// + +import WidgetKit +import SwiftUI + +@main +struct CoinWidgetExtensionBundle: WidgetBundle { + var body: some Widget { + CoinWidgetExtension() + } +} diff --git a/CoinWidgetExtension/Info.plist b/CoinWidgetExtension/Info.plist new file mode 100644 index 0000000..3da3ca4 --- /dev/null +++ b/CoinWidgetExtension/Info.plist @@ -0,0 +1,21 @@ + + + + + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/SampleAppSwiftUI/SampleAppSwiftUI.entitlements b/SampleAppSwiftUI/SampleAppSwiftUI.entitlements new file mode 100644 index 0000000..0b4100d --- /dev/null +++ b/SampleAppSwiftUI/SampleAppSwiftUI.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.adesso.SampleAppSwiftUI + + + diff --git a/SampleAppSwiftUI/Utility/Managers/StorageManager.swift b/SampleAppSwiftUI/Utility/Managers/StorageManager.swift index 06ca8d0..64f4127 100644 --- a/SampleAppSwiftUI/Utility/Managers/StorageManager.swift +++ b/SampleAppSwiftUI/Utility/Managers/StorageManager.swift @@ -6,6 +6,7 @@ // import SwiftUI +import WidgetKit final class StorageManager { diff --git a/project.yml b/project.yml index 9c326de..b7524cb 100644 --- a/project.yml +++ b/project.yml @@ -44,6 +44,7 @@ targets: - package: Pulse product: Pulse product: PulseUI + - target: CoinWidgetExtension configFiles: Development: SampleAppSwiftUI/Configs/Development.xcconfig Production: SampleAppSwiftUI/Configs/Production.xcconfig @@ -81,4 +82,17 @@ targets: platform: iOS sources: - path: SampleAppSwiftUIUITests + CoinWidgetExtension: + type: app-extension + platform: iOS + sources: + - path: CoinWidgetExtension + settings: + PRODUCT_BUNDLE_IDENTIFIER: com.adesso.SampleAppSwiftUI.development.CoinWidgetExtension + INFOPLIST_FILE: CoinWidgetExtension/Info.plist + dependencies: + - framework: SwiftUI.framework + implicit: true + - framework: WidgetKit.framework + implicit: true parallelizeBuild: true