[gnome-software/flatpak-permissions: 5/5] updates page: show new permissions



commit 277020124b9726525af2609962aae5428552937d
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Dec 26 16:50:18 2018 -0500

    updates page: show new permissions
    
    Add a warning in the list if there are new permissions,
    and spell out the permissions in the update dialog.

 src/gs-app-row.c        |  8 ++++++
 src/gs-update-dialog.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/gs-update-dialog.ui | 42 ++++++++++++++++++++++++++------
 3 files changed, 108 insertions(+), 7 deletions(-)
---
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index 9d0fba98..84168f5e 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -488,6 +488,14 @@ gs_app_row_refresh (GsAppRow *app_row)
        } else {
                gtk_widget_hide (priv->label_app_size);
        }
+
+       /* add warning */
+       if (gs_app_has_quirk (priv->app, GS_APP_QUIRK_NEW_PERMISSIONS)) {
+               gtk_label_set_text (GTK_LABEL (priv->label_warning),
+                                   _("Update requires more system access."));
+               gtk_widget_show (priv->label_warning);
+       }
+
 }
 
 static void
diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c
index 29a349b9..00de83ba 100644
--- a/src/gs-update-dialog.c
+++ b/src/gs-update-dialog.c
@@ -64,6 +64,8 @@ struct _GsUpdateDialog
        GtkWidget       *scrolledwindow_details;
        GtkWidget       *spinner;
        GtkWidget       *stack;
+       GtkWidget       *permissions_section_title;
+       GtkWidget       *permissions_section_content;
 };
 
 G_DEFINE_TYPE (GsUpdateDialog, gs_update_dialog, GTK_TYPE_DIALOG)
@@ -96,6 +98,57 @@ back_entry_free (BackEntry *entry)
        g_slice_free (BackEntry, entry);
 }
 
+static struct {
+        GsAppPermissions permission;
+        const char *icon;
+        const char *label;
+} permission_display_data[] = {
+  { GS_APP_PERMISSIONS_NETWORK, "network-transmit-receive-symbolic", N_("Network Access") },
+  { GS_APP_PERMISSIONS_SYSTEM_BUS, "dialog-warning-symbolic", N_("System Services") },
+  { GS_APP_PERMISSIONS_SESSION_BUS, "dialog-warning-symbolic", N_("Session Services") },
+  { GS_APP_PERMISSIONS_DEVICES, "dialog-warning-symbolic", N_("Devices") },
+  { GS_APP_PERMISSIONS_HOME_FULL, "system-file-manager-symbolic", N_("Home directory") },
+  { GS_APP_PERMISSIONS_HOME_READ, "system-file-manager-symbolic", N_("Home directory, read-only") },
+  { GS_APP_PERMISSIONS_FILESYSTEM_FULL, "system-file-manager-symbolic", N_("System file access") },
+  { GS_APP_PERMISSIONS_FILESYSTEM_READ, "system-file-manager-symbolic", N_("System file access, read-only") 
},
+  { GS_APP_PERMISSIONS_SETTINGS, "applications-system-symbolic", N_("Settings") },
+  { GS_APP_PERMISSIONS_X11, "dialog-warning-symbolic", N_("Legacy display system") },
+
+};
+
+static void
+populate_permissions_section (GsUpdateDialog *dialog, GsAppPermissions permissions)
+{
+       GList *children, *l;
+       gsize i;
+
+       children = gtk_container_get_children (GTK_CONTAINER (dialog->permissions_section_content));
+       for (l = children; l; l = l->next)
+               gtk_widget_destroy (GTK_WIDGET (l->data));
+       g_list_free (children);
+
+       for (i = 0; i < G_N_ELEMENTS (permission_display_data); i++) {
+               GtkWidget *row, *image, *label;
+
+               if ((permissions & permission_display_data[i].permission) == 0)
+                       continue;
+
+               row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+               gtk_widget_show (row);
+               if ((permission_display_data[i].permission & ~MEDIUM_PERMISSIONS) != 0) {
+                       gtk_style_context_add_class (gtk_widget_get_style_context (row), 
"permission-row-warning");
+               }
+
+               image = gtk_image_new_from_icon_name (permission_display_data[i].icon, GTK_ICON_SIZE_MENU);
+               gtk_widget_show (image);
+               label = gtk_label_new (_(permission_display_data[i].label));
+               gtk_widget_show (label);
+               gtk_container_add (GTK_CONTAINER (row), image);
+               gtk_container_add (GTK_CONTAINER (row), label);
+               gtk_container_add (GTK_CONTAINER (dialog->permissions_section_content), row);
+       }
+}
+
 static void
 set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
 {
@@ -140,6 +193,16 @@ set_updates_description_ui (GsUpdateDialog *dialog, GsApp *app)
 
        /* show the back button if needed */
        gtk_widget_set_visible (dialog->button_back, !g_queue_is_empty (dialog->back_entry_stack));
+
+        if (gs_app_has_quirk (app, GS_APP_QUIRK_NEW_PERMISSIONS)) {
+               gtk_widget_show (dialog->permissions_section_title);
+               gtk_widget_show (dialog->permissions_section_content);
+               populate_permissions_section (dialog, gs_app_get_permissions (app));
+       }
+       else {
+               gtk_widget_hide (dialog->permissions_section_title);
+               gtk_widget_hide (dialog->permissions_section_content);
+       }
 }
 
 static void
@@ -758,6 +821,8 @@ gs_update_dialog_class_init (GsUpdateDialogClass *klass)
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, scrolledwindow_details);
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, spinner);
        gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, stack);
+       gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, permissions_section_title);
+       gtk_widget_class_bind_template_child (widget_class, GsUpdateDialog, permissions_section_content);
 }
 
 GtkWidget *
diff --git a/src/gs-update-dialog.ui b/src/gs-update-dialog.ui
index a9c57d1d..73bb8463 100644
--- a/src/gs-update-dialog.ui
+++ b/src/gs-update-dialog.ui
@@ -175,16 +175,44 @@
                     <property name="vscrollbar_policy">automatic</property>
                     <property name="shadow_type">none</property>
                     <child>
-                      <object class="GtkLabel" id="label_details">
+                      <object class="GtkBox">
                         <property name="visible">True</property>
-                        <property name="xalign">0</property>
-                        <property name="yalign">0</property>
-                        <property name="margin">6</property>
-                        <property name="label">New in kmod 14-1
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">20</property>
+                        <child>
+                          <object class="GtkLabel" id="label_details">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="yalign">0</property>
+                            <property name="margin">6</property>
+                            <property name="label">New in kmod 14-1
 * Moo
 * bar</property>
-                        <property name="wrap">True</property>
-                        <property name="selectable">True</property>
+                            <property name="wrap">True</property>
+                            <property name="selectable">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="permissions_section_title">
+                            <property name="visible">True</property>
+                            <property name="xalign">0</property>
+                            <property name="halign">start</property>
+                            <property name="margin">6</property>
+                            <property name="label" translatable="yes">New System Access</property>
+                            <attributes>
+                              <attribute name="weight" value="bold"/>
+                            </attributes>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkBox" id="permissions_section_content">
+                            <property name="visible">True</property>
+                            <property name="orientation">vertical</property>
+                            <property name="spacing">12</property>
+                            <property name="margin-start">18</property>
+                            <property name="margin-end">18</property>
+                          </object>
+                        </child>
                       </object>
                     </child>
                   </object>


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