From 87e52609e760c458c8a05c297f1f76a920d67969 Mon Sep 17 00:00:00 2001 From: Ryan Lepinski Date: Tue, 30 Jul 2024 11:32:56 -0700 Subject: [PATCH] Release 18.7.0 (#3167) * Release 18.6.1 * Updates * Release 18.7.0 --- Airship.podspec | 2 +- .../AutomationRemoteDataAccess.swift | 2 +- Airship/AirshipConfig.xcconfig | 2 +- Airship/AirshipCore/Source/AirshipJSON.swift | 4 +- .../AirshipCore/Source/AirshipVersion.swift | 2 +- .../Source/ChannelBulkUpdateAPIClient.swift | 2 +- Airship/AirshipCore/Source/CustomEvent.swift | 4 +- .../Source/DeferredAPIClient.swift | 3 +- .../AirshipCore/Source/EventAPIClient.swift | 1 - Airship/AirshipCore/Source/Media.swift | 11 - Airship/AirshipCore/Source/MediaWebView.swift | 2 +- .../Source/MeteredUsageAPIClient.swift | 4 +- AirshipContentExtension.podspec | 2 +- AirshipDebug.podspec | 2 +- AirshipServiceExtension.podspec | 2 +- CHANGELOG.md | 11 + .../Scenes/Modal/modal-video-cropping.yml | 453 ++++++++++ Thomas/Thomas/Resources/Scenes/Modal/nps.yml | 816 ++++++++++++++++++ 18 files changed, 1296 insertions(+), 29 deletions(-) create mode 100644 Thomas/Thomas/Resources/Scenes/Modal/modal-video-cropping.yml create mode 100644 Thomas/Thomas/Resources/Scenes/Modal/nps.yml diff --git a/Airship.podspec b/Airship.podspec index 541e07f7e..5a54aa664 100644 --- a/Airship.podspec +++ b/Airship.podspec @@ -1,4 +1,4 @@ -AIRSHIP_VERSION="18.6.0" +AIRSHIP_VERSION="18.7.0" Pod::Spec.new do |s| s.version = AIRSHIP_VERSION diff --git a/Airship/AirshipAutomation/Source/RemoteData/AutomationRemoteDataAccess.swift b/Airship/AirshipAutomation/Source/RemoteData/AutomationRemoteDataAccess.swift index c63d8effd..5ad3dbf05 100644 --- a/Airship/AirshipAutomation/Source/RemoteData/AutomationRemoteDataAccess.swift +++ b/Airship/AirshipAutomation/Source/RemoteData/AutomationRemoteDataAccess.swift @@ -265,7 +265,7 @@ struct InAppRemoteData: Sendable { remoteDataInfo: payload.remoteDataInfo ) } catch { - AirshipLogger.error("Failed to parse app remote-data response.") + AirshipLogger.error("Failed to parse app remote-data response. \(error)") } return nil diff --git a/Airship/AirshipConfig.xcconfig b/Airship/AirshipConfig.xcconfig index 1695e4d80..e75e60de1 100644 --- a/Airship/AirshipConfig.xcconfig +++ b/Airship/AirshipConfig.xcconfig @@ -1,6 +1,6 @@ //* Copyright Airship and Contributors */ -CURRENT_PROJECT_VERSION = 18.6.0 +CURRENT_PROJECT_VERSION = 18.7.0 // Uncomment to include the preview build warning // OTHER_CFLAGS = $(inherited) -DUA_PREVIEW=1 diff --git a/Airship/AirshipCore/Source/AirshipJSON.swift b/Airship/AirshipCore/Source/AirshipJSON.swift index 8f6e001da..6910c53e4 100644 --- a/Airship/AirshipCore/Source/AirshipJSON.swift +++ b/Airship/AirshipCore/Source/AirshipJSON.swift @@ -5,8 +5,8 @@ import Foundation * Airship JSON. */ public enum AirshipJSON: Codable, Equatable, Sendable, Hashable { - public static let defaultEncoder = JSONEncoder() - public static let defaultDecoder = JSONDecoder() + public static var defaultEncoder: JSONEncoder { return JSONEncoder() } + public static var defaultDecoder: JSONDecoder { return JSONDecoder() } case string(String) case number(Double) diff --git a/Airship/AirshipCore/Source/AirshipVersion.swift b/Airship/AirshipCore/Source/AirshipVersion.swift index 232930988..bf20f8a91 100644 --- a/Airship/AirshipCore/Source/AirshipVersion.swift +++ b/Airship/AirshipCore/Source/AirshipVersion.swift @@ -3,7 +3,7 @@ import Foundation public struct AirshipVersion { - public static let version = "18.6.0" + public static let version = "18.7.0" public static func get() -> String { return version } diff --git a/Airship/AirshipCore/Source/ChannelBulkUpdateAPIClient.swift b/Airship/AirshipCore/Source/ChannelBulkUpdateAPIClient.swift index fcf41139d..5fbd738a2 100644 --- a/Airship/AirshipCore/Source/ChannelBulkUpdateAPIClient.swift +++ b/Airship/AirshipCore/Source/ChannelBulkUpdateAPIClient.swift @@ -14,7 +14,6 @@ final class ChannelBulkUpdateAPIClient: ChannelBulkUpdateAPIClientProtocol { private let config: RuntimeConfig private let session: AirshipRequestSession - private let encoder: JSONEncoder = JSONEncoder() init(config: RuntimeConfig, session: AirshipRequestSession) { self.config = config @@ -35,6 +34,7 @@ final class ChannelBulkUpdateAPIClient: ChannelBulkUpdateAPIClientProtocol { let url = try makeURL(channelID: channelID) let payload = update.clientPayload + let encoder = JSONEncoder() let data = try encoder.encode(payload) AirshipLogger.debug( diff --git a/Airship/AirshipCore/Source/CustomEvent.swift b/Airship/AirshipCore/Source/CustomEvent.swift index 7e1675493..b87e27d0e 100644 --- a/Airship/AirshipCore/Source/CustomEvent.swift +++ b/Airship/AirshipCore/Source/CustomEvent.swift @@ -61,11 +61,11 @@ public class CustomEvent: NSObject { private var _eventValue: NSDecimalNumber? - public static let defaultEncoder: JSONEncoder = { + public static var defaultEncoder: JSONEncoder { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 return encoder - }() + } /// The in-app message context for custom event attribution diff --git a/Airship/AirshipCore/Source/DeferredAPIClient.swift b/Airship/AirshipCore/Source/DeferredAPIClient.swift index ef6fe7015..f525d9b77 100644 --- a/Airship/AirshipCore/Source/DeferredAPIClient.swift +++ b/Airship/AirshipCore/Source/DeferredAPIClient.swift @@ -49,7 +49,7 @@ final class DeferredAPIClient: DeferredAPIClientProtocol { ], method: "POST", auth: .channelAuthToken(identifier: channelID), - body: try self.encoder.encode(body) + body: try JSONEncoder().encode(body) ) AirshipLogger.trace("Resolving deferred with request \(request) body \(body)") @@ -69,7 +69,6 @@ final class DeferredAPIClient: DeferredAPIClientProtocol { private let config: RuntimeConfig private let session: AirshipRequestSession - private let encoder: JSONEncoder = JSONEncoder() init(config: RuntimeConfig, session: AirshipRequestSession) { self.config = config diff --git a/Airship/AirshipCore/Source/EventAPIClient.swift b/Airship/AirshipCore/Source/EventAPIClient.swift index cf57401e9..0d6fac7e3 100644 --- a/Airship/AirshipCore/Source/EventAPIClient.swift +++ b/Airship/AirshipCore/Source/EventAPIClient.swift @@ -12,7 +12,6 @@ protocol EventAPIClientProtocol: Sendable { final class EventAPIClient: EventAPIClientProtocol { private let config: RuntimeConfig private let session: AirshipRequestSession - private let encoder: JSONEncoder = JSONEncoder() init(config: RuntimeConfig, session: AirshipRequestSession) { self.config = config diff --git a/Airship/AirshipCore/Source/Media.swift b/Airship/AirshipCore/Source/Media.swift index 623fa360a..f71054f5f 100644 --- a/Airship/AirshipCore/Source/Media.swift +++ b/Airship/AirshipCore/Source/Media.swift @@ -17,17 +17,6 @@ struct Media: View { @Environment(\.pageIndex) var pageIndex - private var contentMode: ContentMode { - var contentMode = ContentMode.fill - - /// Fit container if undefined size on x and y axes, otherwise fill and crop content on major axis to maintain aspect ratio - if self.model.mediaFit == .centerInside && Self.isUnbounded(constraints) { - contentMode = ContentMode.fit - } - - return contentMode - } - fileprivate static func isUnbounded(_ constraints: ViewConstraints) -> Bool { if constraints.width != nil && constraints.height != nil { return false diff --git a/Airship/AirshipCore/Source/MediaWebView.swift b/Airship/AirshipCore/Source/MediaWebView.swift index c67689871..a3fad9144 100644 --- a/Airship/AirshipCore/Source/MediaWebView.swift +++ b/Airship/AirshipCore/Source/MediaWebView.swift @@ -65,7 +65,7 @@ struct MediaWebView: UIViewRepresentable { "bottom" } - return "object-fit: cover; object-position: \(horizontal) \(vertical)" + return "width: 100vw; height: 100vh; object-fit: cover; object-position: \(horizontal) \(vertical)" case .centerCrop: return "object-fit: cover" } diff --git a/Airship/AirshipCore/Source/MeteredUsageAPIClient.swift b/Airship/AirshipCore/Source/MeteredUsageAPIClient.swift index 93f516dc0..b598a9ea5 100644 --- a/Airship/AirshipCore/Source/MeteredUsageAPIClient.swift +++ b/Airship/AirshipCore/Source/MeteredUsageAPIClient.swift @@ -14,7 +14,7 @@ final class MeteredUsageAPIClient : MeteredUsageAPIClientProtocol { private let config: RuntimeConfig private let session: AirshipRequestSession - private let encoder: JSONEncoder = { + private var encoder: JSONEncoder { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .custom({ date, encoder in var container = encoder.singleValueContainer() @@ -23,7 +23,7 @@ final class MeteredUsageAPIClient : MeteredUsageAPIClientProtocol { ) }) return encoder - }() + } init(config: RuntimeConfig, session: AirshipRequestSession) { diff --git a/AirshipContentExtension.podspec b/AirshipContentExtension.podspec index 18beabc0c..7301aa066 100644 --- a/AirshipContentExtension.podspec +++ b/AirshipContentExtension.podspec @@ -1,4 +1,4 @@ -AIRSHIP_VERSION="18.6.0" +AIRSHIP_VERSION="18.7.0" Pod::Spec.new do |s| s.version = AIRSHIP_VERSION diff --git a/AirshipDebug.podspec b/AirshipDebug.podspec index 74840e39d..cfb4eadfd 100644 --- a/AirshipDebug.podspec +++ b/AirshipDebug.podspec @@ -1,4 +1,4 @@ -AIRSHIP_VERSION="18.6.0" +AIRSHIP_VERSION="18.7.0" Pod::Spec.new do |s| s.version = AIRSHIP_VERSION diff --git a/AirshipServiceExtension.podspec b/AirshipServiceExtension.podspec index 03d3c5169..3f4c7e0be 100644 --- a/AirshipServiceExtension.podspec +++ b/AirshipServiceExtension.podspec @@ -1,4 +1,4 @@ -AIRSHIP_VERSION="18.6.0" +AIRSHIP_VERSION="18.7.0" Pod::Spec.new do |s| s.version = AIRSHIP_VERSION diff --git a/CHANGELOG.md b/CHANGELOG.md index 02ff785ec..1ede73647 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ # iOS Changelog +## Version 18.7.0 July 30, 2024 +Minor release that fixes some layout issues with images and videos in a Scene, accessibility improvements, and fixes a potential crash with JSON encoding/decoding due +to using a JSONEncoder/JSONDecoder across threads. + +### Changes +- Fixed video & image scaling/cropping in scenes. +- Removed reusing JSONEncoder/JSONDecoder across tasks. +- Removed @MainActor requirement from AirshipPush.authorizedNotificationSettings. +- Announce screen changes when banners In-App messages are displayed. +- `MessageCenterController` is now optional when creating a `MessageCenterView`. + ## Version 18.6.0 July 12, 2024 Minor release with some improvements to preference center, a fix for in-app message veritcal sizing, accessibility improvements and markdown support in scenes. diff --git a/Thomas/Thomas/Resources/Scenes/Modal/modal-video-cropping.yml b/Thomas/Thomas/Resources/Scenes/Modal/modal-video-cropping.yml new file mode 100644 index 000000000..775deaead --- /dev/null +++ b/Thomas/Thomas/Resources/Scenes/Modal/modal-video-cropping.yml @@ -0,0 +1,453 @@ +--- +presentation: + dismiss_on_touch_outside: true + default_placement: + position: + horizontal: center + vertical: center + shade_color: + default: + alpha: 0.5 + hex: "#000000" + type: hex + size: + height: 100% + width: 100% + type: modal +version: 1 +view: + type: pager_controller + identifier: "pager-controller-id" + view: + type: container + background_color: + default: + hex: "#ffffff" + alpha: 1 + items: + - position: + vertical: center + horizontal: center + size: + height: 100% + width: 100% + border: + radius: 25 + margin: + top: 36 + view: + type: pager + items: + - identifier: "page-1" + view: + type: container + items: + - position: + vertical: center + horizontal: center + size: + height: 100% + width: 100% + view: + type: scroll_layout + direction: vertical + view: + type: linear_layout + direction: vertical + items: + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Wide Image (100% x auto)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 24 + end: 24 + size: + width: 100% + height: auto + view: + media_fit: center_inside + media_type: video + type: media + url: https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4 + video: + aspect_ratio: 1.7777 + show_controls: false + autoplay: true + muted: true + loop: true + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Center (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + url: https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4 + media_type: video + video: + aspect_ratio: 1.7777 + show_controls: false + autoplay: true + muted: true + loop: true + type: media + position: + horizontal: center + vertical: center + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Top Start (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + media_type: video + type: media + position: + horizontal: start + vertical: top + url: https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4 + video: + aspect_ratio: 1.7777 + show_controls: false + autoplay: true + muted: true + loop: true + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Bottom End (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + media_type: video + type: media + position: + horizontal: end + vertical: bottom + url: https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/720/Big_Buck_Bunny_720_10s_10MB.mp4 + video: + aspect_ratio: 1.7777 + show_controls: false + autoplay: true + muted: true + loop: true + - identifier: "page-2" + view: + type: container + items: + - position: + vertical: center + horizontal: center + size: + height: 100% + width: 100% + view: + type: scroll_layout + direction: vertical + view: + type: linear_layout + direction: vertical + items: + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Tall Image (100% x auto)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 48 + end: 48 + size: + width: 100% + height: auto + view: + media_fit: center_inside + media_type: video + type: media + url: https://storage.googleapis.com/airship-media-url/ProductTeam/Maxime/PaddleInMP4.mp4 + video: + aspect_ratio: 0.5625 + show_controls: false + autoplay: true + muted: true + loop: true + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Center (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + position: + horizontal: center + vertical: center + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + media_type: video + type: media + url: https://storage.googleapis.com/airship-media-url/ProductTeam/Maxime/PaddleInMP4.mp4 + video: + aspect_ratio: 0.5625 + show_controls: false + autoplay: true + muted: true + loop: true + + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Top Start (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + position: + horizontal: start + vertical: top + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + media_type: video + type: media + url: https://storage.googleapis.com/airship-media-url/ProductTeam/Maxime/PaddleInMP4.mp4 + video: + aspect_ratio: 0.5625 + show_controls: false + autoplay: true + muted: true + loop: true + - margin: + top: 8 + size: + width: auto + height: auto + view: + type: label + text: "Crop Bottom End (150 x 150)" + text_appearance: + font_size: 14 + color: + default: + hex: "#000000" + alpha: 1 + - margin: + top: 8 + bottom: 8 + start: 8 + end: 8 + size: + width: 150 + height: 150 + view: + media_fit: fit_crop + position: + horizontal: end + vertical: bottom + border: + stroke_color: + default: + hex: "#000000" + alpha: 1 + stroke_width: 1 + media_type: video + type: media + url: https://storage.googleapis.com/airship-media-url/ProductTeam/Maxime/PaddleInMP4.mp4 + video: + aspect_ratio: 0.5625 + show_controls: false + autoplay: true + muted: true + loop: true + - size: + height: 16 + width: auto + position: + vertical: top + horizontal: center + margin: + top: 12 + view: + type: pager_indicator + carousel_identifier: CAROUSEL_ID + border: + radius: 8 + spacing: 4 + bindings: + selected: + shapes: + - type: ellipse + aspect_ratio: 1 + scale: 0.75 + color: + default: + hex: "#000000" + alpha: 1 + unselected: + shapes: + - type: ellipse + aspect_ratio: 1 + scale: 0.75 + border: + stroke_width: 1 + stroke_color: + default: + hex: "#333333" + alpha: 1 + color: + default: + hex: "#ffffff" + alpha: 1 + - position: + vertical: top + horizontal: end + size: + width: 36 + height: 36 + margin: + top: 0 + end: 0 + view: + type: image_button + identifier: x_button + button_click: [ dismiss ] + image: + type: icon + icon: close + scale: 0.5 + color: + default: + hex: "#000000" + alpha: 1 \ No newline at end of file diff --git a/Thomas/Thomas/Resources/Scenes/Modal/nps.yml b/Thomas/Thomas/Resources/Scenes/Modal/nps.yml new file mode 100644 index 000000000..4e77864d9 --- /dev/null +++ b/Thomas/Thomas/Resources/Scenes/Modal/nps.yml @@ -0,0 +1,816 @@ + version: 1 + presentation: + type: modal + placement_selectors: [] + android: + disable_back_button: false + dismiss_on_touch_outside: false + default_placement: + ignore_safe_area: false + size: + width: 100% + height: 100% + position: + horizontal: center + vertical: top + shade_color: + default: + type: hex + hex: "#000000" + alpha: 0.2 + web: + ignore_shade: true + view: + type: state_controller + view: + type: pager_controller + identifier: 50674629-f8fe-4d98-8ff8-7c727db42d1c + view: + type: linear_layout + direction: vertical + items: + - size: + width: 100% + height: 100% + view: + identifier: ef6ed88c-2329-4fa4-a6ed-6141051febf0 + nps_identifier: 221acead-707d-4927-90ae-cffc09636871 + type: nps_form_controller + submit: submit_event + form_enabled: + - form_submission + response_type: nps + view: + type: container + items: + - position: + horizontal: center + vertical: center + size: + width: 100% + height: 100% + view: + type: pager + disable_swipe: true + items: + - identifier: 760793cc-460f-4e68-a035-8db5b4bed25e + type: pager_item + view: + type: container + items: + - size: + width: 100% + height: 100% + position: + horizontal: center + vertical: center + ignore_safe_area: false + view: + type: container + items: + - margin: + bottom: 0 + top: 0 + end: 0 + start: 0 + position: + horizontal: center + vertical: center + size: + width: 100% + height: 100% + view: + type: linear_layout + direction: vertical + items: + - identifier: scroll_container + size: + width: 100% + height: 100% + view: + type: scroll_layout + direction: vertical + view: + type: linear_layout + direction: vertical + items: + - identifier: 221acead-707d-4927-90ae-cffc09636871 + size: + width: 100% + height: auto + margin: + top: 48 + bottom: 8 + start: 16 + end: 16 + view: + type: linear_layout + direction: vertical + items: + - size: + width: 100% + height: auto + view: + type: linear_layout + direction: vertical + items: + - margin: + top: 4 + bottom: 8 + size: + width: 100% + height: auto + view: + type: label + text: "* How likely is it that you + would recommend [your company, product, + etc.] to a friend or colleague?" + text_appearance: + font_size: 20 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + alignment: start + styles: [] + font_families: + - sans-serif + - size: + width: 100% + height: auto + margin: + top: 0 + bottom: 0 + view: + type: linear_layout + direction: vertical + items: + - size: + width: 100% + height: auto + view: + type: linear_layout + direction: horizontal + items: + - size: + width: 50% + height: auto + margin: + end: 4 + bottom: 4 + view: + type: label + text: Not Likely + text_appearance: + font_size: 16 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + alignment: start + styles: [] + font_families: + - sans-serif + - size: + width: 50% + height: auto + margin: + start: 4 + bottom: 4 + view: + type: label + text: Very Likely + text_appearance: + font_size: 16 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + alignment: end + styles: [] + font_families: + - sans-serif + - size: + width: 100% + height: auto + view: + type: linear_layout + direction: horizontal + items: + - size: + height: 50 + width: 100% + view: + type: score + style: + type: number_range + start: 0 + end: 10 + spacing: 2 + bindings: + selected: + shapes: + - type: rectangle + scale: 1 + border: + radius: 2 + stroke_width: 1 + stroke_color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + text_appearance: + alignment: center + font_families: + - sans-serif + font_size: 24 + color: + default: + type: hex + hex: "#FFFFFF" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + unselected: + shapes: + - type: rectangle + scale: 1 + border: + radius: 2 + stroke_width: 1 + stroke_color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + color: + default: + type: hex + hex: "#FFFFFF" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + text_appearance: + font_size: 24 + font_families: + - sans-serif + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + identifier: 221acead-707d-4927-90ae-cffc09636871 + required: true + - identifier: f6987b3a-8531-4568-9dfd-aaf6a20fffb3 + size: + width: 100% + height: auto + margin: + top: 8 + bottom: 8 + start: 16 + end: 16 + view: + type: linear_layout + direction: vertical + items: + - margin: + top: 0 + bottom: 8 + size: + width: 100% + height: auto + view: + type: label + text: What is the primary reason for your + score? + text_appearance: + font_size: 20 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + alignment: start + styles: [] + font_families: + - sans-serif + - margin: + top: 0 + bottom: 8 + size: + width: 100% + height: 75 + view: + background_color: + default: + type: hex + hex: "#eae9e9" + alpha: 1 + border: + radius: 2 + stroke_width: 1 + stroke_color: + default: + type: hex + hex: "#63656b" + alpha: 1 + type: text_input + text_appearance: + alignment: start + font_size: 14 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + identifier: f6987b3a-8531-4568-9dfd-aaf6a20fffb3 + input_type: text_multiline + required: false + - size: + width: 100% + height: 100% + view: + type: linear_layout + direction: horizontal + items: [] + - identifier: e8c5c4ae-c909-4cfd-b4a1-a9d37790b630 + size: + width: 100% + height: auto + view: + type: container + items: + - margin: + top: 8 + bottom: 8 + start: 0 + end: 0 + position: + horizontal: center + vertical: center + size: + width: 100% + height: auto + view: + type: linear_layout + direction: vertical + items: + - identifier: fd5e54ff-5564-4cf4-9ff6-d44d52bfb09e + margin: + top: 8 + end: 16 + bottom: 0 + start: 16 + size: + width: 100% + height: auto + view: + type: linear_layout + direction: vertical + items: + - margin: + top: 4 + bottom: 16 + start: 0 + end: 0 + size: + width: 100% + height: 48 + view: + type: label_button + identifier: submit_feedback--Submit + reporting_metadata: + trigger_link_id: c26d8bb3-9989-4ea0-b02b-91a0585f8dae + label: + type: label + text: Submit + text_appearance: + font_size: 16 + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + alignment: center + styles: [] + font_families: + - sans-serif + actions: {} + enabled: + - form_validation + button_click: + - form_submit + - dismiss + background_color: + default: + type: hex + hex: "#63AFF1" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + border: + radius: 0 + stroke_width: 16 + stroke_color: + default: + type: hex + hex: "#63AFF1" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#63AFF1" + alpha: 1 + event_handlers: + - type: tap + state_actions: + - type: set + key: submitted + value: true + background_color: + default: + type: hex + hex: "#FFFFFF" + alpha: 0 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + background_color: + default: + type: hex + hex: "#FFFFFF" + alpha: 0 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 0 + margin: + top: 8 + bottom: 8 + start: 0 + end: 0 + background_color: + default: + type: hex + hex: "#FFFFFF" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + background_color: + default: + type: hex + hex: "#FFFFFF" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#000000" + alpha: 1 + ignore_safe_area: false + - position: + horizontal: end + vertical: top + size: + width: 48 + height: 48 + view: + type: image_button + image: + scale: 0.4 + type: icon + icon: close + color: + default: + type: hex + hex: "#000000" + alpha: 1 + selectors: + - platform: ios + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: android + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + - platform: web + dark_mode: true + color: + type: hex + hex: "#FFFFFF" + alpha: 1 + identifier: dismiss_button + button_click: + - dismiss