[gnome-software/wip/ubuntu-3-26: 4/15] Download changelog information on demand - this stops the UI blocking on startup
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software/wip/ubuntu-3-26: 4/15] Download changelog information on demand - this stops the UI blocking on startup
- Date: Wed, 24 Jan 2018 03:55:51 +0000 (UTC)
commit ba1c8f7a650a4d0a28ec61e6e89446bf9bc1ddf8
Author: Robert Ancell <robert ancell canonical com>
Date: Mon Nov 7 16:55:18 2016 +1300
Download changelog information on demand - this stops the UI blocking on startup
lib/gs-plugin-types.h | 2 ++
src/gs-update-dialog.c | 40 +++++++++++++++++++++++++++++++++++++---
2 files changed, 39 insertions(+), 3 deletions(-)
---
diff --git a/lib/gs-plugin-types.h b/lib/gs-plugin-types.h
index f31dbf9..759ef49 100644
--- a/lib/gs-plugin-types.h
+++ b/lib/gs-plugin-types.h
@@ -149,6 +149,7 @@ typedef enum {
* @GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI: Require the origin for UI
* @GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME: Require the runtime
* @GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS: Require screenshot information
+ * @GS_PLUGIN_REFINE_FLAGS_REQUIRE_CHANGELOG: Require the changelog
*
* The refine flags.
**/
@@ -180,6 +181,7 @@ typedef enum {
#define GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN_UI ((guint64) 1 << 24)
#define GS_PLUGIN_REFINE_FLAGS_REQUIRE_RUNTIME ((guint64) 1 << 25)
#define GS_PLUGIN_REFINE_FLAGS_REQUIRE_SCREENSHOTS ((guint64) 1 << 26)
+#define GS_PLUGIN_REFINE_FLAGS_REQUIRE_CHANGELOG ((guint64) 1 << 27)
typedef guint64 GsPluginRefineFlags;
/**
diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c
index ec67027..4177db2 100644
--- a/src/gs-update-dialog.c
+++ b/src/gs-update-dialog.c
@@ -49,6 +49,7 @@ struct _GsUpdateDialog
GQueue *back_entry_stack;
GCancellable *cancellable;
GsPluginLoader *plugin_loader;
+ GsApp *app;
GtkWidget *box_header;
GtkWidget *button_back;
GtkWidget *image_icon;
@@ -95,12 +96,33 @@ back_entry_free (BackEntry *entry)
}
static void
+refine_cb (GsPluginLoader *plugin_loader, GAsyncResult *res, GsUpdateDialog *dialog)
+{
+ const gchar *update_details;
+ g_autoptr(GError) error = NULL;
+
+ if (!gs_plugin_loader_job_action_finish (plugin_loader, res, &error))
+ g_warning ("Failed to get changelog information: %s", error->message);
+
+ update_details = gs_app_get_update_details (dialog->app);
+ if (update_details == NULL) {
+ /* TRANSLATORS: this is where the packager did not write
+ * a description for the update */
+ update_details = _("No update description available.");
+ }
+
+ gtk_label_set_label (GTK_LABEL (dialog->label_details), update_details);
+}
+
+static void
set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
{
AsAppKind kind;
const GdkPixbuf *pixbuf;
const gchar *update_details;
+ g_set_object (&dialog->app, app);
+
/* set window title */
kind = gs_app_get_kind (app);
if (kind == AS_APP_KIND_OS_UPDATE) {
@@ -124,9 +146,20 @@ set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
gtk_widget_set_visible (dialog->box_header, kind == AS_APP_KIND_DESKTOP);
update_details = gs_app_get_update_details (app);
if (update_details == NULL) {
- /* TRANSLATORS: this is where the packager did not write
- * a description for the update */
- update_details = _("No update description available.");
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+
+ /* TRANSLATORS: this is displayed while the changelog is being downloaded */
+ update_details = _("Downloading change information…");
+
+ plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REFINE,
+ "app", app,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_CHANGELOG,
+ NULL);
+ gs_plugin_loader_job_process_async (dialog->plugin_loader,
+ plugin_job,
+ dialog->cancellable,
+ (GAsyncReadyCallback) refine_cb,
+ dialog);
}
gtk_label_set_label (GTK_LABEL (dialog->label_details), update_details);
gtk_label_set_label (GTK_LABEL (dialog->label_name), gs_app_get_name (app));
@@ -653,6 +686,7 @@ gs_update_dialog_dispose (GObject *object)
}
g_clear_object (&dialog->plugin_loader);
+ g_clear_object (&dialog->app);
G_OBJECT_CLASS (gs_update_dialog_parent_class)->dispose (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]