chromium/chrome/browser/ui/views/crostini/crostini_app_restart_dialog.cc

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/views/crostini/crostini_app_restart_dialog.h"

#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/mojom/dialog_button.mojom.h"
#include "ui/base/mojom/ui_base_types.mojom-shared.h"
#include "ui/base/ui_base_types.h"
#include "ui/display/screen.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/layout_provider.h"
#include "ui/views/window/dialog_delegate.h"

namespace crostini {

namespace {

gfx::NativeWindow GetNativeWindowFromDisplayId(int64_t display_id) {
  display::Screen* screen = display::Screen::GetScreen();
  display::Display display;
  screen->GetDisplayWithDisplayId(display_id, &display);
  return screen->GetWindowAtScreenPoint(display.bounds().origin());
}

std::unique_ptr<views::View> MakeCrostiniAppRestartView() {
  auto view = std::make_unique<views::View>();

  views::LayoutProvider* provider = views::LayoutProvider::Get();
  view->SetLayoutManager(std::make_unique<views::BoxLayout>(
      views::BoxLayout::Orientation::kVertical,
      provider->GetInsetsMetric(views::InsetsMetric::INSETS_DIALOG),
      provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL)));

  const std::u16string message =
      l10n_util::GetStringUTF16(IDS_CROSTINI_APP_RESTART_BODY);
  views::Label* message_label = new views::Label(message);
  message_label->SetMultiLine(true);
  message_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  view->AddChildView(message_label);

  return view;
}

std::unique_ptr<views::DialogDelegate> MakeCrostiniAppRestartDelegate(
    std::unique_ptr<views::View> contents) {
  auto delegate = std::make_unique<views::DialogDelegate>();
  delegate->set_internal_name("CrostiniAppRestart");
  delegate->SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk));
  delegate->SetContentsView(std::move(contents));
  delegate->SetModalType(ui::mojom::ModalType::kSystem);
  delegate->SetOwnedByWidget(true);
  delegate->SetShowCloseButton(false);
  delegate->set_fixed_width(ChromeLayoutProvider::Get()->GetDistanceMetric(
      views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));

  return delegate;
}

void ShowInternal(gfx::NativeWindow context) {
  auto contents = MakeCrostiniAppRestartView();
  auto delegate = MakeCrostiniAppRestartDelegate(std::move(contents));
  views::DialogDelegate::CreateDialogWidget(std::move(delegate), context,
                                            nullptr)
      ->Show();
}

}  // namespace

void ShowAppRestartDialog(int64_t display_id) {
  ShowInternal(GetNativeWindowFromDisplayId(display_id));
}

void ShowAppRestartDialogForTesting(gfx::NativeWindow context) {
  ShowInternal(context);
}

}  // namespace crostini