[gnome-software] Add support for updates that can be done live, i.e. without a reboot



commit 63b20bf16c59ea75365856d17963ebcc7a5ea65f
Author: Richard Hughes <richard hughsie com>
Date:   Wed Nov 25 16:33:43 2015 +0000

    Add support for updates that can be done live, i.e. without a reboot

 src/gs-app-addon-row.c        |    1 +
 src/gs-app-row.c              |   23 ++++++++++++++++++++---
 src/gs-app-tile.c             |    1 +
 src/gs-app.c                  |    7 +++++++
 src/gs-feature-tile.c         |    1 +
 src/gs-history-dialog.c       |    1 +
 src/gs-plugin-loader.c        |    3 +++
 src/gs-popular-tile.c         |    1 +
 src/gs-shell-details.c        |    5 +++++
 src/plugins/gs-plugin-fwupd.c |    8 +++++++-
 10 files changed, 47 insertions(+), 4 deletions(-)
---
diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c
index ca407a4..763c11d 100644
--- a/src/gs-app-addon-row.c
+++ b/src/gs-app-addon-row.c
@@ -91,6 +91,7 @@ gs_app_addon_row_refresh (GsAppAddonRow *row)
                gtk_label_set_label (GTK_LABEL (row->label), _("Pending"));
                break;
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
        case AS_APP_STATE_INSTALLED:
                gtk_widget_set_visible (row->label, TRUE);
                gtk_label_set_label (GTK_LABEL (row->label), _("Installed"));
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index a39acaa..46dedba 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -83,7 +83,8 @@ gs_app_row_get_description (GsAppRow *app_row)
 
        /* convert the markdown update description into PangoMarkup */
        if (priv->show_update &&
-           gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE) {
+           (gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE ||
+            gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE_LIVE)) {
                tmp = gs_app_get_update_details (priv->app);
                if (tmp != NULL && tmp[0] != '\0') {
                        g_autoptr(GsMarkdown) markdown = NULL;
@@ -144,7 +145,8 @@ gs_app_row_refresh (GsAppRow *app_row)
        gtk_label_set_label (GTK_LABEL (priv->name_label),
                             gs_app_get_name (priv->app));
        if (priv->show_update &&
-           gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE) {
+           (gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE ||
+            gs_app_get_state (priv->app) == AS_APP_STATE_UPDATABLE_LIVE)) {
                gtk_widget_show (priv->version_label);
                gtk_widget_hide (priv->star);
                gtk_label_set_label (GTK_LABEL (priv->version_label),
@@ -232,6 +234,12 @@ gs_app_row_refresh (GsAppRow *app_row)
                 * allows the application to be easily installed */
                gtk_button_set_label (GTK_BUTTON (priv->button), _("Install"));
                break;
+       case AS_APP_STATE_UPDATABLE_LIVE:
+               gtk_widget_set_visible (priv->button, TRUE);
+               /* TRANSLATORS: this is a button next to the search results that
+                * allows the firmware to be easily updated */
+               gtk_button_set_label (GTK_BUTTON (priv->button), _("Install"));
+               break;
        case AS_APP_STATE_UPDATABLE:
        case AS_APP_STATE_INSTALLED:
                if (gs_app_get_kind (priv->app) != GS_APP_KIND_SYSTEM)
@@ -262,7 +270,16 @@ gs_app_row_refresh (GsAppRow *app_row)
                break;
        }
 
-       gtk_widget_set_visible (priv->button_box, !priv->show_update);
+       /* hide buttons in the update list, unless the app is live updatable */
+       switch (gs_app_get_state (priv->app)) {
+       case AS_APP_STATE_UPDATABLE_LIVE:
+       case AS_APP_STATE_INSTALLING:
+               gtk_widget_set_visible (priv->button_box, TRUE);
+               break;
+       default:
+               gtk_widget_set_visible (priv->button_box, !priv->show_update);
+               break;
+       }
 
        if (priv->selectable) {
                if (gs_app_get_id_kind (priv->app) == AS_ID_KIND_DESKTOP ||
diff --git a/src/gs-app-tile.c b/src/gs-app-tile.c
index 177452e..1586fd9 100644
--- a/src/gs-app-tile.c
+++ b/src/gs-app-tile.c
@@ -66,6 +66,7 @@ app_state_changed_idle (gpointer user_data)
        switch (gs_app_get_state (tile->app)) {
        case AS_APP_STATE_INSTALLED:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                installed = TRUE;
                name = g_strdup_printf ("%s (%s)",
                                        gs_app_get_name (tile->app),
diff --git a/src/gs-app.c b/src/gs-app.c
index ff08a16..3bab13c 100644
--- a/src/gs-app.c
+++ b/src/gs-app.c
@@ -422,6 +422,7 @@ gs_app_set_state_internal (GsApp *app, AsAppState state)
                    state == AS_APP_STATE_AVAILABLE ||
                    state == AS_APP_STATE_AVAILABLE_LOCAL ||
                    state == AS_APP_STATE_UPDATABLE ||
+                   state == AS_APP_STATE_UPDATABLE_LIVE ||
                    state == AS_APP_STATE_UNAVAILABLE)
                        state_change_ok = TRUE;
                break;
@@ -464,6 +465,12 @@ gs_app_set_state_internal (GsApp *app, AsAppState state)
                    state == AS_APP_STATE_REMOVING)
                        state_change_ok = TRUE;
                break;
+       case AS_APP_STATE_UPDATABLE_LIVE:
+               /* updatable-live has to go into an action state */
+               if (state == AS_APP_STATE_UNKNOWN ||
+                   state == AS_APP_STATE_INSTALLING)
+                       state_change_ok = TRUE;
+               break;
        case AS_APP_STATE_UNAVAILABLE:
                /* updatable has to go into an action state */
                if (state == AS_APP_STATE_UNKNOWN ||
diff --git a/src/gs-feature-tile.c b/src/gs-feature-tile.c
index 567261b..d884ef4 100644
--- a/src/gs-feature-tile.c
+++ b/src/gs-feature-tile.c
@@ -62,6 +62,7 @@ app_state_changed_idle (gpointer user_data)
        case AS_APP_STATE_INSTALLING:
        case AS_APP_STATE_REMOVING:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                name = g_strdup_printf ("%s (%s)",
                                        gs_app_get_name (tile->app),
                                        _("Installed"));
diff --git a/src/gs-history-dialog.c b/src/gs-history-dialog.c
index 8a6dc83..074614a 100644
--- a/src/gs-history-dialog.c
+++ b/src/gs-history-dialog.c
@@ -89,6 +89,7 @@ gs_history_dialog_set_app (GsHistoryDialog *dialog, GsApp *app)
                        tmp = C_("app status", "Installed");
                        break;
                case AS_APP_STATE_UPDATABLE:
+               case AS_APP_STATE_UPDATABLE_LIVE:
                        /* TRANSLATORS: this is the status in the history UI,
                         * where we are showing the application was updated */
                        tmp = C_("app status", "Updated");
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 124e8a3..f0b7eab 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -607,6 +607,8 @@ gs_plugin_loader_app_is_non_installed (GsApp *app, gpointer user_data)
                return FALSE;
        if (gs_app_get_state (app) == AS_APP_STATE_UPDATABLE)
                return FALSE;
+       if (gs_app_get_state (app) == AS_APP_STATE_UPDATABLE_LIVE)
+               return FALSE;
        return TRUE;
 }
 
@@ -2790,6 +2792,7 @@ gs_plugin_loader_updates_changed_delay_cb (gpointer user_data)
                switch (gs_app_get_state (app)) {
                case AS_APP_STATE_INSTALLED:
                case AS_APP_STATE_UPDATABLE:
+               case AS_APP_STATE_UPDATABLE_LIVE:
                        gs_app_set_state (app, AS_APP_STATE_UNKNOWN);
                        break;
                default:
diff --git a/src/gs-popular-tile.c b/src/gs-popular-tile.c
index f812fd1..ee5a23c 100644
--- a/src/gs-popular-tile.c
+++ b/src/gs-popular-tile.c
@@ -67,6 +67,7 @@ app_state_changed_idle (gpointer user_data)
        case AS_APP_STATE_INSTALLING:
        case AS_APP_STATE_REMOVING:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                installed = TRUE;
                name = g_strdup_printf ("%s (%s)",
                                        gs_app_get_name (tile->app),
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index 2edb0ca..421c4f8 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -216,6 +216,7 @@ gs_shell_details_switch_to (GsShellDetails *self)
        switch (gs_app_get_state (self->app)) {
        case AS_APP_STATE_INSTALLED:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                if (gs_app_get_id_kind (self->app) == AS_ID_KIND_DESKTOP ||
                    gs_app_get_id_kind (self->app) == AS_ID_KIND_WEB_APP) {
                        gtk_widget_set_visible (self->button_details_launch, TRUE);
@@ -239,6 +240,7 @@ gs_shell_details_switch_to (GsShellDetails *self)
                switch (state) {
                case AS_APP_STATE_INSTALLED:
                case AS_APP_STATE_UPDATABLE:
+               case AS_APP_STATE_UPDATABLE_LIVE:
                        gtk_widget_set_visible (self->button_remove, TRUE);
                        gtk_widget_set_sensitive (self->button_remove, TRUE);
                        /* Mark the button as destructive only if Launch is not visible */
@@ -297,6 +299,7 @@ gs_shell_details_switch_to (GsShellDetails *self)
                case AS_APP_STATE_AVAILABLE:
                case AS_APP_STATE_QUEUED_FOR_INSTALL:
                case AS_APP_STATE_UPDATABLE:
+               case AS_APP_STATE_UPDATABLE_LIVE:
                case AS_APP_STATE_UNAVAILABLE:
                case AS_APP_STATE_AVAILABLE_LOCAL:
                case AS_APP_STATE_INSTALLING:
@@ -807,6 +810,7 @@ gs_shell_details_refresh_all (GsShellDetails *self)
        switch (gs_app_get_state (self->app)) {
        case AS_APP_STATE_INSTALLED:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                gtk_widget_set_visible (self->label_addons_uninstalled_app, FALSE);
                break;
        default:
@@ -1127,6 +1131,7 @@ gs_shell_details_addon_selected_cb (GsAppAddonRow *row,
        switch (gs_app_get_state (self->app)) {
        case AS_APP_STATE_INSTALLED:
        case AS_APP_STATE_UPDATABLE:
+       case AS_APP_STATE_UPDATABLE_LIVE:
                if (gs_app_addon_row_get_selected (row)) {
                        gs_page_install_app (GS_PAGE (self), addon);
                } else {
diff --git a/src/plugins/gs-plugin-fwupd.c b/src/plugins/gs-plugin-fwupd.c
index 9c88493..6b217f3 100644
--- a/src/plugins/gs-plugin-fwupd.c
+++ b/src/plugins/gs-plugin-fwupd.c
@@ -396,9 +396,15 @@ gs_plugin_add_update_app (GsPlugin *plugin,
                return FALSE;
        }
 
+       /* can be done live */
+       if (flags & FU_DEVICE_FLAG_ALLOW_ONLINE) {
+               gs_app_set_state (app, AS_APP_STATE_UPDATABLE_LIVE);
+       } else {
+               gs_app_set_state (app, AS_APP_STATE_UPDATABLE);
+       }
+
        /* actually add the application */
        gs_app_set_management_plugin (app, "fwupd");
-       gs_app_set_state (app, AS_APP_STATE_UPDATABLE);
        gs_app_set_id_kind (app, AS_ID_KIND_FIRMWARE);
        gs_app_add_source_id (app, filename_cache);
        gs_app_add_category (app, "System");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]