From d198a9f0892c33b64d4c62fe97b1bd06d8ae6aea Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Mon, 16 Feb 2026 22:34:03 +0100 Subject: [PATCH] (Re)introduce a backend interface This will allow us to unit test essential operations on package. --- src/Core/Backend.vala | 15 +++++++++++++++ src/Core/FlatpakBackend.vala | 6 +++--- src/Core/Package.vala | 16 +++++++--------- src/meson.build | 1 + 4 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 src/Core/Backend.vala diff --git a/src/Core/Backend.vala b/src/Core/Backend.vala new file mode 100644 index 000000000..fbd7e076d --- /dev/null +++ b/src/Core/Backend.vala @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2025 elementary, Inc. (https://elementary.io) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Authored by: Leonhard Kargl + */ + +public interface AppCenterCore.Backend : Object { + public signal void operation_finished (Package package, Package.State operation, Error? error); + + public abstract void notify_package_changed (Package package); + public abstract async void install_package (Package package, ChangeInformation change_info) throws Error; + public abstract async void remove_package (Package package, ChangeInformation change_info) throws Error; + public abstract async void update_package (Package package, ChangeInformation change_info) throws Error; +} diff --git a/src/Core/FlatpakBackend.vala b/src/Core/FlatpakBackend.vala index 55aa08dc2..d00837e99 100644 --- a/src/Core/FlatpakBackend.vala +++ b/src/Core/FlatpakBackend.vala @@ -22,6 +22,7 @@ public class AppCenterCore.FlatpakPackage : Package { public FlatpakPackage (string uid, Flatpak.Installation installation, AppStream.Component component) { Object ( + backend: FlatpakBackend.get_default (), uid: uid, installation: installation, component: component @@ -49,8 +50,7 @@ public class AppCenterCore.FlatpakPackage : Package { } } -public class AppCenterCore.FlatpakBackend : Object { - public signal void operation_finished (Package package, Package.State operation, Error? error); +public class AppCenterCore.FlatpakBackend : Object, Backend { public signal void on_metadata_remote_preprocessed (string remote_title); public signal void package_list_changed (); @@ -231,7 +231,7 @@ public class AppCenterCore.FlatpakBackend : Object { runtime_updates_component.summary = _("Updates to app runtimes"); runtime_updates_component.add_icon (runtime_icon); - runtime_updates = new AppCenterCore.Package ("runtime-updates", runtime_updates_component); + runtime_updates = new AppCenterCore.Package (this, "runtime-updates", runtime_updates_component); additional_updates = new GLib.ListStore (typeof (Package)); additional_updates.append (runtime_updates); diff --git a/src/Core/Package.vala b/src/Core/Package.vala index 3989e436f..974e1d57f 100644 --- a/src/Core/Package.vala +++ b/src/Core/Package.vala @@ -96,6 +96,7 @@ public class AppCenterCore.Package : Object { public const string LOCAL_ID_SUFFIX = ".appcenter-local"; public const string DEFAULT_PRICE_DOLLARS = "1"; + public unowned Backend backend { get; construct; } public string uid { get; construct; } public AppStream.Component component { get; protected set; } @@ -418,8 +419,8 @@ public class AppCenterCore.Package : Object { change_information = new ChangeInformation (); } - public Package (string uid, AppStream.Component component) { - Object (uid: uid, component: component); + public Package (Backend backend, string uid, AppStream.Component component) { + Object (backend: backend, uid: uid, component: component); } public void replace_component (AppStream.Component component) { @@ -455,7 +456,7 @@ public class AppCenterCore.Package : Object { // Only trigger a notify if the state has changed, quite a lot of things listen to this if (state != new_state) { state = new_state; - FlatpakBackend.get_default ().notify_package_changed (this); + backend.notify_package_changed (this); } } @@ -502,15 +503,14 @@ public class AppCenterCore.Package : Object { change_information.start (); state = performing; - unowned var flatpak_backend = AppCenterCore.FlatpakBackend.get_default (); - flatpak_backend.notify_package_changed (this); + backend.notify_package_changed (this); try { yield perform_package_operation (); - flatpak_backend.operation_finished (this, performing, null); + backend.operation_finished (this, performing, null); } catch (GLib.Error e) { warning ("Operation failed for package %s - %s", name, e.message); - flatpak_backend.operation_finished (this, performing, e); + backend.operation_finished (this, performing, e); throw e; } finally { change_information.complete (); @@ -519,8 +519,6 @@ public class AppCenterCore.Package : Object { } private async void perform_package_operation () throws GLib.Error { - unowned var backend = AppCenterCore.FlatpakBackend.get_default (); - switch (state) { case State.UPDATING: yield backend.update_package (this, change_information); diff --git a/src/meson.build b/src/meson.build index 1008c3939..d19b6b9bc 100644 --- a/src/meson.build +++ b/src/meson.build @@ -5,6 +5,7 @@ appcenter_files = files( 'SuspendControl.vala', 'Utils.vala', 'Core' / 'AddonFilter.vala', + 'Core' / 'Backend.vala', 'Core/CardUtils.vala', 'Core' / 'CategoryManager.vala', 'Core/ChangeInformation.vala',