| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/system/session/guest_session_confirmation_dialog.h" |
| |
| #include <memory> |
| |
| #include "ash/public/cpp/window_backdrop.h" |
| #include "ash/session/session_controller_impl.h" |
| #include "ash/shell.h" |
| #include "ash/strings/grit/ash_strings.h" |
| #include "base/functional/bind.h" |
| #include "base/functional/callback_helpers.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/models/dialog_model.h" |
| #include "ui/base/models/dialog_model_field.h" |
| #include "ui/base/mojom/ui_base_types.mojom-shared.h" |
| #include "ui/views/bubble/bubble_dialog_model_host.h" |
| #include "ui/views/widget/widget.h" |
| #include "ui/views/window/dialog_delegate.h" |
| |
| namespace ash { |
| |
| DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(GuestSessionConfirmationDialog, |
| kGuestSessionConfirmationDialogId); |
| |
| GuestSessionConfirmationDialog* GuestSessionConfirmationDialog::g_dialog_ = |
| nullptr; |
| |
| GuestSessionConfirmationDialog::~GuestSessionConfirmationDialog() = default; |
| |
| // static |
| void GuestSessionConfirmationDialog::Show() { |
| // Avoid duplicate dialogs. |
| if (g_dialog_) { |
| return; |
| } |
| |
| // dialog_ will be released when the dialog is closed. |
| g_dialog_ = new GuestSessionConfirmationDialog(); |
| |
| std::unique_ptr<ui::DialogModel> dialog_model = |
| ui::DialogModel::Builder(std::make_unique<ui::DialogModelDelegate>()) |
| .SetTitle(l10n_util::GetStringUTF16( |
| IDS_GUEST_SESSION_CONFIRMATION_DIALOG_TITLE)) |
| .AddOkButton( |
| base::BindOnce(&GuestSessionConfirmationDialog::OnConfirm, |
| g_dialog_->weak_ptr_factory_.GetWeakPtr()), |
| ui::DialogModel::Button::Params().SetLabel( |
| l10n_util::GetStringUTF16( |
| IDS_GUEST_SESSION_CONFIRMATION_DIALOG_SIGN_OUT))) |
| .AddCancelButton( |
| base::DoNothing(), |
| ui::DialogModel::Button::Params().SetLabel( |
| l10n_util::GetStringUTF16( |
| IDS_GUEST_SESSION_CONFIRMATION_DIALOG_CANCEL))) |
| .AddParagraph(ui::DialogModelLabel(l10n_util::GetStringUTF16( |
| IDS_GUEST_SESSION_CONFIRMATION_DIALOG_TEXT))) |
| .SetDialogDestroyingCallback( |
| base::BindOnce(&GuestSessionConfirmationDialog::OnDialogClosing, |
| g_dialog_->weak_ptr_factory_.GetWeakPtr())) |
| .Build(); |
| |
| g_dialog_->dialog_model_ = dialog_model.get(); |
| |
| auto bubble = views::BubbleDialogModelHost::CreateModal( |
| std::move(dialog_model), ui::mojom::ModalType::kSystem); |
| bubble->SetOwnedByWidget(true); |
| views::Widget* widget = |
| views::DialogDelegate::CreateDialogWidget(std::move(bubble), |
| /*context=*/nullptr, |
| /*parent=*/nullptr); |
| widget->Show(); |
| |
| // TODO(crbug.com/1016828): Remove/update this after the dialog behavior on |
| // Chrome OS is defined. |
| WindowBackdrop::Get(widget->GetNativeWindow()) |
| ->SetBackdropType(WindowBackdrop::BackdropType::kSemiOpaque); |
| } |
| |
| GuestSessionConfirmationDialog::GuestSessionConfirmationDialog() = default; |
| |
| void GuestSessionConfirmationDialog::OnConfirm() { |
| should_logout_ = true; |
| } |
| |
| void GuestSessionConfirmationDialog::OnDialogClosing() { |
| dialog_model_ = nullptr; |
| |
| if (should_logout_) { |
| Shell::Get()->session_controller()->RequestSignOut(); |
| } |
| |
| delete this; |
| g_dialog_ = nullptr; |
| } |
| |
| } // namespace ash |