[gnome-software] Don't download updates when low on power



commit 9fa83b37a951768c558fcfb0ec8bea0a962e5a48
Author: Richard Hughes <richard hughsie com>
Date:   Mon Sep 12 10:02:32 2016 +0100

    Don't download updates when low on power
    
    Resolves: https://bugzilla.gnome.org/show_bug.cgi?id=756113

 src/gs-update-monitor.c |   55 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 55 insertions(+), 0 deletions(-)
---
diff --git a/src/gs-update-monitor.c b/src/gs-update-monitor.c
index 016341a..f3123e7 100644
--- a/src/gs-update-monitor.c
+++ b/src/gs-update-monitor.c
@@ -38,6 +38,7 @@ struct _GsUpdateMonitor {
        GCancellable    *cancellable;
        GSettings       *settings;
        GsPluginLoader  *plugin_loader;
+       GDBusProxy      *proxy_upower;
        GError          *last_offline_error;
 
        guint            cleanup_notifications_id;      /* at startup */
@@ -322,6 +323,16 @@ refresh_cache_finished_cb (GObject *object,
        get_updates (monitor);
 }
 
+typedef enum {
+       UP_DEVICE_LEVEL_UNKNOWN,
+       UP_DEVICE_LEVEL_NONE,
+       UP_DEVICE_LEVEL_DISCHARGING,
+       UP_DEVICE_LEVEL_LOW,
+       UP_DEVICE_LEVEL_CRITICAL,
+       UP_DEVICE_LEVEL_ACTION,
+       UP_DEVICE_LEVEL_LAST
+} UpDeviceLevel;
+
 static void
 check_updates (GsUpdateMonitor *monitor)
 {
@@ -338,6 +349,22 @@ check_updates (GsUpdateMonitor *monitor)
            g_network_monitor_get_network_metered (monitor->network_monitor))
                return;
 
+       /* never refresh when the battery is low */
+       if (monitor->proxy_upower != NULL) {
+               g_autoptr(GVariant) val = NULL;
+               val = g_dbus_proxy_get_cached_property (monitor->proxy_upower,
+                                                       "WarningLevel");
+               if (val != NULL) {
+                       guint32 level = g_variant_get_uint32 (val);
+                       if (level >= UP_DEVICE_LEVEL_LOW) {
+                               g_debug ("not getting updates on low power");
+                               return;
+                       }
+               }
+       } else {
+               g_debug ("no UPower support, so not doing power level checks");
+       }
+
        g_settings_get (monitor->settings, "check-timestamp", "x", &tmp);
        last_refreshed = g_date_time_new_from_unix_local (tmp);
        if (last_refreshed != NULL) {
@@ -422,6 +449,15 @@ check_updates_on_startup_cb (gpointer data)
 }
 
 static void
+check_updates_upower_changed_cb (GDBusProxy *proxy,
+                                GParamSpec *pspec,
+                                GsUpdateMonitor *monitor)
+{
+       g_debug ("upower changed updates check");
+       check_updates (monitor);
+}
+
+static void
 notify_network_state_cb (GNetworkMonitor *network_monitor,
                         gboolean active,
                         GsUpdateMonitor *monitor)
@@ -593,6 +629,7 @@ gs_update_monitor_show_error (GsUpdateMonitor *monitor, GsShell *shell)
 static void
 gs_update_monitor_init (GsUpdateMonitor *monitor)
 {
+       g_autoptr(GError) error = NULL;
        monitor->settings = g_settings_new ("org.gnome.software");
 
        /* cleanup at startup */
@@ -609,6 +646,23 @@ gs_update_monitor_init (GsUpdateMonitor *monitor)
                g_signal_connect (monitor->network_monitor, "network-changed",
                                  G_CALLBACK (notify_network_state_cb), monitor);
        }
+
+       /* connect to UPower to get the system power state */
+       monitor->proxy_upower = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                       G_DBUS_PROXY_FLAGS_NONE,
+                                       NULL,
+                                       "org.freedesktop.UPower",
+                                       "/org/freedesktop/UPower/devices/DisplayDevice",
+                                       "org.freedesktop.UPower.Device",
+                                       NULL,
+                                       &error);
+       if (monitor->proxy_upower != NULL) {
+               g_signal_connect (monitor->proxy_upower, "notify",
+                                 G_CALLBACK (check_updates_upower_changed_cb),
+                                 monitor);
+       } else {
+               g_warning ("failed to connect to upower: %s", error->message);
+       }
 }
 
 static void
@@ -653,6 +707,7 @@ gs_update_monitor_dispose (GObject *object)
                monitor->plugin_loader = NULL;
        }
        g_clear_object (&monitor->settings);
+       g_clear_object (&monitor->proxy_upower);
 
        G_OBJECT_CLASS (gs_update_monitor_parent_class)->dispose (object);
 }


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