diff --git a/src/core/adb.rs b/src/core/adb.rs index 1062c1c..082726d 100644 --- a/src/core/adb.rs +++ b/src/core/adb.rs @@ -37,7 +37,6 @@ //! For comprehensive info about ADB, //! [see this](https://android.googlesource.com/platform/packages/modules/adb/+/refs/heads/master/docs/) -use crate::core::sync::User; use regex::Regex; use serde::{Deserialize, Serialize}; use static_init::dynamic; @@ -200,11 +199,8 @@ impl ToString for PmLsPackFlag { } } -pub const PACK_PREFIX: &str = "package:"; -#[expect(clippy::cast_possible_truncation, reason = "")] -pub const PACK_URI_LEN: u8 = PACK_PREFIX.len() as _; +const PACK_PREFIX: &str = "package:"; -pub const PM_LIST_PACKS: &str = "pm list packages"; pub const PM_CLEAR_PACK: &str = "pm clear"; /// Builder for an Android Package Manager command. @@ -224,23 +220,23 @@ impl PmCmd { pub fn ls_packs( mut self, f: Option, - u: Option, + user_id: Option, ) -> Result, String> { let cmd = &mut self.0 .0 .0; cmd.args(["list", "packages", "-s"]); if let Some(s) = f { cmd.arg(s.to_str()); }; - if let Some(u) = u { + if let Some(u) = user_id { cmd.arg("--user"); - cmd.arg(u.id.to_string()); + cmd.arg(u.to_string()); }; self.0 .0.run().map(|pack_ls| { pack_ls .lines() .map(|p_ln| { debug_assert!(p_ln.starts_with(PACK_PREFIX)); - String::from(&p_ln[PACK_URI_LEN as usize..]) + String::from(&p_ln[PACK_PREFIX.len()..]) }) .collect() }) @@ -252,9 +248,9 @@ impl PmCmd { pub fn ls_packs_valid( self, f: Option, - u: Option, + user_id: Option, ) -> Result, String> { - Ok(self.ls_packs(f, u)? + Ok(self.ls_packs(f, user_id)? .into_iter() .map(|p| PackId::new(p).expect("One of these is wrong: `PackId` regex, ADB implementation. Or the spec now allows a wider char-set")).collect()) } diff --git a/src/core/sync.rs b/src/core/sync.rs index a3fa7da..dfec448 100644 --- a/src/core/sync.rs +++ b/src/core/sync.rs @@ -1,5 +1,5 @@ use crate::core::{ - adb::{to_trimmed_utf8, Cmd as AdbCmd, PACK_URI_LEN, PM_CLEAR_PACK, PM_LIST_PACKS}, + adb::{to_trimmed_utf8, Cmd as AdbCmd, PM_CLEAR_PACK}, uad_lists::PackageState, }; use crate::gui::{views::list::PackageInfo, widgets::package_row::PackageRow}; @@ -7,7 +7,7 @@ use regex::Regex; use retry::{delay::Fixed, retry, OperationResult}; use serde::{Deserialize, Serialize}; use static_init::dynamic; -use std::{collections::HashSet, process::Command}; +use std::process::Command; #[cfg(target_os = "windows")] use std::os::windows::process::CommandExt; @@ -293,13 +293,12 @@ pub const fn supports_multi_user(dev: &Device) -> bool { /// to list associated packages. /// /// If `device_serial` is empty, it lets ADB choose the default device. -pub fn is_protected_user(user_id: &str, device_serial: &str) -> bool { - adb_cmd( - true, - device_serial, - &format!("{PM_LIST_PACKS} -s --user {user_id}"), - ) - .is_err() +pub fn is_protected_user>(user_id: u16, device_serial: S) -> bool { + AdbCmd::new() + .sh(device_serial) + .pm() + .ls_packs(None, Some(user_id)) + .is_err() } /// `pm list users` parsed into a vec with extra info. @@ -319,11 +318,11 @@ pub fn ls_users_parsed(device_serial: &str) -> Vec { // It seems each line is a user, // optionally associated with a work-profile. // This will ignore the work-profiles! - let u = &RE.captures(&user).expect("Each user should have an ID")[1]; + let u = RE.captures(&user).expect("Each user should have an ID")[1] + .parse() + .unwrap_or_else(|_| unreachable!("User ID must be valid `u16`")); User { - id: u - .parse() - .unwrap_or_else(|_| unreachable!("User ID must be valid `u16`")), + id: u, index: i, protected: is_protected_user(u, device_serial), } diff --git a/src/core/utils.rs b/src/core/utils.rs index 9066a38..7f92d26 100644 --- a/src/core/utils.rs +++ b/src/core/utils.rs @@ -1,6 +1,6 @@ use crate::core::{ adb::{Cmd as AdbCmd, PmLsPackFlag}, - sync::{hashset_system_packages, User}, + sync::User, theme::Theme, uad_lists::{PackageHashMap, PackageState, Removal, UadList}, }; @@ -27,7 +27,7 @@ pub enum Error { pub fn fetch_packages( uad_lists: &PackageHashMap, device_serial: &str, - user_id: Option, + user_id: Option, ) -> Vec { let all_sys_packs = AdbCmd::new() .sh(device_serial) diff --git a/src/gui/views/list.rs b/src/gui/views/list.rs index 14b466b..ddd6d1a 100644 --- a/src/gui/views/list.rs +++ b/src/gui/views/list.rs @@ -868,7 +868,7 @@ impl List { } else { user_list .iter() - .map(|user| fetch_packages(&uad_list, serial, Some(*user))) + .map(|user| fetch_packages(&uad_list, serial, Some(user.id))) .collect() } }