1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
// Copyright 2022 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/ash/device_scheduled_reboot/scheduled_reboot_dialog.h"
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/i18n/time_formatting.h"
#include "components/constrained_window/constrained_window_views.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/dialog_model.h"
#include "ui/base/mojom/ui_base_types.mojom-shared.h"
#include "ui/views/bubble/bubble_dialog_model_host.h"
ScheduledRebootDialog::ScheduledRebootDialog(const base::Time& reboot_time,
gfx::NativeView native_view,
base::OnceClosure reboot_callback)
: title_refresh_timer_(
reboot_time,
base::BindRepeating(&ScheduledRebootDialog::UpdateWindowTitle,
base::Unretained(this))) {
ShowBubble(reboot_time, native_view, std::move(reboot_callback));
}
ScheduledRebootDialog::~ScheduledRebootDialog() {
if (dialog_delegate_) {
views::Widget* widget = dialog_delegate_->GetWidget();
if (widget->HasObserver(this)) {
widget->RemoveObserver(this);
}
widget->CloseNow();
dialog_delegate_ = nullptr;
}
}
void ScheduledRebootDialog::ShowBubble(const base::Time& reboot_time,
gfx::NativeView native_view,
base::OnceClosure reboot_callback) {
auto dialog_model =
ui::DialogModel::Builder(std::make_unique<ui::DialogModelDelegate>())
.SetTitle(BuildTitle())
.AddOkButton(base::DoNothing())
.AddCancelButton(
std::move(reboot_callback),
ui::DialogModel::Button::Params().SetLabel(
l10n_util::GetStringUTF16(IDS_POLICY_REBOOT_BUTTON)))
.AddParagraph(
ui::DialogModelLabel(
l10n_util::GetStringFUTF16(
IDS_POLICY_DEVICE_SCHEDULED_REBOOT_DIALOG_MESSAGE,
base::TimeFormatTimeOfDay(reboot_time),
base::TimeFormatShortDate(reboot_time)))
.set_is_secondary())
.Build();
// TODO(crbug.com/41493925): Autosizing this bubble once this bubble's anchor
// point is in the correct position.
auto bubble = views::BubbleDialogModelHost::CreateModal(
std::move(dialog_model), ui::mojom::ModalType::kSystem,
/*autosize=*/false);
dialog_delegate_ = bubble.get();
bubble->SetOwnedByWidget(views::WidgetDelegate::OwnedByWidgetPassKey());
constrained_window::CreateBrowserModalDialogViews(std::move(bubble),
native_view)
->Show();
dialog_delegate_->GetWidget()->AddObserver(this);
}
void ScheduledRebootDialog::OnWidgetDestroying(views::Widget* widget) {
widget->RemoveObserver(this);
dialog_delegate_ = nullptr;
}
views::DialogDelegate* ScheduledRebootDialog::GetDialogDelegate() const {
return dialog_delegate_;
}
void ScheduledRebootDialog::UpdateWindowTitle() {
if (dialog_delegate_) {
dialog_delegate_->SetTitle(BuildTitle());
}
}
const std::u16string ScheduledRebootDialog::BuildTitle() const {
const base::TimeDelta rounded_offset =
title_refresh_timer_.GetRoundedDeadlineDelta();
int amount = rounded_offset.InSeconds();
int message_id = IDS_REBOOT_SCHEDULED_TITLE_SECONDS;
if (rounded_offset.InMinutes() >= 1) {
amount = rounded_offset.InMinutes();
message_id = IDS_REBOOT_SCHEDULED_TITLE_MINUTES;
}
return l10n_util::GetPluralStringFUTF16(message_id, amount);
}
|