[gnome-software/987-removing-layered-local-package-on-silverblue-does-not-notify-the-user-that-it-was-actually: 39/41] gs-app: Introduce pending install and pending remove application states




commit 68fdfb03b6f08d8a92449ebf56bccdfdc1eb2885
Author: Milan Crha <mcrha redhat com>
Date:   Fri Apr 16 12:06:24 2021 +0200

    gs-app: Introduce pending install and pending remove application states
    
    These can be used to indicate that the application had been installed/removed,
    but there's needed certain action to finish the operation, like a machine reboot.

 lib/gs-app.c           | 18 +++++++++++++++---
 lib/gs-app.h           |  6 ++++++
 src/gs-app-addon-row.c |  8 ++++++++
 src/gs-app-row.c       |  8 ++++++++
 src/gs-details-page.c  | 44 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 3 deletions(-)
---
diff --git a/lib/gs-app.c b/lib/gs-app.c
index e8eb9d48b..a967ec9d1 100644
--- a/lib/gs-app.c
+++ b/lib/gs-app.c
@@ -236,6 +236,10 @@ gs_app_state_to_string (GsAppState state)
                return "updatable-live";
        if (state == GS_APP_STATE_UNAVAILABLE)
                return "unavailable";
+       if (state == GS_APP_STATE_PENDING_INSTALL)
+               return "pending-install";
+       if (state == GS_APP_STATE_PENDING_REMOVE)
+               return "pending-remove";
        return NULL;
 }
 
@@ -1029,7 +1033,9 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
                    state == GS_APP_STATE_AVAILABLE_LOCAL ||
                    state == GS_APP_STATE_UPDATABLE ||
                    state == GS_APP_STATE_UPDATABLE_LIVE ||
-                   state == GS_APP_STATE_UNAVAILABLE)
+                   state == GS_APP_STATE_UNAVAILABLE ||
+                   state == GS_APP_STATE_PENDING_INSTALL ||
+                   state == GS_APP_STATE_PENDING_REMOVE)
                        state_change_ok = TRUE;
                break;
        case GS_APP_STATE_INSTALLED:
@@ -1060,7 +1066,8 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
                    state == GS_APP_STATE_INSTALLED ||
                    state == GS_APP_STATE_UPDATABLE ||
                    state == GS_APP_STATE_UPDATABLE_LIVE ||
-                   state == GS_APP_STATE_AVAILABLE)
+                   state == GS_APP_STATE_AVAILABLE ||
+                   state == GS_APP_STATE_PENDING_INSTALL)
                        state_change_ok = TRUE;
                break;
        case GS_APP_STATE_REMOVING:
@@ -1068,7 +1075,8 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
                if (state == GS_APP_STATE_UNKNOWN ||
                    state == GS_APP_STATE_UNAVAILABLE ||
                    state == GS_APP_STATE_AVAILABLE ||
-                   state == GS_APP_STATE_INSTALLED)
+                   state == GS_APP_STATE_INSTALLED ||
+                   state == GS_APP_STATE_PENDING_REMOVE)
                        state_change_ok = TRUE;
                break;
        case GS_APP_STATE_UPDATABLE:
@@ -1097,6 +1105,10 @@ gs_app_set_state_internal (GsApp *app, GsAppState state)
                    state == GS_APP_STATE_INSTALLING)
                        state_change_ok = TRUE;
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+       case GS_APP_STATE_PENDING_REMOVE:
+               state_change_ok = TRUE;
+               break;
        default:
                g_warning ("state %s unhandled",
                           gs_app_state_to_string (priv->state));
diff --git a/lib/gs-app.h b/lib/gs-app.h
index 2961da4b4..01c2c6d52 100644
--- a/lib/gs-app.h
+++ b/lib/gs-app.h
@@ -43,6 +43,10 @@ struct _GsAppClass
  * @GS_APP_STATE_UPDATABLE_LIVE:               Application is installed and updatable live
  * @GS_APP_STATE_PURCHASABLE:                  Application is available for purchasing
  * @GS_APP_STATE_PURCHASING:                   Application is being purchased
+ * @GS_APP_STATE_PENDING_INSTALL:              Application is installed, but may have pending some actions,
+ *                                             like restart, to finish it
+ * @GS_APP_STATE_PENDING_REMOVE:               Application is removed, but may have pending some actions,
+ *                                             like restart, to finish it
  *
  * The application state.
  **/
@@ -59,6 +63,8 @@ typedef enum {
        GS_APP_STATE_UPDATABLE_LIVE,                    /* Since: 0.5.4 */
        GS_APP_STATE_PURCHASABLE,                       /* Since: 0.5.17 */
        GS_APP_STATE_PURCHASING,                        /* Since: 0.5.17 */
+       GS_APP_STATE_PENDING_INSTALL,                   /* Since: 41 */
+       GS_APP_STATE_PENDING_REMOVE,                    /* Since: 41 */
        GS_APP_STATE_LAST  /*< skip >*/
 } GsAppState;
 
diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c
index 4de05d763..bc610e0d0 100644
--- a/src/gs-app-addon-row.c
+++ b/src/gs-app-addon-row.c
@@ -96,6 +96,14 @@ gs_app_addon_row_refresh (GsAppAddonRow *row)
                gtk_widget_set_visible (row->label, TRUE);
                gtk_label_set_label (GTK_LABEL (row->label), _("Pending"));
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+               gtk_widget_set_visible (row->label, TRUE);
+               gtk_label_set_label (GTK_LABEL (row->label), _("Pending install"));
+               break;
+       case GS_APP_STATE_PENDING_REMOVE:
+               gtk_widget_set_visible (row->label, TRUE);
+               gtk_label_set_label (GTK_LABEL (row->label), _("Pending remove"));
+               break;
        case GS_APP_STATE_UPDATABLE:
        case GS_APP_STATE_UPDATABLE_LIVE:
        case GS_APP_STATE_INSTALLED:
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index 039efc541..e3c5d0802 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -412,6 +412,14 @@ gs_app_row_actually_refresh (GsAppRow *app_row)
                gtk_widget_set_visible (priv->label, TRUE);
                gtk_label_set_label (GTK_LABEL (priv->label), _("Pending"));
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+               gtk_widget_set_visible (priv->label, TRUE);
+               gtk_label_set_label (GTK_LABEL (priv->label), _("Pending install"));
+               break;
+       case GS_APP_STATE_PENDING_REMOVE:
+               gtk_widget_set_visible (priv->label, TRUE);
+               gtk_label_set_label (GTK_LABEL (priv->label), _("Pending remove"));
+               break;
        default:
                gtk_widget_set_visible (priv->label, FALSE);
                break;
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 00b0030b0..2c954b0b9 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -381,6 +381,21 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
                gtk_label_set_label (GTK_LABEL (self->label_progress_status),
                                     _("Installing"));
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+               gtk_widget_set_visible (self->label_progress_status, TRUE);
+               if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT))
+                       gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to 
finish install"));
+               else
+                       gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending install"));
+               break;
+       case GS_APP_STATE_PENDING_REMOVE:
+               gtk_widget_set_visible (self->label_progress_status, TRUE);
+               if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT))
+                       gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Requires restart to 
finish remove"));
+               else
+                       gtk_label_set_label (GTK_LABEL (self->label_progress_status), _("Pending remove"));
+               break;
+
        default:
                gtk_widget_set_visible (self->label_progress_status, FALSE);
                break;
@@ -455,6 +470,12 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
                /* align text together with the spinner if we're showing it */
                gtk_widget_set_halign (self->box_progress2, GTK_ALIGN_START);
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+       case GS_APP_STATE_PENDING_REMOVE:
+               gtk_widget_set_halign (self->box_progress2, GTK_ALIGN_START);
+               gtk_widget_set_visible (self->spinner_remove, FALSE);
+               gtk_spinner_stop (GTK_SPINNER (self->spinner_remove));
+               break;
        default:
                gtk_widget_set_visible (self->spinner_remove, FALSE);
                gtk_spinner_stop (GTK_SPINNER (self->spinner_remove));
@@ -466,6 +487,8 @@ gs_details_page_refresh_progress (GsDetailsPage *self)
        switch (state) {
        case GS_APP_STATE_REMOVING:
        case GS_APP_STATE_INSTALLING:
+       case GS_APP_STATE_PENDING_INSTALL:
+       case GS_APP_STATE_PENDING_REMOVE:
                gtk_widget_set_visible (self->box_progress, TRUE);
                break;
        default:
@@ -1007,6 +1030,15 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
        case GS_APP_STATE_QUEUED_FOR_INSTALL:
                gtk_widget_set_visible (self->button_install, FALSE);
                break;
+       case GS_APP_STATE_PENDING_INSTALL:
+       case GS_APP_STATE_PENDING_REMOVE:
+               if (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT)) {
+                       gtk_widget_set_visible (self->button_install, TRUE);
+                       gtk_button_set_label (GTK_BUTTON (self->button_install), _("_Restart"));
+               } else {
+                       gtk_widget_set_visible (self->button_install, FALSE);
+               }
+               break;
        case GS_APP_STATE_UPDATABLE_LIVE:
                if (gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) {
                        gtk_widget_set_visible (self->button_install, TRUE);
@@ -1087,6 +1119,8 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
                case GS_APP_STATE_UNAVAILABLE:
                case GS_APP_STATE_UNKNOWN:
                case GS_APP_STATE_QUEUED_FOR_INSTALL:
+               case GS_APP_STATE_PENDING_INSTALL:
+               case GS_APP_STATE_PENDING_REMOVE:
                        gtk_widget_set_visible (self->button_remove, FALSE);
                        break;
                default:
@@ -2309,6 +2343,16 @@ gs_details_page_app_install_button_cb (GtkWidget *widget, GsDetailsPage *self)
 {
        g_autoptr(GList) addons = NULL;
 
+       switch (gs_app_get_state (self->app)) {
+       case GS_APP_STATE_PENDING_INSTALL:
+       case GS_APP_STATE_PENDING_REMOVE:
+               g_return_if_fail (gs_app_has_quirk (self->app, GS_APP_QUIRK_NEEDS_REBOOT));
+               gs_utils_invoke_reboot_async (NULL, NULL, NULL);
+               return;
+       default:
+               break;
+       }
+
        /* Mark ticked addons to be installed together with the app */
        addons = gtk_container_get_children (GTK_CONTAINER (self->list_box_addons));
        for (GList *l = addons; l; l = l->next) {


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