refactor(sync): const pm {list packages | clear}

This commit is contained in:
Rudxain 2024-09-24 17:38:16 -04:00
commit 8ddbe68ebe

View file

@ -13,8 +13,11 @@ use std::process::Command;
#[cfg(target_os = "windows")]
use std::os::windows::process::CommandExt;
const PM_LS_PKG: &str = "pm list packages";
const PM_C: &str = "pm clear";
#[dynamic]
static RE: Regex = Regex::new(r"\n(\S+)\s+device").unwrap();
static RE: Regex = Regex::new(r"\n(\S+)\s+device").unwrap_or_else(|_| unreachable!());
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Phone {
@ -140,6 +143,7 @@ pub async fn perform_adb_commands(
}
}
/// If `None`, returns an empty String, not " --user 0"
pub fn user_flag(user_id: Option<&User>) -> String {
user_id
.map(|user| format!(" --user {}", user.id))
@ -147,7 +151,7 @@ pub fn user_flag(user_id: Option<&User>) -> String {
}
pub fn list_all_system_packages(user_id: Option<&User>) -> String {
let action = format!("pm list packages -s -u{}", user_flag(user_id));
let action = format!("{PM_LS_PKG} -s -u{}", user_flag(user_id));
adb_shell_command(true, &action)
.unwrap_or_default()
@ -157,8 +161,8 @@ pub fn list_all_system_packages(user_id: Option<&User>) -> String {
pub fn hashset_system_packages(state: PackageState, user_id: Option<&User>) -> HashSet<String> {
let user = user_flag(user_id);
let action = match state {
PackageState::Enabled => format!("pm list packages -s -e{user}"),
PackageState::Disabled => format!("pm list package -s -d{user}"),
PackageState::Enabled => format!("{PM_LS_PKG} -s -e{user}"),
PackageState::Disabled => format!("{PM_LS_PKG} -s -d{user}"),
_ => String::default(), // You probably don't need to use this function for anything else
};
@ -221,7 +225,7 @@ pub fn apply_pkg_state_commands(
PackageState::Uninstalled => match phone.android_sdk {
i if i >= 23 => vec!["cmd package install-existing"],
21 | 22 => vec!["pm unhide"],
19 | 20 => vec!["pm unblock", "pm clear"],
19 | 20 => vec!["pm unblock", PM_C],
_ => vec![], // Impossible action already prevented by the GUI
},
_ => vec![],
@ -229,7 +233,7 @@ pub fn apply_pkg_state_commands(
}
PackageState::Disabled => match package.state {
PackageState::Uninstalled | PackageState::Enabled => match phone.android_sdk {
sdk if sdk >= 23 => vec!["pm disable-user", "am force-stop", "pm clear"],
sdk if sdk >= 23 => vec!["pm disable-user", "am force-stop", PM_C],
_ => vec![],
},
_ => vec![],
@ -237,9 +241,9 @@ pub fn apply_pkg_state_commands(
PackageState::Uninstalled => match package.state {
PackageState::Enabled | PackageState::Disabled => match phone.android_sdk {
sdk if sdk >= 23 => vec!["pm uninstall"], // > Android Marshmallow (6.0)
21 | 22 => vec!["pm hide", "pm clear"], // Android Lollipop (5.x)
19 | 20 => vec!["pm block", "pm clear"], // Android KitKat (4.4/4.4W)
_ => vec!["pm block", "pm clear"], // Disable mode is unavailable on older devices because the specific ADB commands need root
21 | 22 => vec!["pm hide", PM_C], // Android Lollipop (5.x)
19 | 20 => vec!["pm block", PM_C], // Android KitKat (4.4/4.4W)
_ => vec!["pm block", PM_C], // Disable mode is unavailable on older devices because the specific ADB commands need root
},
_ => vec![],
},
@ -292,12 +296,12 @@ pub fn get_phone_brand() -> String {
/// Check if a `user_id` is protected on a device by trying
/// to list associated packages.
pub fn is_protected_user(user_id: &str) -> bool {
adb_shell_command(true, &format!("pm list packages -s --user {user_id}")).is_err()
adb_shell_command(true, &format!("{PM_LS_PKG} -s --user {user_id}")).is_err()
}
pub fn get_user_list() -> Vec<User> {
#[dynamic]
static RE: Regex = Regex::new(r"\{([0-9]+)").unwrap();
static RE: Regex = Regex::new(r"\{([0-9]+)").unwrap_or_else(|_| unreachable!());
adb_shell_command(true, "pm list users")
.map(|users| {
RE.find_iter(&users)