Commit 980035dd authored by Richard Hughes's avatar Richard Hughes

fwupd: Add support for the update action

Some future dock hardware needs the user to manually restart it after the update
has completed. This patch adds the update-action functionality and shows a
dialog box just like the existing detach-action one.
parent 328c949e
Pipeline #192481 passed with stage
in 3 minutes and 2 seconds
......@@ -226,6 +226,7 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
#if FWUPD_CHECK_VERSION(1,4,5)
/* send our implemented feature set */
if (!fwupd_client_set_feature_flags (priv->client,
FWUPD_FEATURE_FLAG_UPDATE_ACTION |
FWUPD_FEATURE_FLAG_DETACH_ACTION,
cancellable, error)) {
g_prefix_error (error, "Failed to set front-end features: ");
......@@ -778,6 +779,7 @@ gs_plugin_fwupd_install (GsPlugin *plugin,
GFile *local_file;
g_autofree gchar *filename = NULL;
gboolean downloaded_to_cache = FALSE;
g_autoptr(FwupdDevice) dev = NULL;
/* not set */
local_file = gs_app_get_local_file (app);
......@@ -829,6 +831,33 @@ gs_plugin_fwupd_install (GsPlugin *plugin,
return FALSE;
}
/* does the device have an update message */
dev = fwupd_client_get_device_by_id (priv->client, device_id,
cancellable, NULL);
if (dev != NULL) {
if (fwupd_device_get_update_message (dev) != NULL) {
g_autoptr(AsScreenshot) ss = as_screenshot_new ();
#if FWUPD_CHECK_VERSION(1,4,5)
/* image is optional */
if (fwupd_device_get_update_image (dev) != NULL) {
g_autoptr(AsImage) im = as_image_new ();
as_image_set_kind (im, AS_IMAGE_KIND_SOURCE);
as_image_set_url (im, fwupd_device_get_update_image (dev));
as_screenshot_add_image (ss, im);
}
#endif
/* caption is required */
as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_DEFAULT);
as_screenshot_set_caption (ss, NULL, fwupd_device_get_update_message (dev));
gs_app_set_action_screenshot (app, ss);
/* require the dialog */
gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_USER_ACTION);
}
}
/* success */
return TRUE;
}
......
......@@ -59,6 +59,58 @@ gs_page_helper_free (GsPageHelper *helper)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GsPageHelper, gs_page_helper_free);
static void
gs_page_update_app_response_close_cb (GtkDialog *dialog, gint response, gpointer user_data)
{
gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
gs_page_show_update_message (GsPageHelper *helper, AsScreenshot *ss)
{
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
GPtrArray *images;
GtkWidget *dialog;
g_autofree gchar *escaped = NULL;
dialog = gtk_message_dialog_new (gs_shell_get_window (priv->shell),
GTK_DIALOG_MODAL |
GTK_DIALOG_USE_HEADER_BAR,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"%s", gs_app_get_name (helper->app));
escaped = g_markup_escape_text (as_screenshot_get_caption (ss, NULL), -1);
gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
"%s", escaped);
/* image is optional */
images = as_screenshot_get_images (ss);
if (images->len) {
GtkWidget *content_area;
GtkWidget *ssimg;
g_autoptr(SoupSession) soup_session = NULL;
/* load screenshot */
soup_session = soup_session_new_with_options (SOUP_SESSION_USER_AGENT,
gs_user_agent (), NULL);
ssimg = gs_screenshot_image_new (soup_session);
gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss);
gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg), 400, 225);
gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg),
helper->cancellable);
gtk_widget_set_margin_start (ssimg, 24);
gtk_widget_set_margin_end (ssimg, 24);
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
gtk_container_add (GTK_CONTAINER (content_area), ssimg);
gtk_container_child_set (GTK_CONTAINER (content_area), ssimg, "pack-type", GTK_PACK_END, NULL);
}
/* handle this async */
g_signal_connect (dialog, "response",
G_CALLBACK (gs_page_update_app_response_close_cb), helper);
gs_shell_modal_dialog_present (priv->shell, GTK_DIALOG (dialog));
}
static void
gs_page_app_installed_cb (GObject *source,
GAsyncResult *res,
......@@ -94,6 +146,16 @@ gs_page_app_installed_cb (GObject *source,
gs_utils_reboot_notify (list);
}
/* tell the user what they have to do */
if (gs_app_get_kind (helper->app) == AS_APP_KIND_FIRMWARE &&
gs_app_has_quirk (helper->app, GS_APP_QUIRK_NEEDS_USER_ACTION)) {
AsScreenshot *ss = gs_app_get_action_screenshot (helper->app);
if (ss != NULL) {
if (as_screenshot_get_caption (ss, NULL) != NULL)
gs_page_show_update_message (helper, ss);
}
}
/* only show this if the window is not active */
if (gs_app_is_installed (helper->app) &&
helper->action == GS_PLUGIN_ACTION_INSTALL &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment