diff --git a/src/core/sync.rs b/src/core/sync.rs index 0529922..127b1c9 100644 --- a/src/core/sync.rs +++ b/src/core/sync.rs @@ -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 { 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 { #[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)