@@ -0,0 +1,240 @@
1+From b5d7cb20713eff3b3729e5c5fdd2f15680a29385 Mon Sep 17 00:00:00 2001
2+From: Bobby Rong <rjl931189261@126.com>
3+Date: Sun, 31 Oct 2021 23:12:46 +0800
4+Subject: [PATCH] build: add packagekit_backend option
5+
6+---
7+ .github/workflows/main.yml | 7 +++++++
8+ meson_options.txt | 1 +
9+ src/Application.vala | 4 ++++
10+ src/Core/BackendAggregator.vala | 2 ++
11+ src/Core/Package.vala | 21 +++++++++++++--------
12+ src/Core/UpdateManager.vala | 6 ++++++
13+ src/Views/Homepage.vala | 4 ++++
14+ src/meson.build | 10 ++++++++--
15+ 8 files changed, 45 insertions(+), 10 deletions(-)
16+
17+diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
18+index daf13654..5dc5a2fb 100644
19+--- a/.github/workflows/main.yml
20++++ b/.github/workflows/main.yml
21+@@ -42,6 +42,13 @@ jobs:
22+ meson configure -Dcurated=false -Dpayments=false -Dsharing=false -Dname=Pop\!_Shop build
23+ ninja -C build install
24+
25++ - name: Build (NixOS)
26++ env:
27++ DESTDIR: out
28++ run: |
29++ meson configure -Dcurated=false -Dpayments=false -Dpackagekit_backend=false build
30++ ninja -C build install
31++
32+ lint:
33+
34+ runs-on: ubuntu-latest
35+diff --git a/meson_options.txt b/meson_options.txt
36+index 0ae93d07..37a6cd8a 100644
37+--- a/meson_options.txt
38++++ b/meson_options.txt
39+@@ -4,3 +4,4 @@ option('name', type : 'string', value : 'AppCenter', description : 'The name of
40+ option('payments', type : 'boolean', value : true, description : 'Enable payment features and display paid apps')
41+ option('sharing', type : 'boolean', value : true, description : 'Display sharing features, i.e. copyable URLs to appcenter.elementary.io')
42+ option('hide_upstream_distro_apps', type : 'boolean', value : true, description : 'Used for hiding Ubuntu repo apps on elementary OS')
43++option('packagekit_backend', type : 'boolean', value : true, description : 'Enable PackageKit backend')
44+diff --git a/src/Application.vala b/src/Application.vala
45+index 65fae5aa..7c075076 100644
46+--- a/src/Application.vala
47++++ b/src/Application.vala
48+@@ -167,9 +167,11 @@ public class AppCenter.App : Gtk.Application {
49+
50+ var client = AppCenterCore.Client.get_default ();
51+
52++#if PACKAGEKIT_BACKEND
53+ if (fake_update_packages != null) {
54+ AppCenterCore.PackageKitBackend.get_default ().fake_packages = fake_update_packages;
55+ }
56++#endif
57+
58+ if (silent) {
59+ NetworkMonitor.get_default ().network_changed.connect ((available) => {
60+@@ -183,6 +185,7 @@ public class AppCenter.App : Gtk.Application {
61+ return;
62+ }
63+
64++#if PACKAGEKIT_BACKEND
65+ if (local_path != null) {
66+ var file = File.new_for_commandline_arg (local_path);
67+
68+@@ -192,6 +195,7 @@ public class AppCenter.App : Gtk.Application {
69+ warning ("Failed to load local AppStream XML file: %s", e.message);
70+ }
71+ }
72++#endif
73+
74+ if (main_window == null) {
75+ main_window = new MainWindow (this);
76+diff --git a/src/Core/BackendAggregator.vala b/src/Core/BackendAggregator.vala
77+index 539dba98..feb1eaa9 100644
78+--- a/src/Core/BackendAggregator.vala
79++++ b/src/Core/BackendAggregator.vala
80+@@ -26,8 +26,10 @@ public class AppCenterCore.BackendAggregator : Backend, Object {
81+
82+ construct {
83+ backends = new Gee.ArrayList<unowned Backend> ();
84++#if PACKAGEKIT_BACKEND
85+ backends.add (PackageKitBackend.get_default ());
86+ backends.add (UbuntuDriversBackend.get_default ());
87++#endif
88+ backends.add (FlatpakBackend.get_default ());
89+
90+ unowned Gtk.Application app = (Gtk.Application) GLib.Application.get_default ();
91+diff --git a/src/Core/Package.vala b/src/Core/Package.vala
92+index d6f12f15..8dbd7a22 100644
93+--- a/src/Core/Package.vala
94++++ b/src/Core/Package.vala
95+@@ -328,7 +328,14 @@ public class AppCenterCore.Package : Object {
96+ public string origin_description {
97+ owned get {
98+ unowned string origin = component.get_origin ();
99+- if (backend is PackageKitBackend) {
100++ if (backend is FlatpakBackend) {
101++ var fp_package = this as FlatpakPackage;
102++ if (fp_package != null && fp_package.installation == FlatpakBackend.system_installation) {
103++ return _("%s (system-wide)").printf (origin);
104++ }
105++ return origin;
106++#if PACKAGEKIT_BACKEND
107++ } else if (backend is PackageKitBackend) {
108+ if (origin == APPCENTER_PACKAGE_ORIGIN) {
109+ return _("AppCenter");
110+ } else if (origin == ELEMENTARY_STABLE_PACKAGE_ORIGIN) {
111+@@ -336,15 +343,9 @@ public class AppCenterCore.Package : Object {
112+ } else if (origin.has_prefix ("ubuntu-")) {
113+ return _("Ubuntu (non-curated)");
114+ }
115+- } else if (backend is FlatpakBackend) {
116+- var fp_package = this as FlatpakPackage;
117+- if (fp_package != null && fp_package.installation == FlatpakBackend.system_installation) {
118+- return _("%s (system-wide)").printf (origin);
119+- }
120+-
121+- return origin;
122+ } else if (backend is UbuntuDriversBackend) {
123+ return _("Ubuntu Drivers");
124++#endif
125+ }
126+
127+ return _("Unknown Origin (non-curated)");
128+@@ -434,11 +435,15 @@ public class AppCenterCore.Package : Object {
129+ _author_title = null;
130+ backend_details = null;
131+
132++#if PACKAGEKIT_BACKEND
133+ // The version on a PackageKit package comes from the package not AppStream, so only reset the version
134+ // on other backends
135+ if (!(backend is PackageKitBackend)) {
136+ _latest_version = null;
137+ }
138++#else
139++ _latest_version = null;
140++#endif
141+
142+ this.component = component;
143+ }
144+diff --git a/src/Core/UpdateManager.vala b/src/Core/UpdateManager.vala
145+index 9deceaf5..c92c0d37 100644
146+--- a/src/Core/UpdateManager.vala
147++++ b/src/Core/UpdateManager.vala
148+@@ -52,6 +52,7 @@ public class AppCenterCore.UpdateManager : Object {
149+ installed_package.update_state ();
150+ }
151+
152++#if PACKAGEKIT_BACKEND
153+ Pk.Results pk_updates;
154+ unowned PackageKitBackend client = PackageKitBackend.get_default ();
155+ try {
156+@@ -60,10 +61,12 @@ public class AppCenterCore.UpdateManager : Object {
157+ warning ("Unable to get updates from PackageKit backend: %s", e.message);
158+ return 0;
159+ }
160++#endif
161+
162+ uint os_count = 0;
163+ string os_desc = "";
164+
165++#if PACKAGEKIT_BACKEND
166+ var package_array = pk_updates.get_package_array ();
167+ debug ("PackageKit backend reports %d updates", package_array.length);
168+
169+@@ -87,6 +90,7 @@ public class AppCenterCore.UpdateManager : Object {
170+ );
171+ }
172+ });
173++#endif
174+
175+ os_updates.component.set_pkgnames ({});
176+ os_updates.change_information.clear_update_info ();
177+@@ -159,6 +163,7 @@ public class AppCenterCore.UpdateManager : Object {
178+ count += 1;
179+ }
180+
181++#if PACKAGEKIT_BACKEND
182+ pk_updates.get_details_array ().foreach ((pk_detail) => {
183+ var pk_package = new Pk.Package ();
184+ try {
185+@@ -181,6 +186,7 @@ public class AppCenterCore.UpdateManager : Object {
186+ critical (e.message);
187+ }
188+ });
189++#endif
190+
191+ os_updates.update_state ();
192+ return count;
193+diff --git a/src/Views/Homepage.vala b/src/Views/Homepage.vala
194+index 3673903f..2e128e77 100644
195+--- a/src/Views/Homepage.vala
196++++ b/src/Views/Homepage.vala
197+@@ -107,9 +107,13 @@ public class AppCenter.Homepage : AbstractView {
198+ column_spacing = 24,
199+ orientation = Gtk.Orientation.VERTICAL
200+ };
201++#if PACKAGEKIT_BACKEND
202+ grid.add (banner_revealer);
203+ grid.add (recently_updated_revealer);
204+ grid.add (categories_label);
205++#else
206++ category_flow.margin_top = 12;
207++#endif
208+ grid.add (category_flow);
209+
210+ scrolled_window = new Gtk.ScrolledWindow (null, null) {
211+diff --git a/src/meson.build b/src/meson.build
212+index 7b319fc6..d1d77931 100644
213+--- a/src/meson.build
214++++ b/src/meson.build
215+@@ -12,10 +12,8 @@ appcenter_files = files(
216+ 'Core/FlatpakBackend.vala',
217+ 'Core/Job.vala',
218+ 'Core/Package.vala',
219+- 'Core/PackageKitBackend.vala',
220+ 'Core/ScreenshotCache.vala',
221+ 'Core/Task.vala',
222+- 'Core/UbuntuDriversBackend.vala',
223+ 'Core/UpdateManager.vala',
224+ 'Dialogs/InstallFailDialog.vala',
225+ 'Dialogs/NonCuratedWarningDialog.vala',
226+@@ -76,6 +74,14 @@ if get_option('hide_upstream_distro_apps')
227+ args += '--define=HIDE_UPSTREAM_DISTRO_APPS'
228+ endif
229+
230++if get_option('packagekit_backend')
231++ args += '--define=PACKAGEKIT_BACKEND'
232++ appcenter_files += files(
233++ 'Core/PackageKitBackend.vala',
234++ 'Core/UbuntuDriversBackend.vala',
235++ )
236++endif
237++
238+ executable(
239+ meson.project_name(),
240+ appcenter_files,