// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import Foundation
import SwiftUI
import WidgetKit
struct SearchWidget: Widget {
// Changing |kind| or deleting this widget will cause all installed instances of this widget to
// stop updating and show the placeholder state.
let kind: String = "SearchWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
SearchWidgetEntryView(entry: entry)
}
.configurationDisplayName(
Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DISPLAY_NAME")
)
.description(Text("IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_DESCRIPTION"))
.supportedFamilies([.systemSmall])
.crDisfavoredLocations()
.crContentMarginsDisabled()
.crContainerBackgroundRemovable(false)
}
}
struct SearchWidgetEntryView: View {
var entry: Provider.Entry
var body: some View {
SearchWidgetEntryViewTemplate(
destinationURL: WidgetConstants.SearchWidget.url, imageName: "widget_chrome_logo",
title: "IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_TITLE",
accessibilityLabel: "IDS_IOS_WIDGET_KIT_EXTENSION_SEARCH_A11Y_LABEL", entry: entry)
}
}
struct SearchWidgetEntryViewTemplate: View {
let destinationURL: URL
let imageName: String
let title: LocalizedStringKey
let accessibilityLabel: LocalizedStringKey
var entry: Provider.Entry
var body: some View {
// We wrap this widget in a link on top of using `widgetUrl` so that the voice over will treat
// the widget as one tap target. Without the wrapping, voice over treats the content within
// the widget as multiple tap targets.
Link(destination: destinationURL) {
ZStack {
VStack(alignment: .leading, spacing: 0) {
ZStack {
RoundedRectangle(cornerRadius: 26)
.frame(height: 52)
.foregroundColor(Color("widget_search_bar_color"))
HStack(spacing: 0) {
Image(imageName)
.clipShape(Circle())
.padding(.leading, 8)
.unredacted()
Spacer()
}
}
.frame(minWidth: 0, maxWidth: .infinity)
.padding([.leading, .trailing], 11)
.padding(.top, 16)
Spacer()
Text(title)
.foregroundColor(Color("widget_text_color"))
.fontWeight(.semibold)
.font(.subheadline)
.padding([.leading, .bottom, .trailing], 16)
}
}
}
.widgetURL(destinationURL)
.accessibility(
label: Text(accessibilityLabel)
)
.crContainerBackground(
Color("widget_background_color")
.unredacted())
}
}