From e31bf55be45d84b352e8eb4bbb6a214245a117a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Wed, 3 Jul 2024 09:57:26 -0700 Subject: [PATCH] AppListUpdateView: DRY Update All (#2199) --- src/Core/UpdateManager.vala | 49 +++++++++++++++++----------- src/Views/AppListUpdateView.vala | 55 +++++++++++++------------------- 2 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/Core/UpdateManager.vala b/src/Core/UpdateManager.vala index 3da7f5881..d7c2678dc 100644 --- a/src/Core/UpdateManager.vala +++ b/src/Core/UpdateManager.vala @@ -151,23 +151,7 @@ public class AppCenterCore.UpdateManager : Object { runtime_updates.update_state (); if (AppCenter.App.settings.get_boolean ("automatic-updates")) { - debug ("Update Flatpaks"); - for (int i = 0; i < updates_liststore.n_items; i++) { - var package = (Package) updates_liststore.get_item (i); - if (!package.should_pay) { - debug ("Update: %s", package.get_name ()); - try { - yield package.update (false); - - updates_liststore.remove (i); - i--; - - updates_size -= package.change_information.size; - } catch (Error e) { - warning ("Updating %s failed: %s", package.get_name (), e.message); - } - } - } + yield update_all (cancellable); } else { var application = Application.get_default (); if (updates_number > 0) { @@ -201,6 +185,35 @@ public class AppCenterCore.UpdateManager : Object { return updates_number; } + public async void update_all (Cancellable? cancellable) throws Error { + for (int i = 0; i < updates_liststore.n_items; i++) { + if (cancellable != null && cancellable.is_cancelled ()) { + return; + } + + var package = (Package) updates_liststore.get_item (i); + if (!package.should_pay) { + debug ("Update: %s", package.get_name ()); + try { + yield package.update (false); + } catch (Error e) { + // If one package update was cancelled, drop out of the loop of updating the rest + if (e is GLib.IOError.CANCELLED) { + break; + } + + warning ("Updating %s failed: %s", package.get_name (), e.message); + throw (e); + } + + updates_liststore.remove (i); + i--; + + updates_size -= package.change_information.size; + } + } + } + public void cancel_updates (bool cancel_timeout) { cancellable.cancel (); @@ -280,7 +293,7 @@ public class AppCenterCore.UpdateManager : Object { return GLib.Source.REMOVE; }); - get_updates (); + get_updates (cancellable); } private int compare_package_func (Object object1, Object object2) { diff --git a/src/Views/AppListUpdateView.vala b/src/Views/AppListUpdateView.vala index 76d1d0781..fea6c2bae 100644 --- a/src/Views/AppListUpdateView.vala +++ b/src/Views/AppListUpdateView.vala @@ -318,51 +318,40 @@ namespace AppCenter.Views { } private void on_update_all () { - perform_all_updates.begin (); - } - - private async void perform_all_updates () { if (updating_all_apps) { return; } - update_all_button.sensitive = false; - updating_all_apps = true; + set_actions_enabled (false); + + unowned var update_manager = AppCenterCore.UpdateManager.get_default (); + update_manager.update_all.begin (null, (obj, res) => { + try { + update_manager.update_all.end (res); + } catch (Error e) { + var fail_dialog = new UpgradeFailDialog (null, e.message) { + modal = true, + transient_for = (Gtk.Window) get_root () + }; + fail_dialog.present (); + } + + set_actions_enabled (true); + }); + } + + private void set_actions_enabled (bool enabled) { + updating_all_apps = !enabled; + update_all_button.sensitive = enabled; var row = list_box.get_first_child (); while (row != null) { if (row is Gtk.ListBoxRow) { - ((Widgets.InstalledPackageRowGrid) row.get_child ()).action_sensitive = false; + ((Widgets.InstalledPackageRowGrid) row.get_child ()).action_sensitive = enabled; } row = row.get_next_sibling (); } - - unowned var update_manager = AppCenterCore.UpdateManager.get_default (); - for (int i = 0; i < update_manager.updates_liststore.get_n_items (); i++) { - var package = (AppCenterCore.Package) update_manager.updates_liststore.get_item (i); - if (package.update_available && !package.should_pay) { - try { - yield package.update (false); - } catch (Error e) { - // If one package update was cancelled, drop out of the loop of updating the rest - if (e is GLib.IOError.CANCELLED) { - break; - } else { - var fail_dialog = new UpgradeFailDialog (package, e.message) { - modal = true, - transient_for = (Gtk.Window) get_root () - }; - fail_dialog.present (); - break; - } - } - } - } - - yield AppCenterCore.UpdateManager.get_default ().get_updates (); - - updating_all_apps = false; } private int compare_installed_func (Object object1, Object object2) {