settings/
lib.rs

1// SPDX-FileCopyrightText: 2024 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4//! Settings server API for reading, writing, and subscribing to settings.
5
6pub use types::inner as global;
7
8mod macros;
9pub mod messages;
10mod types;
11
12use messages::*;
13use server::{CheckedConn, CheckedPermissions, MessageAllowed};
14
15#[macro_export]
16macro_rules! use_api {
17    ($settings:path, $server:path) => {
18        mod settings_permissions {
19            use settings::messages::*;
20            use $server as server;
21            pub use $settings as settings;
22            #[derive(Clone, Default, server::Permissions)]
23            #[server_name = "os/settings"]
24            pub struct SettingsPermissions;
25        }
26        type SettingsApi =
27            settings_permissions::settings::SettingsApi<settings_permissions::SettingsPermissions>;
28    };
29    () => {
30        settings::use_api!(settings, server);
31    };
32}
33
34#[derive(Debug, Default, Clone)]
35pub struct SettingsApi<P: CheckedPermissions> {
36    pub(crate) conn: CheckedConn<P>,
37}
38
39impl<P: CheckedPermissions> SettingsApi<P> {
40    pub fn get_prime_color(&self) -> global::SystemTheme
41    where
42        P: MessageAllowed<GetPrimeColor>,
43    {
44        self.conn.send_blocking_scalar(GetPrimeColor)
45    }
46
47    pub fn flush_settings(&self)
48    where
49        P: MessageAllowed<FlushAll>,
50    {
51        self.conn.send_scalar(FlushAll { force: true })
52    }
53
54    pub fn wait_for_onboarding_complete(&self)
55    where
56        P: 'static,
57        P: MessageAllowed<SubscribeOnboardingStatus>,
58    {
59        server::listen(WaitForOnboarding(self.clone()));
60    }
61
62    pub fn lookup_timezone(&self, name: String, offset_minutes: i32) -> global::TimeZone
63    where
64        P: MessageAllowed<LookupTimeZone>,
65    {
66        self.conn.send_blocking_archive(LookupTimeZone { name, offset_minutes })
67    }
68}
69
70pub struct WaitForOnboarding<P: CheckedPermissions>(pub SettingsApi<P>);
71
72impl<P: CheckedPermissions> server::ServerMessages for WaitForOnboarding<P> {
73    const NAME: &'static str = "";
74
75    fn messages() -> &'static [server::MessageDef<Self>]
76    where
77        Self: Sized,
78    {
79        &[]
80    }
81}
82
83impl<P: CheckedPermissions> server::Server for WaitForOnboarding<P>
84where
85    P: MessageAllowed<SubscribeOnboardingStatus>,
86{
87    fn on_start(&mut self, context: &mut server::ServerContext<Self>) {
88        self.0.server_subscribe_onboarding_status(context);
89    }
90}
91
92impl<P: CheckedPermissions> server::ArchiveEventHandler<global::OnboardingStatus> for WaitForOnboarding<P>
93where
94    P: MessageAllowed<SubscribeOnboardingStatus>,
95{
96    fn handle(
97        &mut self,
98        msg: server::Owned<global::OnboardingStatus>,
99        _sender: xous::PID,
100        context: &mut server::ServerContext<Self>,
101    ) {
102        if msg.is_complete() {
103            context.shutdown();
104        }
105    }
106}