[gnome-software/wip/jrocha/allow-updates-setting] Use a gsetting to set whether updates should be managed



commit 18f46443e405c32accddbc2021e0cf4133a8025c
Author: Joaquim Rocha <jrocha endlessm com>
Date:   Fri Oct 28 15:59:53 2016 +0200

    Use a gsetting to set whether updates should be managed
    
    In some use-cases we do not want GNOME Software managing the updates,
    e.g. a user's personal preference, or the use in a live image. So
    these changes introduce a "manage-updates" setting that will stop the
    check for updates and hide the Updates tab. It doesn't stop doing the
    automatic hourly refresh (but does use the "no pull" flag) in the
    background because that is not necessarily related to updates.

 data/org.gnome.software.gschema.xml |    5 +++
 src/gs-shell.c                      |   16 +++++++-
 src/gs-update-monitor.c             |   67 +++++++++++++++++++++++++++++------
 3 files changed, 75 insertions(+), 13 deletions(-)
---
diff --git a/data/org.gnome.software.gschema.xml b/data/org.gnome.software.gschema.xml
index 2f9f0f5..17cbaa7 100644
--- a/data/org.gnome.software.gschema.xml
+++ b/data/org.gnome.software.gschema.xml
@@ -15,6 +15,11 @@
       <summary>Whether to automatically refresh when on a metered connection</summary>
       <description>If enabled, GNOME Software automatically refreshes in the background even when using a 
metered connection (eventually downloading some metadata, checking for updates, etc., which may incur in 
costs for the user).</description>
     </key>
+    <key name="allow-updates" type="b">
+      <default>true</default>
+      <summary>Whether to allow updates to be present</summary>
+      <description>If enabled, GNOME Software automatically checks for updates in the background and allows 
the user to update the apps. If disabled, the mentioned actions will not happen and the updates tab will be 
disabled.</description>
+    </key>
     <key name="first-run" type="b">
       <default>true</default>
       <summary>Whether it's the very first run of GNOME Software</summary>
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 6c044b5..3e02305 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -42,6 +42,8 @@
 #include "gs-update-dialog.h"
 #include "gs-update-monitor.h"
 
+#define ALLOW_UPDATES_CONF_KEY "allow-updates"
+
 static const gchar *page_name[] = {
        "unknown",
        "overview",
@@ -67,6 +69,7 @@ typedef struct
 {
        gboolean                 ignore_primary_buttons;
        GCancellable            *cancellable;
+       GSettings               *settings;
        GsPluginLoader          *plugin_loader;
        GsShellMode              mode;
        GsShellOverview         *shell_overview;
@@ -261,6 +264,7 @@ gs_shell_change_mode (GsShell *shell,
        GsPage *new_page;
        GtkWidget *widget;
        GtkStyleContext *context;
+       gboolean allow_updates = FALSE;
 
        if (priv->ignore_primary_buttons)
                return;
@@ -289,6 +293,9 @@ gs_shell_change_mode (GsShell *shell,
        /* TRANSLATORS: this is the main window title */
        gtk_window_set_title (priv->main_window, _("Software"));
 
+       allow_updates = g_settings_get_boolean (priv->settings,
+                                               ALLOW_UPDATES_CONF_KEY);
+
        /* update main buttons according to mode */
        priv->ignore_primary_buttons = TRUE;
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_all"));
@@ -299,7 +306,7 @@ gs_shell_change_mode (GsShell *shell,
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_updates"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), mode == GS_SHELL_MODE_UPDATES);
-       gtk_widget_set_visible (widget, !gs_update_monitor_is_managed() || mode == GS_SHELL_MODE_UPDATES);
+       gtk_widget_set_visible (widget, allow_updates || mode == GS_SHELL_MODE_UPDATES);
 
        priv->ignore_primary_buttons = FALSE;
 
@@ -675,9 +682,12 @@ on_permission_changed (GPermission *permission,
         GsShell *shell = data;
        GsShellPrivate *priv = gs_shell_get_instance_private (shell);
        GtkWidget *widget;
+       gboolean allow_updates = g_settings_get_boolean (priv->settings,
+                                                        ALLOW_UPDATES_CONF_KEY);
+
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_updates"));
-       gtk_widget_set_visible (widget, !gs_update_monitor_is_managed() || priv->mode == 
GS_SHELL_MODE_UPDATES);
+       gtk_widget_set_visible (widget, allow_updates || priv->mode == GS_SHELL_MODE_UPDATES);
 }
 
 static void
@@ -1710,6 +1720,7 @@ gs_shell_dispose (GObject *object)
                g_queue_free_full (priv->back_entry_stack, (GDestroyNotify) free_back_entry);
                priv->back_entry_stack = NULL;
        }
+       g_clear_object (&priv->settings);
        g_clear_object (&priv->builder);
        g_clear_object (&priv->cancellable);
        g_clear_object (&priv->plugin_loader);
@@ -1743,6 +1754,7 @@ gs_shell_init (GsShell *shell)
        priv->back_entry_stack = g_queue_new ();
        priv->ignore_primary_buttons = FALSE;
        priv->modal_dialogs = g_ptr_array_new_with_free_func ((GDestroyNotify) gtk_widget_destroy);
+       priv->settings = g_settings_new ("org.gnome.software");
 }
 
 GsShell *
diff --git a/src/gs-update-monitor.c b/src/gs-update-monitor.c
index e47cb1e..025d1df 100644
--- a/src/gs-update-monitor.c
+++ b/src/gs-update-monitor.c
@@ -51,6 +51,15 @@ struct _GsUpdateMonitor {
 
 G_DEFINE_TYPE (GsUpdateMonitor, gs_update_monitor, G_TYPE_OBJECT)
 
+#define ALLOW_UPDATES_CONF_KEY "allow-updates"
+
+static gboolean
+should_allow_updates (GsUpdateMonitor *monitor)
+{
+       return g_settings_get_boolean (monitor->settings,
+                                      ALLOW_UPDATES_CONF_KEY);
+}
+
 static gboolean
 reenable_offline_update_notification (gpointer data)
 {
@@ -320,7 +329,8 @@ refresh_cache_finished_cb (GObject *object,
                        g_warning ("failed to refresh the cache: %s", error->message);
                return;
        }
-       get_updates (monitor);
+       if (should_allow_updates (monitor))
+               get_updates (monitor);
 }
 
 typedef enum {
@@ -403,7 +413,8 @@ check_updates (GsUpdateMonitor *monitor)
        g_settings_set (monitor->settings, "check-timestamp", "x",
                        g_date_time_to_unix (now_refreshed));
 
-       if (g_settings_get_boolean (monitor->settings, "download-updates")) {
+       if (should_allow_updates (monitor) &&
+           g_settings_get_boolean (monitor->settings, "download-updates")) {
                g_debug ("Refreshing for metadata and payload");
                refresh_flags |= GS_PLUGIN_REFRESH_FLAGS_PAYLOAD;
        } else {
@@ -440,6 +451,27 @@ check_thrice_daily_cb (gpointer data)
        return G_SOURCE_CONTINUE;
 }
 
+static void
+stop_upgrades_check (GsUpdateMonitor *monitor)
+{
+       if (monitor->check_daily_id == 0)
+               return;
+
+       g_source_remove (monitor->check_hourly_id);
+       monitor->check_hourly_id = 0;
+}
+
+static void
+start_upgrades_check (GsUpdateMonitor *monitor)
+{
+       stop_upgrades_check (monitor);
+       get_upgrades (monitor);
+
+       monitor->check_daily_id = g_timeout_add_seconds (3 * 86400,
+                                                        check_thrice_daily_cb,
+                                                        monitor);
+}
+
 static gboolean
 check_updates_on_startup_cb (gpointer data)
 {
@@ -447,12 +479,12 @@ check_updates_on_startup_cb (gpointer data)
 
        g_debug ("First hourly updates check");
        check_updates (monitor);
-       get_upgrades (monitor);
 
-       monitor->check_hourly_id =
-               g_timeout_add_seconds (3600, check_hourly_cb, monitor);
-       monitor->check_daily_id =
-               g_timeout_add_seconds (3 * 86400, check_thrice_daily_cb, monitor);
+       monitor->check_hourly_id = g_timeout_add_seconds (3600, check_hourly_cb,
+                                                         monitor);
+
+       if (should_allow_updates (monitor))
+               start_upgrades_check (monitor);
 
        monitor->check_startup_id = 0;
        return G_SOURCE_REMOVE;
@@ -637,6 +669,19 @@ gs_update_monitor_show_error (GsUpdateMonitor *monitor, GsShell *shell)
 }
 
 static void
+settings_changed_cb (GsUpdateMonitor *self,
+                    const gchar *key,
+                    gpointer data)
+{
+       if (g_strcmp0 (key, ALLOW_UPDATES_CONF_KEY) == 0) {
+               if (should_allow_updates)
+                       start_upgrades_check (self);
+               else
+                       stop_upgrades_check (self);
+       }
+}
+
+static void
 gs_update_monitor_init (GsUpdateMonitor *monitor)
 {
        g_autoptr(GError) error = NULL;
@@ -673,6 +718,9 @@ gs_update_monitor_init (GsUpdateMonitor *monitor)
        } else {
                g_warning ("failed to connect to upower: %s", error->message);
        }
+
+       g_signal_connect_swapped (monitor->settings, "changed",
+                                 G_CALLBACK (settings_changed_cb), monitor);
 }
 
 static void
@@ -688,10 +736,6 @@ gs_update_monitor_dispose (GObject *object)
                g_source_remove (monitor->check_hourly_id);
                monitor->check_hourly_id = 0;
        }
-       if (monitor->check_daily_id != 0) {
-               g_source_remove (monitor->check_daily_id);
-               monitor->check_daily_id = 0;
-       }
        if (monitor->check_startup_id != 0) {
                g_source_remove (monitor->check_startup_id);
                monitor->check_startup_id = 0;
@@ -716,6 +760,7 @@ gs_update_monitor_dispose (GObject *object)
                                                      monitor);
                monitor->plugin_loader = NULL;
        }
+       stop_upgrades_check (monitor);
        g_clear_object (&monitor->settings);
        g_clear_object (&monitor->proxy_upower);
 


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