[gnome-control-center/uajain/parental-control-integration: 3/3] user-accounts: Add a launcher for parental controls app
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/uajain/parental-control-integration: 3/3] user-accounts: Add a launcher for parental controls app
- Date: Wed, 17 Jun 2020 11:57:08 +0000 (UTC)
commit cd391b494233e04fa6a44b4c211bbfee29e29a10
Author: Umang Jain <mailumangjain gmail com>
Date: Thu Mar 26 14:20:44 2020 +0530
user-accounts: Add a launcher for parental controls app
malcontent ships malcontent-control[1] which is the user interface
to interact with various parental-control settings. Add a launcher
as per the design mockups[2] to launch malcontent-control.
[1]: https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/master/README.md
[2]: https://gitlab.gnome.org/Teams/Design/settings-mockups/blob/master/users/users.png
panels/user-accounts/cc-user-panel.c | 105 +++++++++++++++++++++++++++++++++-
panels/user-accounts/cc-user-panel.ui | 45 +++++++++++++++
panels/user-accounts/meson.build | 4 ++
3 files changed, 153 insertions(+), 1 deletion(-)
---
diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
index 6ef8b3635..0ab7062b9 100644
--- a/panels/user-accounts/cc-user-panel.c
+++ b/panels/user-accounts/cc-user-panel.c
@@ -39,6 +39,10 @@
#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libgnome-desktop/gnome-languages.h>
+#ifdef HAVE_MALCONTENT
+#include <libmalcontent/malcontent.h>
+#endif
+
#include "cc-add-user-dialog.h"
#include "cc-avatar-chooser.h"
#include "cc-carousel.h"
@@ -87,6 +91,11 @@ struct _CcUserPanel {
GtkBox *no_users_box;
GtkRevealer *notification_revealer;
GtkLabel *password_button_label;
+#ifdef HAVE_MALCONTENT
+ GtkLabel *parental_controls_button_label;
+ GtkImage *parental_control_go_next;
+ GtkListBoxRow *parental_controls_row;
+#endif
GtkListBoxRow *password_row;
CcPermissionInfobar *permission_infobar;
GtkButton *remove_user_button;
@@ -291,6 +300,7 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
CcCarouselItem *item = NULL;
GtkSettings *settings;
gboolean animations;
+ guint users_count;
settings = gtk_widget_get_settings (GTK_WIDGET (self->carousel));
@@ -301,7 +311,8 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
self->other_accounts = 0;
list = act_user_manager_list_users (self->um);
- g_debug ("Got %d users\n", g_slist_length (list));
+ users_count = g_slist_length (list);
+ g_debug ("Got %d users\n", users_count);
list = g_slist_sort (list, (GCompareFunc) sort_users);
for (l = list; l; l = l->next) {
@@ -321,6 +332,10 @@ reload_users (CcUserPanel *self, ActUser *selected_user)
cc_carousel_select_item (self->carousel, item);
g_object_set (settings, "gtk-enable-animations", animations, NULL);
+#ifdef HAVE_MALCONTENT
+ /* Parental Controls row not to be shown for single user setups. */
+ gtk_widget_set_visible (GTK_WIDGET (self->parental_controls_row), users_count > 1);
+#endif
}
static gint
@@ -796,6 +811,41 @@ get_autologin_possible (ActUser *user)
static void on_permission_changed (CcUserPanel *self);
static void full_name_edit_button_toggled (CcUserPanel *self);
+#ifdef HAVE_MALCONTENT
+static gboolean
+is_parental_controls_enabled_for_user (ActUser *user)
+{
+ g_autoptr(MctManager) manager = NULL;
+ g_autoptr(MctAppFilter) app_filter = NULL;
+ g_autoptr(GDBusConnection) system_bus = NULL;
+ g_autoptr(GError) error = NULL;
+
+ /* FIXME: should become asynchronous */
+ system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (system_bus == NULL) {
+ g_warning ("Error getting system bus while trying to show user details: %s", error->message);
+ return FALSE;
+ }
+
+ manager = mct_manager_new (system_bus);
+ app_filter = mct_manager_get_app_filter (manager,
+ act_user_get_uid (user),
+ MCT_GET_APP_FILTER_FLAGS_NONE,
+ NULL,
+ &error);
+ if (error) {
+ if (!g_error_matches (error, MCT_MANAGER_ERROR, MCT_MANAGER_ERROR_DISABLED))
+ g_warning ("Error retrieving app filter for user %s: %s",
+ act_user_get_user_name (user),
+ error->message);
+
+ return FALSE;
+ }
+
+ return mct_app_filter_is_enabled (app_filter);
+}
+#endif
+
static void
show_user (ActUser *user, CcUserPanel *self)
{
@@ -877,6 +927,24 @@ show_user (ActUser *user, CcUserPanel *self)
show = act_user_is_local_account (user);
gtk_widget_set_visible (GTK_WIDGET (self->autologin_row), show);
+#ifdef HAVE_MALCONTENT
+ /* Parental Controls: Unavailable if user is admin */
+ if (act_user_get_account_type (user) == ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
+ gtk_widget_hide (GTK_WIDGET (self->parental_control_go_next));
+ /* TRANSLATORS: Status of Parental Controls setup */
+ gtk_label_set_text (self->parental_controls_button_label, _("Unavailable"));
+ } else {
+ if (is_parental_controls_enabled_for_user (user))
+ /* TRANSLATORS: Status of Parental Controls setup */
+ gtk_label_set_text (self->parental_controls_button_label, _("Enabled"));
+ else
+ /* TRANSLATORS: Status of Parental Controls setup */
+ gtk_label_set_text (self->parental_controls_button_label, _("Disabled"));
+
+ gtk_widget_show (GTK_WIDGET (self->parental_control_go_next));
+ }
+#endif
+
/* Language: do not show for current user */
show = act_user_get_uid (user) != getuid();
gtk_widget_set_visible (GTK_WIDGET (self->language_row), show);
@@ -1134,6 +1202,22 @@ show_history (CcUserPanel *self)
gtk_widget_destroy (GTK_WIDGET (dialog));
}
+#ifdef HAVE_MALCONTENT
+static void
+spawn_malcontent_control (CcUserPanel *self)
+{
+ ActUser *user;
+
+ user = get_selected_user (self);
+
+ /* no-op if the user is administrator */
+ if (act_user_get_account_type (user) != ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR) {
+ const gchar *argv[] = { "malcontent-control", NULL };
+ g_spawn_async (NULL, (char **)argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
+ }
+}
+#endif
+
static void
activate_row (GtkListBox *box, GtkListBoxRow *row, CcUserPanel *self)
{
@@ -1149,6 +1233,12 @@ activate_row (GtkListBox *box, GtkListBoxRow *row, CcUserPanel *self)
} else if (row == self->last_login_row) {
show_history (self);
}
+
+#ifdef HAVE_MALCONTENT
+ if (row == self->parental_controls_row) {
+ spawn_malcontent_control (self);
+ }
+#endif
}
static void
@@ -1343,6 +1433,10 @@ on_permission_changed (CcUserPanel *self)
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), TRUE);
remove_unlock_tooltip (GTK_WIDGET (self->last_login_row));
+#ifdef HAVE_MALCONTENT
+ gtk_widget_set_sensitive (GTK_WIDGET (self->parental_controls_row), TRUE);
+ remove_unlock_tooltip (GTK_WIDGET (self->parental_controls_row));
+#endif
}
else {
gtk_stack_set_visible_child (self->user_icon_stack, GTK_WIDGET (self->user_icon_image));
@@ -1358,6 +1452,10 @@ on_permission_changed (CcUserPanel *self)
gtk_widget_set_sensitive (GTK_WIDGET (self->last_login_row), FALSE);
add_unlock_tooltip (GTK_WIDGET (self->last_login_row));
+#ifdef HAVE_MALCONTENT
+ gtk_widget_set_sensitive (GTK_WIDGET (self->parental_controls_row), FALSE);
+ add_unlock_tooltip (GTK_WIDGET (self->parental_controls_row));
+#endif
}
}
@@ -1534,6 +1632,11 @@ cc_user_panel_class_init (CcUserPanelClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, last_login_row);
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, no_users_box);
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, notification_revealer);
+#ifdef HAVE_MALCONTENT
+ gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_controls_button_label);
+ gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_control_go_next);
+ gtk_widget_class_bind_template_child (widget_class, CcUserPanel, parental_controls_row);
+#endif
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_button_label);
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, password_row);
gtk_widget_class_bind_template_child (widget_class, CcUserPanel, permission_infobar);
diff --git a/panels/user-accounts/cc-user-panel.ui b/panels/user-accounts/cc-user-panel.ui
index 07a2b3d5d..b96528037 100644
--- a/panels/user-accounts/cc-user-panel.ui
+++ b/panels/user-accounts/cc-user-panel.ui
@@ -305,6 +305,51 @@
</child>
</object>
</child>
+
+ <child>
+ <object class="GtkListBoxRow" id="parental_controls_row">
+ <property name="visible">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="border-width">10</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Parental
Controls</property>
+ <property name="use_underline">True</property>
+ <property
name="mnemonic_widget">parental_controls_button_label</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="parental_control_go_next">
+ <property name="visible">True</property>
+ <property name="icon-name">go-next-symbolic</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="parental_controls_button_label">
+ <property name="visible">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+
<child>
<object class="GtkListBoxRow" id="language_row">
<property name="visible">True</property>
diff --git a/panels/user-accounts/meson.build b/panels/user-accounts/meson.build
index b1c322a6b..03b20a6a5 100644
--- a/panels/user-accounts/meson.build
+++ b/panels/user-accounts/meson.build
@@ -175,6 +175,10 @@ if enable_cheese
deps += cheese_deps
endif
+if enable_malcontent
+ deps += malcontent_dep
+endif
+
cflags += [
'-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir),
'-DHAVE_LIBPWQUALITY',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]