chromium/chrome/browser/ash/notifications/update_required_notification.h

// 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.

#ifndef CHROME_BROWSER_ASH_NOTIFICATIONS_UPDATE_REQUIRED_NOTIFICATION_H_
#define CHROME_BROWSER_ASH_NOTIFICATIONS_UPDATE_REQUIRED_NOTIFICATION_H_

#include <optional>
#include <string>

#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ash/policy/handlers/minimum_version_policy_handler.h"
#include "ui/message_center/public/cpp/notification.h"
#include "ui/message_center/public/cpp/notification_delegate.h"

namespace ash {

// UpdateRequiredNotification manages in-session notifications informing the
// user that update is required as per admin policy but it cannot be initiated
// either due to network limitations or because of the device having reached its
// end-of-life state.
class UpdateRequiredNotification : public message_center::NotificationObserver {
 public:
  UpdateRequiredNotification();
  UpdateRequiredNotification(const UpdateRequiredNotification&) = delete;
  UpdateRequiredNotification& operator=(const UpdateRequiredNotification&) =
      delete;

  virtual ~UpdateRequiredNotification();

  // message_center::NotificationObserver:
  void Close(bool by_user) override;
  void Click(const std::optional<int>& button_index,
             const std::optional<std::u16string>& reply) override;

  // Collects notification data like title, body, button text, priority on the
  // basis of |type| and |warning_time|. Sets the |button_click_callback| to be
  // invoked when the notification button is clicked and |close_callback| to be
  // invoked when the notification is closed.
  void Show(policy::MinimumVersionPolicyHandler::NotificationType type,
            base::TimeDelta warning_time,
            const std::string& domain_name,
            const std::u16string& device_type,
            base::OnceClosure button_click_callback,
            base::OnceClosure close_callback);

  void Hide();

 private:
  // Creates and displays a new notification.
  void DisplayNotification(
      const std::u16string& title,
      const std::u16string& message,
      const std::u16string& button_text,
      const message_center::SystemNotificationWarningLevel color_type,
      const message_center::NotificationPriority priority);

  // Callback to be invoked when the notification button is clicked.
  base::OnceClosure notification_button_click_callback_;

  // Callback to be invoked when the notification is closed.
  base::OnceClosure notification_close_callback_;

  base::WeakPtrFactory<UpdateRequiredNotification> weak_factory_{this};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_NOTIFICATIONS_UPDATE_REQUIRED_NOTIFICATION_H_