[gnome-settings-daemon] power: Show a modal dialog if any battery in the system has been recalled and may be dangerous



commit 52ef660a87e8c4d7b8053ae9db69009c13386669
Author: Richard Hughes <richard hughsie com>
Date:   Tue Jul 5 10:43:20 2011 +0100

    power: Show a modal dialog if any battery in the system has been recalled and may be dangerous

 ...settings-daemon.plugins.power.gschema.xml.in.in |    5 +
 plugins/power/gsd-power-manager.c                  |  141 ++++++++++++++++++++
 2 files changed, 146 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
index 52c1b0c..f2cc26e 100644
--- a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
+++ b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in.in
@@ -141,5 +141,10 @@
       <_summary>Whether to use time-based notifications</_summary>
       <_description>If time based notifications should be used. If set to false, then the percentage change is used instead, which may fix a broken ACPI BIOS.</_description>
     </key>
+    <key name="notify-perhaps-recall" type="b">
+      <default>true</default>
+      <_summary>If we should show the recalled battery warning for a broken battery</_summary>
+      <_description>If we should show the recalled battery warning for a broken battery. Set this to false only if you know your battery is okay.</_description>
+    </key>
   </schema>
 </schemalist>
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 540c50d..32b09d9 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -69,6 +69,7 @@
 #define GSD_POWER_MANAGER_NOTIFY_TIMEOUT_LONG           30 * 1000 /* ms */
 
 #define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT        5 /* seconds */
+#define GSD_POWER_MANAGER_RECALL_DELAY                  30 /* seconds */
 
 static const gchar introspection_xml[] =
 "<node>"
@@ -814,9 +815,144 @@ out:
         return device;
 }
 
+typedef struct {
+        GsdPowerManager *manager;
+        UpDevice        *device;
+} GsdPowerManagerRecallData;
+
+static void
+device_perhaps_recall_response_cb (GtkDialog *dialog,
+                                   gint response_id,
+                                   GsdPowerManagerRecallData *recall_data)
+{
+        GdkScreen *screen;
+        GtkWidget *dialog_error;
+        GError *error = NULL;
+        gboolean ret;
+        gchar *website = NULL;
+
+        /* don't show this again */
+        if (response_id == GTK_RESPONSE_CANCEL) {
+                g_settings_set_boolean (recall_data->manager->priv->settings,
+                                        "notify-perhaps-recall",
+                                        FALSE);
+                goto out;
+        }
+
+        /* visit recall website */
+        if (response_id == GTK_RESPONSE_OK) {
+
+                g_object_get (recall_data->device,
+                              "recall-url", &website,
+                              NULL);
+
+                screen = gdk_screen_get_default();
+                ret = gtk_show_uri (screen,
+                                    website,
+                                    gtk_get_current_event_time (),
+                                    &error);
+                if (!ret) {
+                        dialog_error = gtk_message_dialog_new (NULL,
+                                                               GTK_DIALOG_MODAL,
+                                                               GTK_MESSAGE_INFO,
+                                                               GTK_BUTTONS_OK,
+                                                               "Failed to show url %s",
+                                                               error->message);
+                        gtk_dialog_run (GTK_DIALOG (dialog_error));
+                        g_error_free (error);
+                }
+        }
+out:
+        gtk_widget_destroy (GTK_WIDGET (dialog));
+        g_object_unref (recall_data->device);
+        g_object_unref (recall_data->manager);
+        g_free (recall_data);
+        g_free (website);
+        return;
+}
+
+static gboolean
+device_perhaps_recall_delay_cb (gpointer user_data)
+{
+        gchar *vendor;
+        const gchar *title = NULL;
+        GString *message = NULL;
+        GtkWidget *dialog;
+        GsdPowerManagerRecallData *recall_data = (GsdPowerManagerRecallData *) user_data;
+
+        g_object_get (recall_data->device,
+                      "recall-vendor", &vendor,
+                      NULL);
+
+        /* TRANSLATORS: the battery may be recalled by it's vendor */
+        title = _("Battery may be recalled");
+        message = g_string_new (_("A battery in your computer may have been "
+                                  "recalled by %s and you may be at risk."));
+        g_string_append (message, "\n\n");
+        g_string_append (message, _("For more information visit the battery recall website."));
+        dialog = gtk_message_dialog_new_with_markup (NULL,
+                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                     GTK_MESSAGE_INFO,
+                                                     GTK_BUTTONS_CLOSE,
+                                                     "<span size='larger'><b>%s</b></span>",
+                                                     title);
+        gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+                                                    "%s", message->str);
+
+        /* TRANSLATORS: button text, visit the manufacturers recall website */
+        gtk_dialog_add_button (GTK_DIALOG (dialog), _("Visit recall website"),
+                               GTK_RESPONSE_OK);
+
+        /* TRANSLATORS: button text, do not show this bubble again */
+        gtk_dialog_add_button (GTK_DIALOG (dialog), _("Do not show me this again"),
+                               GTK_RESPONSE_CANCEL);
+
+        gtk_widget_show (dialog);
+        g_signal_connect (dialog, "response",
+                          G_CALLBACK (device_perhaps_recall_response_cb),
+                          recall_data);
+
+        g_string_free (message, TRUE);
+        g_free (vendor);
+        return FALSE;
+}
+
+static void
+device_perhaps_recall (GsdPowerManager *manager, UpDevice *device)
+{
+        gboolean ret;
+        guint timer_id;
+        GsdPowerManagerRecallData *recall_data;
+
+        /* don't show when running under GDM */
+        if (g_getenv ("RUNNING_UNDER_GDM") != NULL) {
+                g_debug ("running under gdm, so no notification");
+                return;
+        }
+
+        /* already shown, and dismissed */
+        ret = g_settings_get_boolean (manager->priv->settings,
+                                      "notify-perhaps-recall");
+        if (!ret) {
+                g_debug ("settings prevents recall notification");
+                return;
+        }
+
+        recall_data = g_new0 (GsdPowerManagerRecallData, 1);
+        recall_data->manager = g_object_ref (manager);
+        recall_data->device = g_object_ref (device);
+
+        /* delay by a few seconds so the session can load */
+        timer_id = g_timeout_add_seconds (GSD_POWER_MANAGER_RECALL_DELAY,
+                                          device_perhaps_recall_delay_cb,
+                                          recall_data);
+        g_source_set_name_by_id (timer_id, "[GsdPowerManager] perhaps-recall");
+}
+
 static void
 engine_device_add (GsdPowerManager *manager, UpDevice *device)
 {
+        gboolean recall_notice;
         GsdPowerManagerWarning warning;
         UpDeviceState state;
         UpDeviceKind kind;
@@ -832,6 +968,7 @@ engine_device_add (GsdPowerManager *manager, UpDevice *device)
         g_object_get (device,
                       "kind", &kind,
                       "state", &state,
+                      "recall-notice", &recall_notice,
                       NULL);
 
         /* add old state for transitions */
@@ -855,6 +992,10 @@ engine_device_add (GsdPowerManager *manager, UpDevice *device)
                                    "engine-state-old",
                                    GUINT_TO_POINTER(state));
         }
+
+        /* the device is recalled */
+        if (recall_notice)
+                device_perhaps_recall (manager, device);
 }
 
 static gboolean



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