Mercurial > projects > package-update-indicator
diff pui-backend.c @ 5:a4020e99e550
Do not check for updates if the battery is low
author | Guido Berhoerster <guido+pui@berhoerster.name> |
---|---|
date | Sun, 17 Jun 2018 17:05:16 +0200 |
parents | 3d72ca76538d |
children | 2477a6151087 |
line wrap: on
line diff
--- a/pui-backend.c Sun Jun 17 11:05:28 2018 +0200 +++ b/pui-backend.c Sun Jun 17 17:05:16 2018 +0200 @@ -27,19 +27,25 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <upower.h> #include <utime.h> #include "pui-common.h" #include "pui-backend.h" #include "pui-get-updates.h" +#define LOW_BATTERY_THRESHOLD 10.0 + struct _PuiBackend { GObject parent_instance; PkControl *pk_control; GCancellable *cancellable; + UpClient *up_client; + UpDevice *up_device; gint64 last_check; PkNetworkEnum network_state; gboolean inhibited; + gboolean is_battery_low; guint periodic_check_id; guint refresh_interval; gboolean use_mobile_connection; @@ -190,7 +196,8 @@ inhibited = ((self->network_state == PK_NETWORK_ENUM_OFFLINE) || (!self->use_mobile_connection && - (self->network_state == PK_NETWORK_ENUM_MOBILE))); + (self->network_state == PK_NETWORK_ENUM_MOBILE)) || + self->is_battery_low); if (self->inhibited == inhibited) { return; } @@ -293,6 +300,14 @@ g_clear_object(&self->pk_control); } + if (self->up_device != NULL) { + g_clear_object(&self->up_device); + } + + if (self->up_client != NULL) { + g_clear_object(&self->up_client); + } + G_OBJECT_CLASS(pui_backend_parent_class)->dispose(object); } @@ -343,7 +358,13 @@ pui_backend_init(PuiBackend *self) { self->pk_control = pk_control_new(); + self->inhibited = TRUE; + + self->up_client = up_client_new(); + if (self->up_client) { + self->up_device = up_client_get_display_device(self->up_client); + } } static void @@ -390,6 +411,26 @@ } static void +on_notify_device_charge_percentage(UpDevice *device, GParamSpec *pspec, + gpointer user_data) +{ + PuiBackend *self = user_data; + UpDeviceKind kind; + gdouble percentage; + + g_object_get(device, "kind", &kind, "percentage", &percentage, NULL); + if ((kind != UP_DEVICE_KIND_BATTERY) && (kind != UP_DEVICE_KIND_UPS)) { + return; + } + g_debug("charge percentage changed: %.0f%%\n", percentage); + if ((self->is_battery_low && (percentage > LOW_BATTERY_THRESHOLD)) || + (!self->is_battery_low && (percentage < LOW_BATTERY_THRESHOLD))) { + self->is_battery_low = !self->is_battery_low; + check_inhibit(self); + } +} + +static void on_notify_network_state(PkControl *pk_control, GParamSpec *pspec, gpointer user_data) { @@ -451,11 +492,28 @@ { PuiBackend *self = PUI_BACKEND(initable); GTask *task = G_TASK(result); + UpDeviceKind kind; + gdouble percentage; if (!g_task_propagate_boolean(task, errorp)) { return (FALSE); } + if (self->up_device != NULL) { + /* get the kind of device and charge percentage */ + g_object_get(self->up_device, "kind", &kind, "percentage", + &percentage, NULL); + if ((kind == UP_DEVICE_KIND_BATTERY) || + (kind == UP_DEVICE_KIND_UPS)) { + self->is_battery_low = + (percentage < LOW_BATTERY_THRESHOLD); + } + + /* get notification if the charge percentage changes */ + g_signal_connect(self->up_device, "notify::percentage", + G_CALLBACK(on_notify_device_charge_percentage), self); + } + /* get notification when the network state changes */ g_signal_connect(self->pk_control, "notify::network-state", G_CALLBACK(on_notify_network_state), self);