28 lines
936 B
Rust
28 lines
936 B
Rust
use std::sync::Once;
|
|
|
|
use android_system_properties::AndroidSystemProperties;
|
|
|
|
use crate::ffi_utils::android_timezone_property_name;
|
|
|
|
pub(crate) fn get_timezone_inner() -> Result<String, crate::GetTimezoneError> {
|
|
let key = android_timezone_property_name();
|
|
|
|
get_properties()
|
|
.and_then(|properties| properties.get_from_cstr(key))
|
|
.ok_or(crate::GetTimezoneError::OsError)
|
|
}
|
|
|
|
fn get_properties() -> Option<&'static AndroidSystemProperties> {
|
|
static INITIALIZED: Once = Once::new();
|
|
static mut PROPERTIES: Option<AndroidSystemProperties> = None;
|
|
|
|
INITIALIZED.call_once(|| {
|
|
let properties = AndroidSystemProperties::new();
|
|
// SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once.
|
|
unsafe { PROPERTIES = Some(properties) };
|
|
});
|
|
|
|
// SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once.
|
|
unsafe { PROPERTIES.as_ref() }
|
|
}
|