Desk Template: Adding dialog for template name duplication.
Add dialog to user name duplication and replace old template. Test: Unit Test Bug: 1281384 Change-Id: Ibbc8650f75e9535fcf768d7b551fc31348768995 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3393966 Reviewed-by: Sammie Quon <sammiequon@chromium.org> Commit-Queue: Judy Wang <shidi@chromium.org> Cr-Commit-Position: refs/heads/main@{#962159}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
c676b9355a
commit
1a0d116691
@@ -190,20 +190,22 @@ void DesksTemplatesDialogController::ShowUnsupportedAppsDialog(
|
|||||||
|
|
||||||
void DesksTemplatesDialogController::ShowReplaceDialog(
|
void DesksTemplatesDialogController::ShowReplaceDialog(
|
||||||
aura::Window* root_window,
|
aura::Window* root_window,
|
||||||
const std::u16string& template_name) {
|
const std::u16string& template_name,
|
||||||
auto dialog =
|
base::OnceClosure on_accept_callback,
|
||||||
views::Builder<DesksTemplatesDialog>()
|
base::OnceClosure on_cancel_callback) {
|
||||||
.SetTitleText(IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_TITLE)
|
auto dialog = views::Builder<DesksTemplatesDialog>()
|
||||||
.SetConfirmButtonText(
|
.SetTitleText(IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_TITLE)
|
||||||
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_CONFIRM_BUTTON)
|
.SetConfirmButtonText(
|
||||||
.SetDescriptionText(l10n_util::GetStringFUTF16(
|
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_CONFIRM_BUTTON)
|
||||||
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_DESCRIPTION,
|
.SetDescriptionText(l10n_util::GetStringFUTF16(
|
||||||
GetStringWithQuotes(template_name)))
|
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_DESCRIPTION,
|
||||||
.SetDescriptionAccessibleName(l10n_util::GetStringFUTF16(
|
GetStringWithQuotes(template_name)))
|
||||||
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_DESCRIPTION,
|
.SetDescriptionAccessibleName(l10n_util::GetStringFUTF16(
|
||||||
template_name))
|
IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_DESCRIPTION,
|
||||||
.SetAcceptCallback(base::BindOnce(&RecordReplaceTemplateHistogram))
|
template_name))
|
||||||
.Build();
|
.SetAcceptCallback(std::move(on_accept_callback))
|
||||||
|
.SetCancelCallback(std::move(on_cancel_callback))
|
||||||
|
.Build();
|
||||||
CreateDialogWidget(std::move(dialog), root_window);
|
CreateDialogWidget(std::move(dialog), root_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -51,7 +51,9 @@ class ASH_EXPORT DesksTemplatesDialogController : public views::WidgetObserver {
|
|||||||
DesksController::GetDeskTemplateCallback callback,
|
DesksController::GetDeskTemplateCallback callback,
|
||||||
std::unique_ptr<DeskTemplate> desk_template);
|
std::unique_ptr<DeskTemplate> desk_template);
|
||||||
void ShowReplaceDialog(aura::Window* root_window,
|
void ShowReplaceDialog(aura::Window* root_window,
|
||||||
const std::u16string& template_name);
|
const std::u16string& template_name,
|
||||||
|
base::OnceClosure on_accept_callback,
|
||||||
|
base::OnceClosure on_cancel_callback);
|
||||||
// Show the delete template dialog when user press the delete button.
|
// Show the delete template dialog when user press the delete button.
|
||||||
// The `template_name` shows the name of the template which will be deleted in
|
// The `template_name` shows the name of the template which will be deleted in
|
||||||
// the dialog description.
|
// the dialog description.
|
||||||
|
@@ -16,11 +16,14 @@
|
|||||||
#include "ash/style/style_util.h"
|
#include "ash/style/style_util.h"
|
||||||
#include "ash/wm/desks/desks_textfield.h"
|
#include "ash/wm/desks/desks_textfield.h"
|
||||||
#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
|
#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
|
||||||
|
#include "ash/wm/desks/templates/desks_templates_grid_view.h"
|
||||||
#include "ash/wm/desks/templates/desks_templates_icon_container.h"
|
#include "ash/wm/desks/templates/desks_templates_icon_container.h"
|
||||||
|
#include "ash/wm/desks/templates/desks_templates_metrics_util.h"
|
||||||
#include "ash/wm/desks/templates/desks_templates_name_view.h"
|
#include "ash/wm/desks/templates/desks_templates_name_view.h"
|
||||||
#include "ash/wm/desks/templates/desks_templates_presenter.h"
|
#include "ash/wm/desks/templates/desks_templates_presenter.h"
|
||||||
#include "ash/wm/overview/overview_constants.h"
|
#include "ash/wm/overview/overview_constants.h"
|
||||||
#include "ash/wm/overview/overview_controller.h"
|
#include "ash/wm/overview/overview_controller.h"
|
||||||
|
#include "ash/wm/overview/overview_grid.h"
|
||||||
#include "ash/wm/overview/overview_highlight_controller.h"
|
#include "ash/wm/overview/overview_highlight_controller.h"
|
||||||
#include "ash/wm/overview/overview_session.h"
|
#include "ash/wm/overview/overview_session.h"
|
||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
@@ -218,6 +221,22 @@ bool DesksTemplatesItemView::IsTemplateNameBeingModified() const {
|
|||||||
return name_view_->HasFocus();
|
return name_view_->HasFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DesksTemplatesItemView::ReplaceTemplate(const std::string& uuid,
|
||||||
|
const std::u16string& new_name) {
|
||||||
|
UpdateTemplateName();
|
||||||
|
DesksTemplatesPresenter::Get()->DeleteEntry(uuid);
|
||||||
|
RecordReplaceTemplateHistogram();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesksTemplatesItemView::RevertTemplateName() {
|
||||||
|
views::FocusManager* focus_manager = GetFocusManager();
|
||||||
|
focus_manager->SetFocusedView(name_view_);
|
||||||
|
name_view_->SetText(desk_template_->template_name());
|
||||||
|
name_view_->SelectAll(true);
|
||||||
|
|
||||||
|
name_view_->OnContentsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void DesksTemplatesItemView::Layout() {
|
void DesksTemplatesItemView::Layout() {
|
||||||
const int previous_name_view_width = name_view_->width();
|
const int previous_name_view_width = name_view_->width();
|
||||||
|
|
||||||
@@ -335,6 +354,47 @@ void DesksTemplatesItemView::OnViewBlurred(views::View* observed_view) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if template name exist, replace existing template if confirmed by
|
||||||
|
// user.
|
||||||
|
aura::Window* root_window = GetWidget()->GetNativeWindow()->GetRootWindow();
|
||||||
|
OverviewGrid* overview_grid = Shell::Get()
|
||||||
|
->overview_controller()
|
||||||
|
->overview_session()
|
||||||
|
->GetGridWithRootWindow(root_window);
|
||||||
|
auto* templates_grid_view = static_cast<DesksTemplatesGridView*>(
|
||||||
|
overview_grid->desks_templates_grid_widget()->GetContentsView());
|
||||||
|
for (DesksTemplatesItemView* template_item :
|
||||||
|
templates_grid_view->grid_items()) {
|
||||||
|
auto new_name = name_view_->GetText();
|
||||||
|
if (template_item != this &&
|
||||||
|
template_item->desk_template_->template_name() == new_name) {
|
||||||
|
// Show replace template dialog.
|
||||||
|
// If accepted, replace old template and commit name change.
|
||||||
|
DesksTemplatesDialogController::Get()->ShowReplaceDialog(
|
||||||
|
root_window, new_name,
|
||||||
|
base::BindOnce(
|
||||||
|
&DesksTemplatesItemView::ReplaceTemplate, base::Unretained(this),
|
||||||
|
template_item->desk_template_->uuid().AsLowercaseString(),
|
||||||
|
new_name),
|
||||||
|
base::BindOnce(&DesksTemplatesItemView::RevertTemplateName,
|
||||||
|
base::Unretained(this)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UpdateTemplateName();
|
||||||
|
}
|
||||||
|
|
||||||
|
views::Button::KeyClickAction DesksTemplatesItemView::GetKeyClickActionForEvent(
|
||||||
|
const ui::KeyEvent& event) {
|
||||||
|
// Prevents any key events from activating a button click while the template
|
||||||
|
// name is being modified.
|
||||||
|
if (is_template_name_being_modified_)
|
||||||
|
return KeyClickAction::kNone;
|
||||||
|
|
||||||
|
return Button::GetKeyClickActionForEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesksTemplatesItemView::UpdateTemplateName() {
|
||||||
auto updated_template = desk_template_->Clone();
|
auto updated_template = desk_template_->Clone();
|
||||||
updated_template->set_template_name(name_view_->GetText());
|
updated_template->set_template_name(name_view_->GetText());
|
||||||
OnTemplateNameChanged(updated_template->template_name());
|
OnTemplateNameChanged(updated_template->template_name());
|
||||||
@@ -353,16 +413,6 @@ void DesksTemplatesItemView::OnViewBlurred(views::View* observed_view) {
|
|||||||
std::move(updated_template)));
|
std::move(updated_template)));
|
||||||
}
|
}
|
||||||
|
|
||||||
views::Button::KeyClickAction DesksTemplatesItemView::GetKeyClickActionForEvent(
|
|
||||||
const ui::KeyEvent& event) {
|
|
||||||
// Prevents any key events from activating a button click while the template
|
|
||||||
// name is being modified.
|
|
||||||
if (is_template_name_being_modified_)
|
|
||||||
return KeyClickAction::kNone;
|
|
||||||
|
|
||||||
return Button::GetKeyClickActionForEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DesksTemplatesItemView::ContentsChanged(
|
void DesksTemplatesItemView::ContentsChanged(
|
||||||
views::Textfield* sender,
|
views::Textfield* sender,
|
||||||
const std::u16string& new_contents) {
|
const std::u16string& new_contents) {
|
||||||
|
@@ -52,6 +52,11 @@ class ASH_EXPORT DesksTemplatesItemView : public views::Button,
|
|||||||
// `DesksTemplatesNameView` has the focus).
|
// `DesksTemplatesNameView` has the focus).
|
||||||
bool IsTemplateNameBeingModified() const;
|
bool IsTemplateNameBeingModified() const;
|
||||||
|
|
||||||
|
// Rename current template with new name, delete old template with same name
|
||||||
|
// by uuid. Used for callback functions for Replace Dialog.
|
||||||
|
void ReplaceTemplate(const std::string& uuid, const std::u16string& new_name);
|
||||||
|
void RevertTemplateName();
|
||||||
|
|
||||||
// views::Button:
|
// views::Button:
|
||||||
void Layout() override;
|
void Layout() override;
|
||||||
void OnThemeChanged() override;
|
void OnThemeChanged() override;
|
||||||
@@ -87,6 +92,9 @@ class ASH_EXPORT DesksTemplatesItemView : public views::Button,
|
|||||||
// changes.
|
// changes.
|
||||||
void OnTemplateNameChanged(const std::u16string& new_name);
|
void OnTemplateNameChanged(const std::u16string& new_name);
|
||||||
|
|
||||||
|
// Update template name based on `name_view_` string.
|
||||||
|
void UpdateTemplateName();
|
||||||
|
|
||||||
// OverviewHighlightableView:
|
// OverviewHighlightableView:
|
||||||
views::View* GetView() override;
|
views::View* GetView() override;
|
||||||
void MaybeActivateHighlightedView() override;
|
void MaybeActivateHighlightedView() override;
|
||||||
|
@@ -554,7 +554,8 @@ TEST_F(DesksTemplatesTest, DialogSystemModal) {
|
|||||||
|
|
||||||
// Show one of the dialogs. Activating the dialog keeps us in overview mode.
|
// Show one of the dialogs. Activating the dialog keeps us in overview mode.
|
||||||
auto* dialog_controller = DesksTemplatesDialogController::Get();
|
auto* dialog_controller = DesksTemplatesDialogController::Get();
|
||||||
dialog_controller->ShowReplaceDialog(Shell::GetPrimaryRootWindow(), u"Bento");
|
dialog_controller->ShowReplaceDialog(Shell::GetPrimaryRootWindow(), u"Bento",
|
||||||
|
base::DoNothing(), base::DoNothing());
|
||||||
EXPECT_TRUE(Shell::IsSystemModalWindowOpen());
|
EXPECT_TRUE(Shell::IsSystemModalWindowOpen());
|
||||||
ASSERT_TRUE(GetOverviewSession());
|
ASSERT_TRUE(GetOverviewSession());
|
||||||
|
|
||||||
@@ -2113,17 +2114,31 @@ TEST_F(DesksTemplatesTest, LayoutItemsInPortrait) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tests record metrics when current template being replaced.
|
// Tests record metrics when current template being replaced.
|
||||||
TEST_F(DesksTemplatesTest, ReplaceTemplateRecordMetrics) {
|
TEST_F(DesksTemplatesTest, ReplaceTemplate) {
|
||||||
base::HistogramTester histogram_tester;
|
base::HistogramTester histogram_tester;
|
||||||
|
|
||||||
UpdateDisplay("800x600,800x600");
|
UpdateDisplay("800x600,800x600");
|
||||||
|
|
||||||
ToggleOverview();
|
const base::GUID uuid_1 = base::GUID::GenerateRandomV4();
|
||||||
ASSERT_TRUE(GetOverviewSession());
|
const std::u16string name_1 = u"template_1";
|
||||||
|
AddEntry(uuid_1, "template_1", base::Time::Now());
|
||||||
|
|
||||||
|
const base::GUID uuid_2 = base::GUID::GenerateRandomV4();
|
||||||
|
const std::u16string name_2 = u"template_2";
|
||||||
|
AddEntry(uuid_2, "template_2", base::Time::Now());
|
||||||
|
|
||||||
|
OpenOverviewAndShowTemplatesGrid();
|
||||||
|
|
||||||
|
DesksTemplatesItemView* item_view = GetItemViewFromTemplatesGrid(
|
||||||
|
/*grid_item_index=*/0);
|
||||||
// Show replace dialogs.
|
// Show replace dialogs.
|
||||||
auto* dialog_controller = DesksTemplatesDialogController::Get();
|
auto* dialog_controller = DesksTemplatesDialogController::Get();
|
||||||
dialog_controller->ShowReplaceDialog(Shell::GetPrimaryRootWindow(), u"Bento");
|
auto callback = base::BindLambdaForTesting([&]() {
|
||||||
|
item_view->ReplaceTemplate(uuid_1.AsLowercaseString(), name_1);
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog_controller->ShowReplaceDialog(Shell::GetPrimaryRootWindow(), u"Bento",
|
||||||
|
callback, base::DoNothing());
|
||||||
EXPECT_TRUE(Shell::IsSystemModalWindowOpen());
|
EXPECT_TRUE(Shell::IsSystemModalWindowOpen());
|
||||||
ASSERT_TRUE(GetOverviewSession());
|
ASSERT_TRUE(GetOverviewSession());
|
||||||
|
|
||||||
@@ -2133,6 +2148,14 @@ TEST_F(DesksTemplatesTest, ReplaceTemplateRecordMetrics) {
|
|||||||
->AsDialogDelegate()
|
->AsDialogDelegate()
|
||||||
->AcceptDialog();
|
->AcceptDialog();
|
||||||
|
|
||||||
|
// Only one template left.
|
||||||
|
EXPECT_EQ(1ul, desk_model()->GetEntryCount());
|
||||||
|
// The Template has been replaced.
|
||||||
|
DesksTemplatesNameView* name_view =
|
||||||
|
GetItemViewFromTemplatesGrid(0)->name_view();
|
||||||
|
EXPECT_EQ(name_1, name_view->GetText());
|
||||||
|
std::vector<DeskTemplate*> entries = GetAllEntries();
|
||||||
|
EXPECT_EQ(uuid_2, entries[0]->uuid());
|
||||||
// Assert metrics being recorded.
|
// Assert metrics being recorded.
|
||||||
histogram_tester.ExpectTotalCount(kReplaceTemplateHistogramName, 1);
|
histogram_tester.ExpectTotalCount(kReplaceTemplateHistogramName, 1);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user