From 5f6979efdcc7bf2dc339247ab701f9c91f4e02d1 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Tue, 28 Jan 2025 19:20:54 +0000 Subject: [PATCH] Improve lockScreen widgets (#3887) Task/Issue URL: https://app.asana.com/0/72649045549333/1209262022516656/f **Description**: Improve lockScreen widgets creation --- Widgets/LockScreenWidgets.swift | 149 +++++++++++++------------------- Widgets/Widgets.swift | 30 +++---- 2 files changed, 74 insertions(+), 105 deletions(-) diff --git a/Widgets/LockScreenWidgets.swift b/Widgets/LockScreenWidgets.swift index 9587a8246f..b519daeafd 100644 --- a/Widgets/LockScreenWidgets.swift +++ b/Widgets/LockScreenWidgets.swift @@ -21,122 +21,92 @@ import SwiftUI import WidgetKit @available(iOSApplicationExtension 16.0, *) -struct SearchLockScreenWidget: Widget { - - let kind: String = "SearchLockScreenWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenSearch") - .widgetURL(DeepLinks.newSearch.appendingParameter(name: "ls", value: "1")) - } - .configurationDisplayName(UserText.lockScreenSearchTitle) - .description(UserText.lockScreenSearchDescription) - .supportedFamilies([ .accessoryCircular ]) - } - +protocol LockScreenWidget: Widget { + var kind: String { get } + var imageName: String { get } + var deepLink: URL { get } + var displayName: String { get } + var description: String { get } } @available(iOSApplicationExtension 16.0, *) -struct FavoritesLockScreenWidget: Widget { - - let kind: String = "FavoritesLockScreenWidget" - +extension LockScreenWidget { var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenFavorites") - .widgetURL(DeepLinks.favorites.appendingParameter(name: "ls", value: "1")) + LockScreenWidgetView(imageNamed: imageName) + .widgetURL(deepLink) } - .configurationDisplayName(UserText.lockScreenFavoritesTitle) - .description(UserText.lockScreenFavoritesDescription) - .supportedFamilies([ .accessoryCircular ]) + .configurationDisplayName(displayName) + .description(self.description) + .supportedFamilies([.accessoryCircular]) } } @available(iOSApplicationExtension 16.0, *) -struct VoiceSearchLockScreenWidget: Widget { - - let kind: String = "VoiceSearchLockScreenWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenVoice") - .widgetURL(DeepLinks.voiceSearch.appendingParameter(name: "ls", value: "1")) - } - .configurationDisplayName(UserText.lockScreenVoiceTitle) - .description(UserText.lockScreenVoiceDescription) - .supportedFamilies([ .accessoryCircular ]) - } - +struct SearchLockScreenWidget: LockScreenWidget { + let kind = "SearchLockScreenWidget" + let imageName = "LockScreenSearch" + let deepLink = DeepLinks.newSearch.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenSearchTitle + let description = UserText.lockScreenSearchDescription } @available(iOSApplicationExtension 16.0, *) -struct EmailProtectionLockScreenWidget: Widget { - - let kind: String = "EmailProtectionLockScreenWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenEmail") - .widgetURL(DeepLinks.newEmail.appendingParameter(name: "ls", value: "1")) - } - .configurationDisplayName(UserText.lockScreenEmailTitle) - .description(UserText.lockScreenEmailDescription) - .supportedFamilies([ .accessoryCircular ]) - } +struct FavoritesLockScreenWidget: LockScreenWidget { + let kind = "FavoritesLockScreenWidget" + let imageName = "LockScreenFavorites" + let deepLink = DeepLinks.favorites.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenFavoritesTitle + let description = UserText.lockScreenFavoritesDescription } @available(iOSApplicationExtension 16.0, *) -struct FireButtonLockScreenWidget: Widget { - - let kind: String = "FireButtonLockScreenWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenFire") - .widgetURL(DeepLinks.fireButton.appendingParameter(name: "ls", value: "1")) - } - .configurationDisplayName(UserText.lockScreenFireTitle) - .description(UserText.lockScreenFireDescription) - .supportedFamilies([ .accessoryCircular ]) - } +struct VoiceSearchLockScreenWidget: LockScreenWidget { + let kind = "VoiceSearchLockScreenWidget" + let imageName = "LockScreenVoice" + let deepLink = DeepLinks.voiceSearch.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenVoiceTitle + let description = UserText.lockScreenVoiceDescription } @available(iOSApplicationExtension 16.0, *) -struct PasswordsLockScreenWidget: Widget { - - let kind: String = "PasswordsLockScreenWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenPasswords") - .widgetURL(DeepLinks.openPasswords.appendingParameter(name: "ls", value: "1")) - } - .configurationDisplayName(UserText.lockScreenPasswordsTitle) - .description(UserText.lockScreenPasswordsDescription) - .supportedFamilies([ .accessoryCircular ]) - } +struct EmailProtectionLockScreenWidget: LockScreenWidget { + let kind = "EmailProtectionLockScreenWidget" + let imageName = "LockScreenEmail" + let deepLink = DeepLinks.newEmail.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenEmailTitle + let description = UserText.lockScreenEmailDescription } -/// Waiting copywriting and icon for this. @available(iOSApplicationExtension 16.0, *) -struct AIChatLockScreenWidget: Widget { +struct FireButtonLockScreenWidget: LockScreenWidget { + let kind = "FireButtonLockScreenWidget" + let imageName = "LockScreenFire" + let deepLink = DeepLinks.fireButton.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenFireTitle + let description = UserText.lockScreenFireDescription +} - let kind: String = "AIChatLockScreenWidget" +@available(iOSApplicationExtension 16.0, *) +struct PasswordsLockScreenWidget: LockScreenWidget { + let kind = "PasswordsLockScreenWidget" + let imageName = "LockScreenPasswords" + let deepLink = DeepLinks.openPasswords.appendingParameter(name: "ls", value: "1") + let displayName = UserText.lockScreenPasswordsTitle + let description = UserText.lockScreenPasswordsDescription +} - var body: some WidgetConfiguration { - StaticConfiguration(kind: kind, provider: Provider()) { _ in - return LockScreenWidgetView(imageNamed: "LockScreenAIChat") - .widgetURL(DeepLinks.openAIChat.appendingParameter(name: WidgetSourceType.sourceKey, value: WidgetSourceType.lockscreenComplication.rawValue)) - } - .configurationDisplayName(UserText.lockScreenAIChatTitle) - .description(UserText.lockScreenAIChatDescription) - .supportedFamilies([ .accessoryCircular ]) - } +@available(iOSApplicationExtension 16.0, *) +struct AIChatLockScreenWidget: LockScreenWidget { + let kind = "AIChatLockScreenWidget" + let imageName = "LockScreenAIChat" + let deepLink = DeepLinks.openAIChat.appendingParameter(name: WidgetSourceType.sourceKey, value: WidgetSourceType.lockscreenComplication.rawValue) + let displayName = UserText.lockScreenAIChatTitle + let description = UserText.lockScreenAIChatDescription } +// MARK: - Widget View struct LockScreenWidgetView: View { - let imageNamed: String var body: some View { @@ -148,5 +118,4 @@ struct LockScreenWidgetView: View { .background(Circle().foregroundColor(.white.opacity(0.3))) .widgetContainerBackground() } - } diff --git a/Widgets/Widgets.swift b/Widgets/Widgets.swift index 1ff7c4bf64..1f8a0ff2ba 100644 --- a/Widgets/Widgets.swift +++ b/Widgets/Widgets.swift @@ -219,6 +219,19 @@ struct Widgets: WidgetBundle { makeWidgets() } + @available(iOSApplicationExtension 16.0, *) + private var lockScreenWidgets: some Widget { + WidgetBundleBuilder.buildBlock( + SearchLockScreenWidget(), + VoiceSearchLockScreenWidget(), + EmailProtectionLockScreenWidget(), + FireButtonLockScreenWidget(), + FavoritesLockScreenWidget(), + AIChatLockScreenWidget(), + PasswordsLockScreenWidget() + ) + } + private func makeWidgets() -> some Widget { if #available(iOS 17, *) { return WidgetBundleBuilder.buildBlock(QuickActionsWidget(), @@ -226,27 +239,14 @@ struct Widgets: WidgetBundle { PasswordsWidget(), VPNBundle().body, SearchWidget(), - SearchLockScreenWidget(), - VoiceSearchLockScreenWidget(), - EmailProtectionLockScreenWidget(), - FireButtonLockScreenWidget(), - FavoritesLockScreenWidget(), - AIChatLockScreenWidget(), - PasswordsLockScreenWidget() - ) + lockScreenWidgets) } if #available(iOS 16.0, *) { return WidgetBundleBuilder.buildBlock(SearchWidget(), PasswordsWidget(), FavoritesWidget(), - SearchLockScreenWidget(), - VoiceSearchLockScreenWidget(), - EmailProtectionLockScreenWidget(), - FireButtonLockScreenWidget(), - FavoritesLockScreenWidget(), - AIChatLockScreenWidget(), - PasswordsLockScreenWidget()) + lockScreenWidgets) } else { return WidgetBundleBuilder.buildBlock(SearchWidget(), PasswordsWidget(),