3
#include <polkit/polkit.h>
9
#include "whoopsie-preferences/libwhoopsie-preferences.h"
11
#define POL_PATH "com.ubuntu.whoopsiepreferences.change"
12
#define PRIVACY_URL "http://www.ubuntu.com/aboutus/privacypolicy?crashdb"
13
#define SYSTEM_ERRORS_URL "https://errors.ubuntu.com/user"
15
#define WHOOPSIE_DAISY_TYPE_PREFERENCES (whoopsie_daisy_preferences_get_type())
16
#define WHOOPSIE_DAISY_PREFERENCES(obj) \
17
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
18
WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferences))
19
#define WHOOPSIE_DAISY_PREFERENCES_PRIVATE(o) \
20
(G_TYPE_INSTANCE_GET_PRIVATE ((o), WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferencesPrivate))
22
GType whoopsie_daisy_preferences_get_type (void) G_GNUC_CONST;
24
typedef struct _WhoopsieDaisyPreferences WhoopsieDaisyPreferences;
25
typedef struct _WhoopsieDaisyPreferencesClass WhoopsieDaisyPreferencesClass;
26
typedef struct _WhoopsieDaisyPreferencesPrivate WhoopsieDaisyPreferencesPrivate;
28
struct _WhoopsieDaisyPreferencesPrivate
31
GPermission* permission;
32
WhoopsiePreferences* proxy;
35
struct _WhoopsieDaisyPreferences
38
WhoopsieDaisyPreferencesPrivate* priv;
41
struct _WhoopsieDaisyPreferencesClass
43
GtkBoxClass parent_class;
46
G_DEFINE_TYPE (WhoopsieDaisyPreferences, whoopsie_daisy_preferences, GTK_TYPE_BOX)
49
whoopsie_daisy_preferences_dispose (GObject* object)
51
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (object)->priv;
54
g_object_unref (priv->builder);
57
if (priv->permission) {
58
g_object_unref (priv->permission);
59
priv->permission = NULL;
62
g_object_unref (priv->proxy);
68
whoopsie_daisy_preferences_class_init (WhoopsieDaisyPreferencesClass *klass)
70
GObjectClass *object_class = G_OBJECT_CLASS (klass);
71
g_type_class_add_private (klass, sizeof (WhoopsieDaisyPreferencesPrivate));
72
object_class->dispose = whoopsie_daisy_preferences_dispose;
76
on_privacy_policy_clicked (GtkWidget* button, gpointer user_data)
78
if (system ("xdg-open " PRIVACY_URL) < 0)
79
g_warning ("Error opening URL.\n");
83
on_show_previous_reports_clicked (GtkWidget* button, gpointer user_data)
85
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
87
gchar* identifier = NULL;
88
gchar* command = NULL;
90
whoopsie_preferences_call_get_identifier_sync (priv->proxy, &identifier, NULL, &error);
93
asprintf (&command, "xdg-open " SYSTEM_ERRORS_URL "/%s", identifier);
94
if (system (command) < 0)
95
g_warning ("Error opening URL.\n");
97
g_printerr ("Error getting identifier: %s\n", error->message);
103
on_permission_changed (GPermission* permission, GParamSpec* pspec, gpointer data)
106
GtkWidget* error_reports_box = NULL;
107
GtkWidget* metrics_reports_box = NULL;
108
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (data)->priv;
110
error_reports_box = GTK_WIDGET (gtk_builder_get_object (
111
priv->builder, "error_reports_box"));
112
metrics_reports_box = GTK_WIDGET (gtk_builder_get_object (
113
priv->builder, "metrics_reports_box"));
115
allowed = g_permission_get_allowed (permission);
116
gtk_widget_set_sensitive(error_reports_box, allowed);
117
gtk_widget_set_sensitive(metrics_reports_box, allowed);
118
gtk_container_foreach (GTK_CONTAINER (error_reports_box), (GtkCallback)gtk_widget_set_sensitive, allowed);
119
gtk_container_foreach (GTK_CONTAINER (metrics_reports_box), (GtkCallback)gtk_widget_set_sensitive, allowed);
123
on_submit_error_reports_checked (GtkToggleButton* button, gpointer user_data)
125
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
126
GError* error = NULL;
128
whoopsie_preferences_call_set_report_crashes_sync (priv->proxy,
129
gtk_toggle_button_get_active (button), NULL, &error);
131
g_printerr ("Error setting crash reporting: %s\n", error->message);
132
g_error_free (error);
137
on_submit_metrics_reports_checked (GtkToggleButton* button, gpointer user_data)
139
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
140
GError* error = NULL;
142
whoopsie_preferences_call_set_report_metrics_sync (priv->proxy,
143
gtk_toggle_button_get_active (button), NULL, &error);
145
g_printerr ("Error setting metrics reporting: %s\n", error->message);
146
g_error_free (error);
151
on_properties_changed (WhoopsiePreferences* interface,
152
GVariant* changed_properties,
153
const gchar* const* invalidated_properties,
156
WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
157
gboolean report_errors, report_metrics;
158
GtkWidget* submit_error_reports = NULL;
159
GtkWidget* submit_metrics_reports = NULL;
161
submit_error_reports = GTK_WIDGET (
162
gtk_builder_get_object (priv->builder, "submit_error_reports"));
163
submit_metrics_reports = GTK_WIDGET (
164
gtk_builder_get_object (priv->builder, "submit_metrics_reports"));
166
report_errors = whoopsie_preferences_get_report_crashes (interface);
167
report_metrics = whoopsie_preferences_get_report_metrics (interface);
169
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (submit_error_reports), report_errors);
170
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (submit_metrics_reports), report_metrics);
174
whoopsie_daisy_preferences_setup_dbus (WhoopsieDaisyPreferences *self, GError *error)
176
WhoopsieDaisyPreferencesPrivate* priv = self->priv;
178
priv->proxy = whoopsie_preferences_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
179
G_DBUS_PROXY_FLAGS_NONE,
180
"com.ubuntu.WhoopsiePreferences",
181
"/com/ubuntu/WhoopsiePreferences",
186
g_signal_connect (priv->proxy, "g-properties-changed",
187
G_CALLBACK (on_properties_changed), self);
188
on_properties_changed (priv->proxy, NULL, NULL, self);
191
whoopsie_daisy_preferences_init (WhoopsieDaisyPreferences *self)
193
GError *error = NULL;
194
GtkWidget* privacy_page = NULL;
195
GtkWidget* unlock_align = NULL;
196
GtkWidget* unlock_button = NULL;
197
GtkWidget* submit_error_reports = NULL;
198
GtkWidget* submit_metrics_reports = NULL;
199
GtkWidget* privacy_policy = NULL;
200
GtkWidget* show_previous_reports = NULL;
201
WhoopsieDaisyPreferencesPrivate* priv;
202
priv = self->priv = WHOOPSIE_DAISY_PREFERENCES_PRIVATE (self);
205
priv->builder = gtk_builder_new ();
206
gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
207
objects = g_strsplit ("privacy_page_box", ":", -1);
208
gtk_builder_add_objects_from_file(priv->builder, UI_DIR "/whoopsie.ui", objects, &error);
209
g_strfreev (objects);
211
g_warning ("Could not load interface file: %s", error->message);
212
g_error_free (error);
215
submit_error_reports = GTK_WIDGET (
216
gtk_builder_get_object (priv->builder, "submit_error_reports"));
217
submit_metrics_reports = GTK_WIDGET (
218
gtk_builder_get_object (priv->builder, "submit_metrics_reports"));
219
gtk_widget_hide (submit_metrics_reports);
220
privacy_page = GTK_WIDGET (
221
gtk_builder_get_object (priv->builder, "privacy_page_box"));
222
unlock_align = GTK_WIDGET (
223
gtk_builder_get_object (priv->builder, "unlock_alignment"));
224
privacy_policy = GTK_WIDGET (
225
gtk_builder_get_object (priv->builder, "privacy_policy"));
226
show_previous_reports = GTK_WIDGET (
227
gtk_builder_get_object (priv->builder, "show_previous_reports"));
229
gtk_box_pack_start (GTK_BOX (self), privacy_page, TRUE, TRUE, 0);
230
g_object_set (self, "valign", GTK_ALIGN_START, NULL);
232
priv->permission = polkit_permission_new_sync (POL_PATH, NULL, NULL, &error);
233
if (!priv->permission) {
234
g_warning ("Could not acquire permission: %s", error->message);
235
g_error_free (error);
238
unlock_button = gtk_lock_button_new (priv->permission);
239
gtk_container_add (GTK_CONTAINER (unlock_align), GTK_WIDGET (unlock_button));
240
gtk_widget_show (unlock_button);
242
g_signal_connect (priv->permission, "notify", G_CALLBACK (on_permission_changed), self);
243
on_permission_changed (priv->permission, NULL, self);
245
whoopsie_daisy_preferences_setup_dbus (self, error);
247
g_warning ("Could not set up DBus connection: %s", error->message);
248
g_error_free (error);
251
g_signal_connect (submit_error_reports, "toggled",
252
G_CALLBACK (on_submit_error_reports_checked), self);
253
g_signal_connect (submit_metrics_reports, "toggled",
254
G_CALLBACK (on_submit_metrics_reports_checked), self);
255
g_signal_connect (privacy_policy, "clicked",
256
G_CALLBACK (on_privacy_policy_clicked), self);
257
g_signal_connect (show_previous_reports, "clicked",
258
G_CALLBACK (on_show_previous_reports_clicked), self);
262
whoopsie_daisy_preferences_new (void)
264
return g_object_new (WHOOPSIE_DAISY_TYPE_PREFERENCES, NULL);