blob: 851c151080ab588883bc5340145f53781602f2a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
use std::collections::{BTreeMap, HashMap};
use std::sync::{LazyLock, RwLock};
mod command;
use command::command_stdout_lossy;
pub fn version() -> String {
let version = os_version();
let api_level = get_prop("ro.build.version.sdk").unwrap_or_else(|| "N/A".to_owned());
let manufacturer =
get_prop("ro.product.manufacturer").unwrap_or_else(|| "Unknown brand".to_owned());
let product = get_prop("ro.product.model").unwrap_or_else(|| "Unknown model".to_owned());
format!("Android {version} (API: {api_level}) - {manufacturer} {product}")
}
pub fn short_version() -> String {
let version = os_version();
format!("Android {version}")
}
fn os_version() -> String {
get_prop("ro.build.version.release").unwrap_or_else(|| "N/A".to_owned())
}
pub fn extra_metadata() -> impl Iterator<Item = (String, String)> {
let mut metadata = BTreeMap::new();
metadata.insert(
"abi".to_owned(),
get_prop("ro.product.cpu.abilist").unwrap_or_else(|| "N/A".to_owned()),
);
let extra = EXTRA_METADATA.read().unwrap();
for (k, v) in extra.iter() {
metadata.insert(k.clone(), v.clone());
}
metadata.into_iter()
}
fn get_prop(property: &str) -> Option<String> {
command_stdout_lossy("getprop", &[property]).ok()
}
pub fn set_extra_metadata(extra: HashMap<String, String>) {
*EXTRA_METADATA.write().unwrap() = extra;
}
static EXTRA_METADATA: LazyLock<RwLock<HashMap<String, String>>> =
LazyLock::new(|| RwLock::new(HashMap::new()));
|