1use serde::{Deserialize, Serialize};
6use settings_common::inspect::event::Nameable;
7use settings_common::utils::Merge;
8
9#[derive(PartialEq, Default, Debug, Clone, Copy, Serialize, Deserialize)]
10pub struct AccessibilityInfo {
11 pub(crate) audio_description: Option<bool>,
12 pub(crate) screen_reader: Option<bool>,
13 pub(crate) color_inversion: Option<bool>,
14 pub(crate) enable_magnification: Option<bool>,
15 pub(crate) color_correction: Option<ColorBlindnessType>,
16 pub(crate) captions_settings: Option<CaptionsSettings>,
17}
18
19impl AccessibilityInfo {
20 pub(crate) fn is_finite(&self) -> bool {
21 self.captions_settings.is_none_or(|captions| captions.is_finite())
22 }
23}
24
25impl Nameable for AccessibilityInfo {
26 const NAME: &str = "Accessibility";
27}
28
29impl Merge for AccessibilityInfo {
30 fn merge(&self, other: Self) -> Self {
31 AccessibilityInfo {
32 audio_description: other.audio_description.or(self.audio_description),
33 screen_reader: other.screen_reader.or(self.screen_reader),
34 color_inversion: other.color_inversion.or(self.color_inversion),
35 enable_magnification: other.enable_magnification.or(self.enable_magnification),
36 color_correction: other.color_correction.or(self.color_correction),
37 captions_settings: match (self.captions_settings, other.captions_settings) {
38 (Some(caption_settings), Some(other_caption_settings)) => {
39 Some(caption_settings.merge(other_caption_settings))
40 }
41 _ => other.captions_settings.or(self.captions_settings),
42 },
43 }
44 }
45}
46
47#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
48pub(crate) enum ColorBlindnessType {
49 None,
51
52 Protanomaly,
54
55 Deuteranomaly,
57
58 Tritanomaly,
61}
62
63impl From<fidl_fuchsia_settings::ColorBlindnessType> for ColorBlindnessType {
64 fn from(color_blindness_type: fidl_fuchsia_settings::ColorBlindnessType) -> Self {
65 match color_blindness_type {
66 fidl_fuchsia_settings::ColorBlindnessType::None => ColorBlindnessType::None,
67 fidl_fuchsia_settings::ColorBlindnessType::Protanomaly => {
68 ColorBlindnessType::Protanomaly
69 }
70 fidl_fuchsia_settings::ColorBlindnessType::Deuteranomaly => {
71 ColorBlindnessType::Deuteranomaly
72 }
73 fidl_fuchsia_settings::ColorBlindnessType::Tritanomaly => {
74 ColorBlindnessType::Tritanomaly
75 }
76 }
77 }
78}
79
80impl From<ColorBlindnessType> for fidl_fuchsia_settings::ColorBlindnessType {
81 fn from(color_blindness_type: ColorBlindnessType) -> Self {
82 match color_blindness_type {
83 ColorBlindnessType::None => fidl_fuchsia_settings::ColorBlindnessType::None,
84 ColorBlindnessType::Protanomaly => {
85 fidl_fuchsia_settings::ColorBlindnessType::Protanomaly
86 }
87 ColorBlindnessType::Deuteranomaly => {
88 fidl_fuchsia_settings::ColorBlindnessType::Deuteranomaly
89 }
90 ColorBlindnessType::Tritanomaly => {
91 fidl_fuchsia_settings::ColorBlindnessType::Tritanomaly
92 }
93 }
94 }
95}
96
97#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
98pub(crate) struct CaptionsSettings {
99 pub(crate) for_media: Option<bool>,
100 pub(crate) for_tts: Option<bool>,
101 pub(crate) font_style: Option<CaptionFontStyle>,
102 pub(crate) window_color: Option<ColorRgba>,
103 pub(crate) background_color: Option<ColorRgba>,
104}
105
106impl CaptionsSettings {
107 pub(crate) fn is_finite(&self) -> bool {
108 self.font_style.is_none_or(|font_style| font_style.is_finite())
109 && self.window_color.is_none_or(|window_color| window_color.is_finite())
110 && self.background_color.is_none_or(|bkg_color| bkg_color.is_finite())
111 }
112}
113
114impl Merge for CaptionsSettings {
115 fn merge(&self, other: Self) -> Self {
116 CaptionsSettings {
117 for_media: other.for_media.or(self.for_media),
118 for_tts: other.for_tts.or(self.for_tts),
119 window_color: other.window_color.or(self.window_color),
120 background_color: other.background_color.or(self.background_color),
121 font_style: match (self.font_style, other.font_style) {
122 (Some(style), Some(other_style)) => Some(style.merge(other_style)),
123 _ => other.font_style.or(self.font_style),
124 },
125 }
126 }
127}
128
129impl From<fidl_fuchsia_settings::CaptionsSettings> for CaptionsSettings {
130 fn from(src: fidl_fuchsia_settings::CaptionsSettings) -> Self {
131 CaptionsSettings {
132 for_media: src.for_media,
133 for_tts: src.for_tts,
134 font_style: src.font_style.map(fidl_fuchsia_settings::CaptionFontStyle::into),
135 window_color: src.window_color.map(fidl_fuchsia_ui_types::ColorRgba::into),
136 background_color: src.background_color.map(fidl_fuchsia_ui_types::ColorRgba::into),
137 }
138 }
139}
140
141impl From<CaptionsSettings> for fidl_fuchsia_settings::CaptionsSettings {
142 fn from(src: CaptionsSettings) -> Self {
143 fidl_fuchsia_settings::CaptionsSettings {
144 for_media: src.for_media,
145 for_tts: src.for_tts,
146 font_style: src.font_style.map(CaptionFontStyle::into),
147 window_color: src.window_color.map(ColorRgba::into),
148 background_color: src.background_color.map(ColorRgba::into),
149 ..Default::default()
150 }
151 }
152}
153
154#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
155pub(crate) struct CaptionFontStyle {
156 pub(crate) family: Option<CaptionFontFamily>,
157 pub(crate) color: Option<ColorRgba>,
158 pub(crate) relative_size: Option<f32>,
159 pub(crate) char_edge_style: Option<EdgeStyle>,
160}
161
162impl CaptionFontStyle {
163 pub(crate) fn is_finite(&self) -> bool {
164 self.color.is_none_or(|color| color.is_finite())
165 && self.relative_size.is_none_or(|size| size.is_finite())
166 }
167}
168
169impl Merge for CaptionFontStyle {
170 fn merge(&self, other: Self) -> Self {
171 CaptionFontStyle {
172 family: other.family.or(self.family),
173 color: other.color.or(self.color),
174 relative_size: other.relative_size.or(self.relative_size),
175 char_edge_style: other.char_edge_style.or(self.char_edge_style),
176 }
177 }
178}
179
180impl From<fidl_fuchsia_settings::CaptionFontStyle> for CaptionFontStyle {
181 fn from(src: fidl_fuchsia_settings::CaptionFontStyle) -> Self {
182 CaptionFontStyle {
183 family: src.family.map(fidl_fuchsia_settings::CaptionFontFamily::into),
184 color: src.color.map(fidl_fuchsia_ui_types::ColorRgba::into),
185 relative_size: src.relative_size,
186 char_edge_style: src.char_edge_style.map(fidl_fuchsia_settings::EdgeStyle::into),
187 }
188 }
189}
190
191impl From<CaptionFontStyle> for fidl_fuchsia_settings::CaptionFontStyle {
192 fn from(src: CaptionFontStyle) -> Self {
193 fidl_fuchsia_settings::CaptionFontStyle {
194 family: src.family.map(CaptionFontFamily::into),
195 color: src.color.map(ColorRgba::into),
196 relative_size: src.relative_size,
197 char_edge_style: src.char_edge_style.map(EdgeStyle::into),
198 ..Default::default()
199 }
200 }
201}
202
203#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
205pub(crate) enum CaptionFontFamily {
206 Unknown,
207 MonospacedSerif,
208 ProportionalSerif,
209 MonospacedSansSerif,
210 ProportionalSansSerif,
211 Casual,
212 Cursive,
213 SmallCapitals,
214}
215
216impl From<fidl_fuchsia_settings::CaptionFontFamily> for CaptionFontFamily {
217 fn from(src: fidl_fuchsia_settings::CaptionFontFamily) -> Self {
218 match src {
219 fidl_fuchsia_settings::CaptionFontFamily::Unknown => CaptionFontFamily::Unknown,
220 fidl_fuchsia_settings::CaptionFontFamily::MonospacedSerif => {
221 CaptionFontFamily::MonospacedSerif
222 }
223 fidl_fuchsia_settings::CaptionFontFamily::ProportionalSerif => {
224 CaptionFontFamily::ProportionalSerif
225 }
226 fidl_fuchsia_settings::CaptionFontFamily::MonospacedSansSerif => {
227 CaptionFontFamily::MonospacedSansSerif
228 }
229 fidl_fuchsia_settings::CaptionFontFamily::ProportionalSansSerif => {
230 CaptionFontFamily::ProportionalSansSerif
231 }
232 fidl_fuchsia_settings::CaptionFontFamily::Casual => CaptionFontFamily::Casual,
233 fidl_fuchsia_settings::CaptionFontFamily::Cursive => CaptionFontFamily::Cursive,
234 fidl_fuchsia_settings::CaptionFontFamily::SmallCapitals => {
235 CaptionFontFamily::SmallCapitals
236 }
237 }
238 }
239}
240
241impl From<CaptionFontFamily> for fidl_fuchsia_settings::CaptionFontFamily {
242 fn from(src: CaptionFontFamily) -> Self {
243 match src {
244 CaptionFontFamily::Unknown => fidl_fuchsia_settings::CaptionFontFamily::Unknown,
245 CaptionFontFamily::MonospacedSerif => {
246 fidl_fuchsia_settings::CaptionFontFamily::MonospacedSerif
247 }
248 CaptionFontFamily::ProportionalSerif => {
249 fidl_fuchsia_settings::CaptionFontFamily::ProportionalSerif
250 }
251 CaptionFontFamily::MonospacedSansSerif => {
252 fidl_fuchsia_settings::CaptionFontFamily::MonospacedSansSerif
253 }
254 CaptionFontFamily::ProportionalSansSerif => {
255 fidl_fuchsia_settings::CaptionFontFamily::ProportionalSansSerif
256 }
257 CaptionFontFamily::Casual => fidl_fuchsia_settings::CaptionFontFamily::Casual,
258 CaptionFontFamily::Cursive => fidl_fuchsia_settings::CaptionFontFamily::Cursive,
259 CaptionFontFamily::SmallCapitals => {
260 fidl_fuchsia_settings::CaptionFontFamily::SmallCapitals
261 }
262 }
263 }
264}
265
266#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
268pub enum EdgeStyle {
269 None,
271
272 DropShadow,
274
275 Raised,
277
278 Depressed,
280
281 Outline,
283}
284
285impl From<fidl_fuchsia_settings::EdgeStyle> for EdgeStyle {
286 fn from(src: fidl_fuchsia_settings::EdgeStyle) -> Self {
287 match src {
288 fidl_fuchsia_settings::EdgeStyle::None => EdgeStyle::None,
289 fidl_fuchsia_settings::EdgeStyle::DropShadow => EdgeStyle::DropShadow,
290 fidl_fuchsia_settings::EdgeStyle::Raised => EdgeStyle::Raised,
291 fidl_fuchsia_settings::EdgeStyle::Depressed => EdgeStyle::Depressed,
292 fidl_fuchsia_settings::EdgeStyle::Outline => EdgeStyle::Outline,
293 }
294 }
295}
296
297impl From<EdgeStyle> for fidl_fuchsia_settings::EdgeStyle {
298 fn from(src: EdgeStyle) -> Self {
299 match src {
300 EdgeStyle::None => fidl_fuchsia_settings::EdgeStyle::None,
301 EdgeStyle::DropShadow => fidl_fuchsia_settings::EdgeStyle::DropShadow,
302 EdgeStyle::Raised => fidl_fuchsia_settings::EdgeStyle::Raised,
303 EdgeStyle::Depressed => fidl_fuchsia_settings::EdgeStyle::Depressed,
304 EdgeStyle::Outline => fidl_fuchsia_settings::EdgeStyle::Outline,
305 }
306 }
307}
308
309#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
310pub(crate) struct ColorRgba {
311 pub(crate) red: f32,
312 pub(crate) green: f32,
313 pub(crate) blue: f32,
314 pub(crate) alpha: f32,
315}
316
317impl ColorRgba {
318 pub(crate) fn is_finite(&self) -> bool {
319 self.red.is_finite()
320 && self.green.is_finite()
321 && self.blue.is_finite()
322 && self.alpha.is_finite()
323 }
324}
325
326impl From<fidl_fuchsia_ui_types::ColorRgba> for ColorRgba {
327 fn from(src: fidl_fuchsia_ui_types::ColorRgba) -> Self {
328 ColorRgba { red: src.red, green: src.green, blue: src.blue, alpha: src.alpha }
329 }
330}
331
332impl From<ColorRgba> for fidl_fuchsia_ui_types::ColorRgba {
333 fn from(src: ColorRgba) -> Self {
334 fidl_fuchsia_ui_types::ColorRgba {
335 red: src.red,
336 green: src.green,
337 blue: src.blue,
338 alpha: src.alpha,
339 }
340 }
341}