[gnome-settings-daemon/rhel/account-and-subman-plugins: 23/23] subman: Clean up notification behavior




commit 0e8ebc32ede113e81c8b98fbc5c133fc5cf2aaa2
Author: Ray Strode <rstrode redhat com>
Date:   Sun Jan 24 12:41:20 2021 -0500

    subman: Clean up notification behavior
    
    Notifications were only displayed for some status transitions.
    
    This commit introduces some booleans based on the old and new
    statuses to make the code clearer and to make it easier to hit
    all the cases.

 plugins/subman/gsd-subman-common.h        |   1 +
 plugins/subman/gsd-subscription-manager.c | 141 +++++++++++++++++++++++++-----
 2 files changed, 120 insertions(+), 22 deletions(-)
---
diff --git a/plugins/subman/gsd-subman-common.h b/plugins/subman/gsd-subman-common.h
index 88226564..9397dbe4 100644
--- a/plugins/subman/gsd-subman-common.h
+++ b/plugins/subman/gsd-subman-common.h
@@ -25,6 +25,7 @@
 G_BEGIN_DECLS
 
 typedef enum {
+       GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ = -1,
        GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN,
        GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID,
        GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID,
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
index 6d80bfa9..aaccbbc6 100644
--- a/plugins/subman/gsd-subscription-manager.c
+++ b/plugins/subman/gsd-subscription-manager.c
@@ -270,6 +270,7 @@ _client_subscription_status_update (GsdSubscriptionManager *manager, GError **er
 
        /* save old value */
        priv->subscription_status_last = priv->subscription_status;
+
        if (!_client_installed_products_update (manager, error))
                goto out;
 
@@ -512,55 +513,149 @@ static void
 _client_maybe__show_notification (GsdSubscriptionManager *manager)
 {
        GsdSubscriptionManagerPrivate *priv = manager->priv;
+       gboolean was_read, was_registered, had_subscriptions, needed_subscriptions;
+       gboolean is_read, is_registered, has_subscriptions, needs_subscriptions;
+
+       switch (priv->subscription_status_last) {
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ:
+                       was_read = FALSE;
+                       was_registered = FALSE;
+                       needed_subscriptions = TRUE;
+                       had_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN:
+                       was_read = TRUE;
+                       was_registered = FALSE;
+                       needed_subscriptions = TRUE;
+                       had_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID:
+                       was_read = TRUE;
+                       was_registered = TRUE;
+                       needed_subscriptions = TRUE;
+                       had_subscriptions = TRUE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID:
+                       was_read = TRUE;
+                       was_registered = TRUE;
+                       needed_subscriptions = TRUE;
+                       had_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED:
+                       was_read = TRUE;
+                       was_registered = TRUE;
+                       needed_subscriptions = FALSE;
+                       had_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID:
+                       was_read = TRUE;
+                       was_registered = TRUE;
+                       needed_subscriptions = TRUE;
+                       had_subscriptions = FALSE;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS:
+                       was_read = TRUE;
+                       was_registered = FALSE;
+                       needed_subscriptions = FALSE;
+                       had_subscriptions = FALSE;
+                       break;
+       }
+
+       switch (priv->subscription_status) {
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ:
+                       is_read = FALSE;
+                       is_registered = FALSE;
+                       needs_subscriptions = TRUE;
+                       has_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN:
+                       is_read = TRUE;
+                       is_registered = FALSE;
+                       needs_subscriptions = TRUE;
+                       has_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID:
+                       is_read = TRUE;
+                       is_registered = TRUE;
+                       needs_subscriptions = TRUE;
+                       has_subscriptions = TRUE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID:
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID:
+                       is_read = TRUE;
+                       is_registered = TRUE;
+                       needs_subscriptions = TRUE;
+                       has_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED:
+                       is_read = TRUE;
+                       is_registered = TRUE;
+                       needs_subscriptions = FALSE;
+                       has_subscriptions = FALSE;
+                       break;
+               case GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS:
+                       is_read = TRUE;
+                       is_registered = FALSE;
+                       needs_subscriptions = FALSE;
+                       has_subscriptions = FALSE;
+                       break;
+       }
 
        /* startup */
-       if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN &&
-           priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) {
+       if (!was_read && is_read && priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) {
                _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED);
                return;
        }
 
        /* something changed */
-       if (priv->subscription_status_last != priv->subscription_status) {
+       if (was_read && is_read && priv->subscription_status_last != priv->subscription_status) {
                g_debug ("transisition from subscription status '%s' to '%s'",
                         gsd_subman_subscription_status_to_string (priv->subscription_status_last),
                         gsd_subman_subscription_status_to_string (priv->subscription_status));
 
-               /* needs registration */
-               if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID &&
-                   priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID) {
-                       _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED);
+               /* needs subscription */
+               if (is_registered && needs_subscriptions && !has_subscriptions) {
+                       _show_notification (manager, _NOTIFY_EXPIRED);
                        return;
                }
 
                /* was unregistered */
-               if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID &&
-                   priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN) {
+               if (was_registered && !is_registered) {
                        _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED);
                        return;
                }
 
-               /* registered */
-               if (priv->subscription_status_last == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN &&
-                   priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID &&
-                   g_timer_elapsed (priv->timer_last_notified, NULL) > 60) {
-                       _show_notification (manager, _NOTIFY_REGISTERED);
-                       return;
+               /* just registered */
+               if (!was_registered && is_registered) {
+                       if (!needs_subscriptions || has_subscriptions) {
+                               _show_notification (manager, _NOTIFY_REGISTERED);
+                               return;
+                       }
+               }
+
+               /* subscriptions changed */
+               if (was_registered && is_registered) {
+                       /* subscribed */
+                       if (!had_subscriptions &&
+                           needs_subscriptions && has_subscriptions) {
+                               _show_notification (manager, _NOTIFY_REGISTERED);
+                               return;
+                       }
+
+                       /* simple content access enabled */
+                       if (needed_subscriptions && !had_subscriptions && !needs_subscriptions) {
+                               _show_notification (manager, _NOTIFY_REGISTERED);
+                               return;
+                       }
                }
        }
 
        /* nag again */
-       if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN &&
+       if (!is_registered &&
            g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) {
                _show_notification (manager, _NOTIFY_REGISTRATION_REQUIRED);
                return;
        }
-       if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID &&
-           g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) {
-               _show_notification (manager, _NOTIFY_EXPIRED);
-               return;
-       }
-       if (priv->subscription_status == GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID &&
+       if (is_registered && !has_subscriptions && needs_subscriptions &&
            g_timer_elapsed (priv->timer_last_notified, NULL) > 60 * 60 * 24) {
                _show_notification (manager, _NOTIFY_EXPIRED);
                return;
@@ -941,6 +1036,8 @@ gsd_subscription_manager_init (GsdSubscriptionManager *manager)
 
        priv->installed_products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free);
        priv->timer_last_notified = g_timer_new ();
+       priv->subscription_status = GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ;
+       priv->subscription_status_last = GSD_SUBMAN_SUBSCRIPTION_STATUS_NOT_READ;
 
        /* expired */
        priv->notification_expired =


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