Skip to main content

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.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    /// No color blindness.
50    None,
51
52    /// Red-green color blindness due to reduced sensitivity to red light.
53    Protanomaly,
54
55    /// Red-green color blindness due to reduced sensitivity to green light.
56    Deuteranomaly,
57
58    /// Blue-yellow color blindness. It is due to reduced sensitivity to blue
59    /// light.
60    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/// Font family groups for closed captions, specified by 47 CFR §79.102(k).
204#[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/// Edge style for fonts as specified in 47 CFR §79.103(c)(7)
267#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
268pub enum EdgeStyle {
269    /// No border around fonts.
270    None,
271
272    /// A shadow "behind" and slightly offset from each edge.
273    DropShadow,
274
275    /// A bevel that mimics a 3D raised effect.
276    Raised,
277
278    /// A bevel that mimics a 3D depressed effect.
279    Depressed,
280
281    /// A plain border around each shapes.
282    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}