mirror of
https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation.git
synced 2026-08-25 23:14:18 +02:00
Code improvement + json list field update
This commit is contained in:
parent
4234318e3a
commit
476d4a51c9
4 changed files with 4294 additions and 4299 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -8,57 +8,60 @@ use std::{collections::HashMap};
|
|||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Package {
|
||||
id: String,
|
||||
pub list: String,
|
||||
pub list: UadList,
|
||||
pub description: Option<String>,
|
||||
dependencies: Option<String>,
|
||||
needed_by: Option<String>,
|
||||
labels: Option<Vec<String>>,
|
||||
pub confidence: String,
|
||||
pub removal: Removal,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum UadLists {
|
||||
#[derive(Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum UadList {
|
||||
All,
|
||||
Aosp,
|
||||
Carrier,
|
||||
Google,
|
||||
Misc,
|
||||
Oem,
|
||||
Pending,
|
||||
Unlisted,
|
||||
}
|
||||
|
||||
impl Default for UadLists {
|
||||
fn default() -> UadLists {
|
||||
UadLists::All
|
||||
impl Default for UadList {
|
||||
fn default() -> UadList {
|
||||
UadList::All
|
||||
}
|
||||
}
|
||||
|
||||
impl UadLists {
|
||||
pub const ALL: [UadLists; 7] = [
|
||||
UadLists::All,
|
||||
UadLists::Aosp,
|
||||
UadLists::Carrier,
|
||||
UadLists::Google,
|
||||
UadLists::Misc,
|
||||
UadLists::Oem,
|
||||
UadLists::Unlisted,
|
||||
impl UadList {
|
||||
pub const ALL: [UadList; 8] = [
|
||||
UadList::All,
|
||||
UadList::Aosp,
|
||||
UadList::Carrier,
|
||||
UadList::Google,
|
||||
UadList::Misc,
|
||||
UadList::Oem,
|
||||
UadList::Pending,
|
||||
UadList::Unlisted,
|
||||
];
|
||||
}
|
||||
|
||||
impl std::fmt::Display for UadLists {
|
||||
impl std::fmt::Display for UadList {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
match self {
|
||||
UadLists::All => "All lists",
|
||||
UadLists::Aosp => "aosp",
|
||||
UadLists::Carrier => "carrier",
|
||||
UadLists::Google => "google",
|
||||
UadLists::Misc => "misc",
|
||||
UadLists::Oem => "oem",
|
||||
UadLists::Unlisted => "unlisted",
|
||||
UadList::All => "All lists",
|
||||
UadList::Aosp => "aosp",
|
||||
UadList::Carrier => "carrier",
|
||||
UadList::Google => "google",
|
||||
UadList::Misc => "misc",
|
||||
UadList::Oem => "oem",
|
||||
UadList::Pending => "pending",
|
||||
UadList::Unlisted => "unlisted",
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -73,7 +76,7 @@ pub enum PackageState {
|
|||
|
||||
impl Default for PackageState {
|
||||
fn default() -> PackageState {
|
||||
PackageState::All
|
||||
PackageState::Installed
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,46 +117,46 @@ impl std::str::FromStr for PackageState {
|
|||
}
|
||||
|
||||
// Bad names. To be changed!
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Preselection {
|
||||
#[derive(Debug, Deserialize, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum Removal {
|
||||
All,
|
||||
Safe,
|
||||
Recommanded,
|
||||
Advanced,
|
||||
Expert,
|
||||
Unsafe,
|
||||
Unlisted,
|
||||
}
|
||||
|
||||
impl Default for Preselection {
|
||||
fn default() -> Preselection {
|
||||
Preselection::Safe
|
||||
impl Default for Removal {
|
||||
fn default() -> Removal {
|
||||
Removal::Recommanded
|
||||
}
|
||||
}
|
||||
|
||||
impl Preselection {
|
||||
pub const ALL: [Preselection; 6] = [
|
||||
Preselection::All,
|
||||
Preselection::Safe,
|
||||
Preselection::Advanced,
|
||||
Preselection::Expert,
|
||||
Preselection::Unsafe,
|
||||
Preselection::Unlisted,
|
||||
impl Removal {
|
||||
pub const ALL: [Removal; 6] = [
|
||||
Removal::All,
|
||||
Removal::Recommanded,
|
||||
Removal::Advanced,
|
||||
Removal::Expert,
|
||||
Removal::Unsafe,
|
||||
Removal::Unlisted,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
impl std::fmt::Display for Preselection {
|
||||
impl std::fmt::Display for Removal {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
match self {
|
||||
Preselection::All => "All",
|
||||
Preselection::Safe => "Safe",
|
||||
Preselection::Advanced => "Advanced",
|
||||
Preselection::Expert => "Expert",
|
||||
Preselection::Unsafe => "Unsafe",
|
||||
Preselection::Unlisted => "Unlisted",
|
||||
Removal::All => "All",
|
||||
Removal::Recommanded => "Recommanded",
|
||||
Removal::Advanced => "Advanced",
|
||||
Removal::Expert => "Expert",
|
||||
Removal::Unsafe => "Unsafe",
|
||||
Removal::Unlisted => "Unlisted",
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -165,7 +168,7 @@ pub fn load_debloat_lists() -> HashMap<String, Package> {
|
|||
let mut package_lists = HashMap::new();
|
||||
//let data = fs::read_to_string("ressources/assets/uad_lists.json").expect("Unable to read file");
|
||||
|
||||
// TODO: Do it without intermediary Vec
|
||||
// TODO: Do it without intermediary Vec?
|
||||
let list: Vec<Package> = serde_json::from_str(&DATA).expect("Unable to parse");
|
||||
|
||||
for p in list {
|
||||
|
|
|
|||
|
|
@ -151,19 +151,15 @@ impl Application for UadGui {
|
|||
let add_svg_path = format!("{}/ressources/assets/refresh.svg", env!("CARGO_MANIFEST_DIR"));
|
||||
let refresh_list_icon = Svg::from_path(add_svg_path);
|
||||
|
||||
let refresh_list_text = Text::new("Catalog ");
|
||||
|
||||
let catalog_btn = Button::new(catalog_btn,
|
||||
Row::new()
|
||||
.push(refresh_list_text)
|
||||
.push(refresh_list_icon)
|
||||
.push(Text::new("Catalog "))
|
||||
)
|
||||
.on_press(Message::CatalogRefreshPress)
|
||||
.padding(5)
|
||||
.style(style::PrimaryButton::Enabled);
|
||||
|
||||
let divider = Space::new(Length::Fill, Length::Shrink);
|
||||
|
||||
let about_btn = Button::new(about_btn, Text::new("About"))
|
||||
.on_press(Message::AboutPressed)
|
||||
.padding(5)
|
||||
|
|
@ -179,7 +175,7 @@ impl Application for UadGui {
|
|||
.align_items(Align::Center)
|
||||
.spacing(10)
|
||||
.push(Text::new("Device: ".to_string() + &device_name))
|
||||
.push(divider)
|
||||
.push(Space::new(Length::Fill, Length::Shrink))
|
||||
.push(catalog_btn)
|
||||
.push(about_btn)
|
||||
.push(settings_btn);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
use crate::gui::style;
|
||||
use crate::core::uad_lists::{ UadLists, PackageState, Package, Preselection };
|
||||
use crate::core::uad_lists::{ UadList, PackageState, Package, Removal };
|
||||
use std::{collections::HashMap};
|
||||
use std::str::FromStr;
|
||||
|
||||
use crate::gui::views::settings::Settings;
|
||||
|
||||
|
|
@ -19,7 +18,7 @@ use crate::core::sync::{
|
|||
#[derive(Clone, Debug, PartialEq)]
|
||||
pub struct SelectionPackage {
|
||||
pub name: String,
|
||||
pub state: String,
|
||||
pub state: PackageState,
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Clone)]
|
||||
|
|
@ -34,11 +33,11 @@ pub struct List {
|
|||
apply_selection_btn_state: button::State,
|
||||
package_scrollable_state: scrollable::State,
|
||||
package_state_picklist: pick_list::State<PackageState>,
|
||||
list_picklist: pick_list::State<UadLists>,
|
||||
preselection_picklist: pick_list::State<Preselection>,
|
||||
list_picklist: pick_list::State<UadList>,
|
||||
removal_picklist: pick_list::State<Removal>,
|
||||
selected_package_state: Option<PackageState>,
|
||||
selected_preselection: Option<Preselection>,
|
||||
selected_list: Option<UadLists>,
|
||||
selected_removal: Option<Removal>,
|
||||
selected_list: Option<UadList>,
|
||||
pub input_value: String,
|
||||
description: String,
|
||||
}
|
||||
|
|
@ -47,9 +46,9 @@ pub struct List {
|
|||
pub enum Message {
|
||||
SearchInputChanged(String),
|
||||
LoadPackages(&'static HashMap<String, Package>),
|
||||
ListSelected(UadLists),
|
||||
ListSelected(UadList),
|
||||
PackageStateSelected(PackageState),
|
||||
PreselectionSelected(Preselection),
|
||||
RemovalSelected(Removal),
|
||||
ApplyActionOnSelection,
|
||||
SelectAllPressed,
|
||||
List(usize, RowMessage),
|
||||
|
|
@ -63,39 +62,39 @@ impl List {
|
|||
Message::LoadPackages(uad_lists) => {
|
||||
self.filtered_packages = Vec::new();
|
||||
self.selected_package_state = Some(PackageState::Installed);
|
||||
self.selected_list = Some(UadLists::All);
|
||||
self.selected_preselection = Some(Preselection::Safe);
|
||||
self.selected_list = Some(UadList::All);
|
||||
self.selected_removal = Some(Removal::Recommanded);
|
||||
|
||||
let all_system_packages = list_all_system_packages(); // installed and uninstalled packages
|
||||
let installed_system_packages = hashset_installed_system_packages();
|
||||
let mut description;
|
||||
let mut uad_list;
|
||||
let mut state;
|
||||
let mut confidence;
|
||||
let mut removal;
|
||||
let selected = false;
|
||||
|
||||
for p_name in all_system_packages.lines() {
|
||||
state = "installed";
|
||||
state = PackageState::Installed;
|
||||
description = "[No description]";
|
||||
uad_list = "unlisted";
|
||||
confidence = "Unlisted";
|
||||
uad_list = UadList::Unlisted;
|
||||
removal = Removal::Unlisted;
|
||||
|
||||
if uad_lists.contains_key(p_name) {
|
||||
description = uad_lists.get(p_name).unwrap().description.as_ref().unwrap();
|
||||
uad_list = &uad_lists.get(p_name).unwrap().list;
|
||||
confidence = &uad_lists.get(p_name).unwrap().confidence;
|
||||
uad_list = uad_lists.get(p_name).unwrap().list;
|
||||
removal = uad_lists.get(p_name).unwrap().removal;
|
||||
}
|
||||
|
||||
if !installed_system_packages.contains(p_name) {
|
||||
state = "uninstalled";
|
||||
state = PackageState::Uninstalled;
|
||||
}
|
||||
|
||||
let package_row = PackageRow::new(
|
||||
&p_name,
|
||||
&state,
|
||||
state,
|
||||
&description,
|
||||
&uad_list,
|
||||
&confidence,
|
||||
uad_list,
|
||||
removal,
|
||||
selected,
|
||||
self.settings.expert_mode,
|
||||
);
|
||||
|
|
@ -125,8 +124,8 @@ impl List {
|
|||
Self::filter_package_lists(self);
|
||||
Command::none()
|
||||
},
|
||||
Message::PreselectionSelected(preselection) => {
|
||||
self.selected_preselection = Some(preselection);
|
||||
Message::RemovalSelected(removal) => {
|
||||
self.selected_removal = Some(removal);
|
||||
Self::filter_package_lists(self);
|
||||
Command::none()
|
||||
}
|
||||
|
|
@ -139,7 +138,7 @@ impl List {
|
|||
self.selected_packages.push(
|
||||
SelectionPackage {
|
||||
name: self.filtered_packages[i].name.clone(),
|
||||
state: self.filtered_packages[i].state.clone()
|
||||
state: self.filtered_packages[i].state
|
||||
}
|
||||
);
|
||||
} else {
|
||||
|
|
@ -151,7 +150,11 @@ impl List {
|
|||
RowMessage::RestorePressed(package) => {
|
||||
for p in &mut self.phone_packages {
|
||||
if package.name == p.name {
|
||||
p.state = if p.state == "installed" { "uninstalled".to_string() } else { "installed".to_string() };
|
||||
if p.state == PackageState::Installed {
|
||||
p.state = PackageState::Uninstalled;
|
||||
} else {
|
||||
p.state = PackageState::Installed;
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
|
@ -165,30 +168,32 @@ impl List {
|
|||
Command::none()
|
||||
},
|
||||
Message::ApplyActionOnSelection => {
|
||||
for p in self.selected_packages.clone() {
|
||||
match PackageState::from_str(&p.state).unwrap() {
|
||||
PackageState::Installed => { uninstall_package(p.name.clone()); },
|
||||
PackageState::Uninstalled => { restore_package(p.name.clone()); },
|
||||
_ => { println!("[DEBUG] ApplySelectionAction: Unknown package state"); },
|
||||
}
|
||||
for phone_p in &mut self.phone_packages {
|
||||
if p.name == phone_p.name {
|
||||
phone_p.state =
|
||||
if phone_p.state == "installed" { "uninstalled".to_string() } else { "installed".to_string() };
|
||||
break
|
||||
}
|
||||
}
|
||||
self.selected_packages.drain_filter(|p| p.name == p.name.as_str());
|
||||
Self::filter_package_lists(self);
|
||||
for p in &self.selected_packages {
|
||||
match p.state {
|
||||
PackageState::Installed => uninstall_package(p.name.clone()),
|
||||
PackageState::Uninstalled => restore_package(p.name.clone()),
|
||||
_ => "[DEBUG] ApplySelectionAction: Unknown package state".to_string(), // TODO: this is an error
|
||||
};
|
||||
|
||||
for phone_p in &mut self.phone_packages {
|
||||
if p.name == phone_p.name {
|
||||
phone_p.state = match phone_p.state {
|
||||
PackageState::Installed => PackageState::Uninstalled,
|
||||
PackageState::Uninstalled => PackageState::Installed,
|
||||
_ => PackageState::Installed, // TODO: this is an error
|
||||
};
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
Self::filter_package_lists(self);
|
||||
Command::none()
|
||||
},
|
||||
Message::SelectAllPressed => {
|
||||
let mut package;
|
||||
for p in &mut self.filtered_packages {
|
||||
p.selected = true;
|
||||
package = SelectionPackage { name: p.name.clone(), state: p.state.clone() };
|
||||
package = SelectionPackage { name: p.name.clone(), state: p.state };
|
||||
if !self.selected_packages.contains(&package) {
|
||||
self.selected_packages.push(package);
|
||||
}
|
||||
|
|
@ -219,7 +224,7 @@ impl List {
|
|||
|
||||
let list_picklist = PickList::new(
|
||||
&mut self.list_picklist,
|
||||
&UadLists::ALL[..],
|
||||
&UadList::ALL[..],
|
||||
self.selected_list,
|
||||
Message::ListSelected,
|
||||
);
|
||||
|
|
@ -231,11 +236,11 @@ impl List {
|
|||
Message::PackageStateSelected,
|
||||
);
|
||||
|
||||
let preselection_picklist = PickList::new(
|
||||
&mut self.preselection_picklist,
|
||||
&Preselection::ALL[..],
|
||||
self.selected_preselection,
|
||||
Message::PreselectionSelected,
|
||||
let removal_picklist = PickList::new(
|
||||
&mut self.removal_picklist,
|
||||
&Removal::ALL[..],
|
||||
self.selected_removal,
|
||||
Message::RemovalSelected,
|
||||
);
|
||||
|
||||
let control_panel = Row::new()
|
||||
|
|
@ -244,7 +249,7 @@ impl List {
|
|||
.spacing(10)
|
||||
.push(search_packages)
|
||||
.push(divider)
|
||||
.push(preselection_picklist)
|
||||
.push(removal_picklist)
|
||||
.push(package_state_picklist)
|
||||
.push(list_picklist);
|
||||
|
||||
|
|
@ -338,17 +343,17 @@ impl List {
|
|||
|
||||
fn filter_package_lists(&mut self) {
|
||||
|
||||
let list_filter: UadLists = self.selected_list.unwrap();
|
||||
let list_filter: UadList = self.selected_list.unwrap();
|
||||
let package_filter: PackageState = self.selected_package_state.unwrap();
|
||||
let preselection_filter: Preselection = self.selected_preselection.unwrap();
|
||||
let removal_filter: Removal = self.selected_removal.unwrap();
|
||||
|
||||
let mut filtered_packages: Vec<PackageRow> = self.phone_packages
|
||||
.iter()
|
||||
.filter(
|
||||
|p|
|
||||
(list_filter == UadLists::All || p.uad_list.to_string() == list_filter.to_string()) &&
|
||||
(package_filter == PackageState::All || p.state == package_filter.to_string()) &&
|
||||
(preselection_filter == Preselection::All || p.confidence.to_string() == preselection_filter.to_string()) &&
|
||||
(list_filter == UadList::All || p.uad_list == list_filter) &&
|
||||
(package_filter == PackageState::All || p.state == package_filter) &&
|
||||
(removal_filter == Removal::All || p.removal == removal_filter) &&
|
||||
(self.input_value.is_empty() || p.name.contains(&self.input_value))
|
||||
)
|
||||
.cloned()
|
||||
|
|
@ -368,10 +373,10 @@ impl List {
|
|||
#[derive(Clone, Debug)]
|
||||
pub struct PackageRow {
|
||||
pub name: String,
|
||||
pub state: String,
|
||||
pub state: PackageState,
|
||||
pub description: String,
|
||||
pub uad_list: String,
|
||||
pub confidence: String,
|
||||
pub uad_list: UadList,
|
||||
pub removal: Removal,
|
||||
package_btn_state: button::State,
|
||||
action_btn_state: button::State,
|
||||
selected: bool,
|
||||
|
|
@ -390,20 +395,20 @@ pub enum RowMessage {
|
|||
impl PackageRow {
|
||||
pub fn new(
|
||||
name: &str,
|
||||
state: &str,
|
||||
state: PackageState,
|
||||
description: &str,
|
||||
uad_list: &str,
|
||||
confidence: &str,
|
||||
uad_list: UadList,
|
||||
removal: Removal,
|
||||
selected: bool,
|
||||
expert_mode: bool,
|
||||
|
||||
) -> Self {
|
||||
Self {
|
||||
name: name.to_string(),
|
||||
state: state.to_string(),
|
||||
state: state,
|
||||
description: description.to_string(),
|
||||
uad_list: uad_list.to_string(),
|
||||
confidence: confidence.to_string(),
|
||||
uad_list: uad_list,
|
||||
removal: removal,
|
||||
package_btn_state: button::State::default(),
|
||||
action_btn_state: button::State::default(),
|
||||
selected: selected,
|
||||
|
|
@ -415,13 +420,13 @@ impl PackageRow {
|
|||
match message {
|
||||
RowMessage::RemovePressed(package) => {
|
||||
uninstall_package(package.name);
|
||||
self.state = "uninstalled".to_string();
|
||||
self.state = PackageState::Uninstalled;
|
||||
self.selected = false;
|
||||
Command::none()
|
||||
}
|
||||
RowMessage::RestorePressed(package) => {
|
||||
restore_package(package.name);
|
||||
self.state = "installed".to_string();
|
||||
self.state = PackageState::Installed;
|
||||
self.selected = false;
|
||||
Command::none()
|
||||
},
|
||||
|
|
@ -444,7 +449,7 @@ impl PackageRow {
|
|||
let action_btn;
|
||||
let selection_checkbox;
|
||||
|
||||
if self.state == PackageState::Installed.to_string() {
|
||||
if self.state == PackageState::Installed {
|
||||
action_text = "Uninstall";
|
||||
action_message = RowMessage::RemovePressed(package);
|
||||
button_style = style::PackageButton::Uninstall;
|
||||
|
|
@ -454,7 +459,7 @@ impl PackageRow {
|
|||
button_style = style::PackageButton::Restore;
|
||||
}
|
||||
|
||||
if self.expert_mode || self.confidence != Preselection::Unsafe.to_string() {
|
||||
if self.expert_mode || self.removal != Removal::Unsafe {
|
||||
selection_checkbox = Checkbox::new(self.selected, "", RowMessage::UpdateSelection)
|
||||
.style(style::SelectionCheckBox::Enabled);
|
||||
|
||||
|
|
@ -481,7 +486,7 @@ impl PackageRow {
|
|||
.align_items(Align::Center)
|
||||
.push(selection_checkbox)
|
||||
.push(Text::new(&self.name).width(Length::FillPortion(6)))
|
||||
.push(Text::new(&self.state).width(Length::FillPortion(3)))
|
||||
.push(Text::new(&self.state.to_string()).width(Length::FillPortion(3)))
|
||||
.push(action_btn.width(Length::FillPortion(1))
|
||||
.style(button_style)
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue