Chromium Code Reviews| Index: chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.cc |
| diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.cc |
| index bf5a7791f1bdb7d594734deae136f44e44b13a00..0f8a9529ed11717e1e933d5bcda6e8d080827b41 100644 |
| --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.cc |
| +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.cc |
| @@ -4,6 +4,8 @@ |
| #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.h" |
| +#include "apps/app_load_service.h" |
| +#include "apps/app_restore_service.h" |
| #include "apps/saved_files_service.h" |
| #include "base/files/file_path.h" |
| #include "base/strings/string_number_conversions.h" |
| @@ -19,19 +21,23 @@ |
| #include "ui/gfx/animation/animation.h" |
| #include "ui/gfx/animation/animation_delegate.h" |
| #include "ui/gfx/animation/slide_animation.h" |
| +#include "ui/gfx/native_widget_types.h" |
| #include "ui/gfx/text_constants.h" |
| #include "ui/views/controls/button/button.h" |
| #include "ui/views/controls/button/image_button.h" |
| +#include "ui/views/controls/button/label_button.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/scroll_view.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/layout/grid_layout.h" |
| #include "ui/views/layout/layout_constants.h" |
| +#include "ui/views/widget/widget.h" |
| namespace { |
| -// A view to display a title with an expandable permissions list section. |
| +// A view to display a title with an expandable permissions list section and an |
| +// optional 'revoke' button below the list. |
| class ExpandableContainerView : public views::View, |
| public views::ButtonListener, |
| public gfx::AnimationDelegate { |
| @@ -39,7 +45,8 @@ class ExpandableContainerView : public views::View, |
| ExpandableContainerView( |
| views::View* owner, |
| const base::string16& title, |
| - const std::vector<base::string16>& permission_messages); |
| + const std::vector<base::string16>& permission_messages, |
| + views::Button* revoke_button); |
|
benwells
2014/05/12 04:54:03
Nit: As far as this view is concerned, this could
sashab
2014/05/13 05:45:50
Yup, good point. This is leftover from when all th
|
| virtual ~ExpandableContainerView(); |
| // views::View: |
| @@ -57,10 +64,12 @@ class ExpandableContainerView : public views::View, |
| void ToggleDetailLevel(); |
| private: |
| - // A view which displays the permission messages as a bulleted list. |
| + // A view which displays the permission messages as a bulleted list, with an |
| + // optional 'revoke' button underneath. |revoke_button| may be NULL. |
| class DetailsView : public views::View { |
| public: |
| - explicit DetailsView(std::vector<base::string16> messages); |
| + explicit DetailsView(const std::vector<base::string16>& messages, |
| + views::Button* revoke_button); |
| virtual ~DetailsView() {} |
| // views::View: |
| @@ -96,15 +105,16 @@ class ExpandableContainerView : public views::View, |
| }; |
| ExpandableContainerView::DetailsView::DetailsView( |
| - std::vector<base::string16> messages) |
| + const std::vector<base::string16>& messages, |
| + views::Button* revoke_button) |
| : visible_ratio_(0) { |
| - views::GridLayout* layout = views::GridLayout::CreatePanel(this); |
| + views::GridLayout* layout = new views::GridLayout(this); |
| SetLayoutManager(layout); |
| // Create 2 columns: one for the bullet, one for the bullet text. |
| static const int kColumnSet = 1; |
| views::ColumnSet* column_set = layout->AddColumnSet(kColumnSet); |
| - column_set->AddPaddingColumn(0, 10); |
| + column_set->AddPaddingColumn(0, views::kPanelHorizMargin); |
| column_set->AddColumn(views::GridLayout::LEADING, |
| views::GridLayout::LEADING, |
| 1, |
| @@ -118,8 +128,20 @@ ExpandableContainerView::DetailsView::DetailsView( |
| views::GridLayout::USE_PREF, |
| 0, |
| 0); |
| + column_set->AddPaddingColumn(0, views::kPanelHorizMargin); |
| + |
| + // Create a right-aligned column just for the button at the bottom. |
| + static const int kButtonColumnSet = 2; |
| + views::ColumnSet* button_column_set = layout->AddColumnSet(kButtonColumnSet); |
| + button_column_set->AddColumn(views::GridLayout::TRAILING, |
| + views::GridLayout::LEADING, |
| + 1, |
| + views::GridLayout::USE_PREF, |
| + 0, |
| + 0); |
| // Add permissions to scrollable view. |
| + layout->AddPaddingRow(100.0f, views::kPanelVertMargin); |
|
benwells
2014/05/12 04:54:03
What is the 100 here mean? Might be good to commen
sashab
2014/05/13 05:45:50
1. The 100.0 is the 'resize percent', to make the
|
| for (std::vector<base::string16>::const_iterator it = messages.begin(); |
| it != messages.end(); |
| ++it) { |
| @@ -138,6 +160,13 @@ ExpandableContainerView::DetailsView::DetailsView( |
| layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); |
| } |
| + |
| + // Add the button, if one was provided. |
| + if (revoke_button) { |
| + layout->AddPaddingRow(0, views::kUnrelatedControlHorizontalSpacing); |
| + layout->StartRow(0, kButtonColumnSet); |
| + layout->AddView(revoke_button); |
| + } |
| } |
| gfx::Size ExpandableContainerView::DetailsView::GetPreferredSize() { |
| @@ -154,7 +183,8 @@ void ExpandableContainerView::DetailsView::AnimateToRatio(double ratio) { |
| ExpandableContainerView::ExpandableContainerView( |
| views::View* owner, |
| const base::string16& title, |
| - const std::vector<base::string16>& permission_messages) |
| + const std::vector<base::string16>& permission_messages, |
| + views::Button* revoke_button) |
| : owner_(owner), |
| details_view_(NULL), |
| slide_animation_(this), |
| @@ -218,7 +248,7 @@ ExpandableContainerView::ExpandableContainerView( |
| layout->AddView(title_view); |
| layout->AddView(arrow_toggle_); |
| - details_view_ = new DetailsView(permission_messages); |
| + details_view_ = new DetailsView(permission_messages, revoke_button); |
| layout->StartRow(0, kMainColumnSetId); |
| layout->AddView(details_view_); |
| } |
| @@ -275,7 +305,8 @@ AppInfoPermissionsTab::AppInfoPermissionsTab( |
| Profile* profile, |
| const extensions::Extension* app, |
| const base::Closure& close_callback) |
| - : AppInfoTab(parent_window, profile, app, close_callback) { |
| + : AppInfoTab(parent_window, profile, app, close_callback), |
| + revoke_file_permissions_button_(NULL) { |
| this->SetLayoutManager(new views::FillLayout); |
| // Create a scrollview and add it to the tab. |
| @@ -323,7 +354,8 @@ AppInfoPermissionsTab::AppInfoPermissionsTab( |
| this, |
| l10n_util::GetStringUTF16( |
| IDS_APPLICATION_INFO_REQUIRED_PERMISSIONS_TEXT), |
| - required_permission_messages); |
| + required_permission_messages, |
| + NULL); |
| // Required permissions are visible by default. |
| details_container->ToggleDetailLevel(); |
| @@ -337,7 +369,8 @@ AppInfoPermissionsTab::AppInfoPermissionsTab( |
| this, |
| l10n_util::GetStringUTF16( |
| IDS_APPLICATION_INFO_OPTIONAL_PERMISSIONS_TEXT), |
| - optional_permission_messages); |
| + optional_permission_messages, |
| + NULL); |
| layout->StartRow(0, kMainColumnSetId); |
| layout->AddView(details_container); |
| @@ -345,11 +378,18 @@ AppInfoPermissionsTab::AppInfoPermissionsTab( |
| } |
| if (!retained_file_permission_messages.empty()) { |
| + revoke_file_permissions_button_ = new views::LabelButton( |
| + this, |
| + l10n_util::GetStringUTF16( |
| + IDS_APPLICATION_INFO_REVOKE_RETAINED_FILE_PERMISSIONS_BUTTON_TEXT)); |
| + revoke_file_permissions_button_->SetStyle(views::Button::STYLE_BUTTON); |
| + |
| ExpandableContainerView* details_container = new ExpandableContainerView( |
| this, |
| l10n_util::GetStringUTF16( |
| IDS_APPLICATION_INFO_RETAINED_FILE_PERMISSIONS_TEXT), |
| - retained_file_permission_messages); |
| + retained_file_permission_messages, |
| + revoke_file_permissions_button_); |
| layout->StartRow(0, kMainColumnSetId); |
| layout->AddView(details_container); |
| @@ -371,6 +411,23 @@ void AppInfoPermissionsTab::Layout() { |
| scroll_view_->SetBounds(0, 0, width(), height()); |
| } |
| +void AppInfoPermissionsTab::ButtonPressed(views::Button* sender, |
| + const ui::Event& event) { |
| + if (sender == revoke_file_permissions_button_) |
| + RevokeFilePermissions(); |
| + else |
| + NOTREACHED(); |
| +} |
| + |
| +void AppInfoPermissionsTab::RevokeFilePermissions() { |
| + apps::SavedFilesService::Get(profile_)->ClearQueue(app_); |
| + |
| + if (apps::AppRestoreService::Get(profile_)->IsAppRestorable(app_->id())) |
|
benwells
2014/05/12 04:54:03
This is rather counterintuitive. It would be nicer
sashab
2014/05/13 05:45:50
Done.
|
| + apps::AppLoadService::Get(profile_)->RestartApplication(app_->id()); |
| + |
| + GetWidget()->Close(); |
| +} |
| + |
| const extensions::PermissionSet* AppInfoPermissionsTab::GetRequiredPermissions() |
| const { |
| return extensions::PermissionsData::GetRequiredPermissions(app_); |