Skip to content

Commit

Permalink
Check if the ADB command succeed before changing the package state
Browse files Browse the repository at this point in the history
`perform_commands()` now returns a result.

On old devices, ADB commands can return the '0' exit code even if there is an error
On Android 4.4, ADB doesn't check if the package exists. It does not return any error if
you try to `pm block` a non-existent package.

When the command doesn't exist ADB write to stdout "Error: ..." so we can at least catch this.
  • Loading branch information
0x192 committed Jan 18, 2022
1 parent cbae57b commit d840934
Showing 1 changed file with 39 additions and 21 deletions.
60 changes: 39 additions & 21 deletions src/gui/views/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,25 +286,26 @@ impl List {
Command::none()
}
Message::ChangePackageState(res) => {
let package = &mut self.phone_packages[*i_user][i];
update_selection_count(&mut self.selection, package.state, false);

if !settings.multi_user_mode {
package.state = package.state.opposite(settings.disable_mode);
package.selected = false;
} else {
for u in &phone.user_list {
self.phone_packages[u.index][i].state = self.phone_packages[u.index][i]
.state
.opposite(settings.disable_mode);
self.phone_packages[u.index][i].selected = false;
if let Ok(i) = res {
let package = &mut self.phone_packages[*i_user][i];
update_selection_count(&mut self.selection, package.state, false);

if !settings.multi_user_mode {
package.state = package.state.opposite(settings.disable_mode);
package.selected = false;
} else {
for u in &phone.user_list {
self.phone_packages[u.index][i].state = self.phone_packages[u.index][i]
.state
.opposite(settings.disable_mode);
self.phone_packages[u.index][i].selected = false;
}
}
self.selection
.selected_packages
.drain_filter(|s_i| *s_i == i);
Self::filter_package_lists(self);
}

self.selection
.selected_packages
.drain_filter(|s_i| *s_i == i);
Self::filter_package_lists(self);
Command::none()
}
}
Expand Down Expand Up @@ -507,16 +508,33 @@ impl List {
.collect();
}

async fn perform_commands(action: String, i: usize, recommendation: Removal) -> usize {
async fn perform_commands(
action: String,
i: usize,
recommendation: Removal,
) -> Result<usize, ()> {
match adb_shell_command(true, &action) {
Ok(_) => info!("[{}] {}", recommendation, action),
Ok(o) => {
// On old devices, adb commands can return the '0' exit code even if there
// is an error. On Android 4.4, ADB doesn't check if the package exists.
// It does not return any error if you try to `pm block` a non-existent package.
// Some commands are even killed by ADB before finishing and UAD can't catch
// the output.
if ["Error", "Failure"].iter().any(|&e| o.contains(e)) {
error!("[{}] {} -> {}", recommendation, action, o);
Err(())
} else {
info!("[{}] {} -> {}", recommendation, action, o);
Ok(i)
}
}
Err(err) => {
if !err.contains("[not installed for") {
error!("[{}] {} -> {}", recommendation, action, err);
}
Err(())
}
};
i
}
}

async fn load_packages(user_list: Vec<User>) -> Vec<Vec<PackageRow>> {
Expand Down

0 comments on commit d840934

Please sign in to comment.