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