settings/accessibility/
types.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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    /// No color blindness.
53    None,
54
55    /// Red-green color blindness due to reduced sensitivity to red light.
56    Protanomaly,
57
58    /// Red-green color blindness due to reduced sensitivity to green light.
59    Deuteranomaly,
60
61    /// Blue-yellow color blindness. It is due to reduced sensitivity to blue
62    /// light.
63    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/// Font family groups for closed captions, specified by 47 CFR §79.102(k).
207#[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/// Edge style for fonts as specified in 47 CFR §79.103(c)(7)
270#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
271pub enum EdgeStyle {
272    /// No border around fonts.
273    None,
274
275    /// A shadow "behind" and slightly offset from each edge.
276    DropShadow,
277
278    /// A bevel that mimics a 3D raised effect.
279    Raised,
280
281    /// A bevel that mimics a 3D depressed effect.
282    Depressed,
283
284    /// A plain border around each shapes.
285    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}