#ifndef ASH_MULTI_DEVICE_SETUP_MULTI_DEVICE_NOTIFICATION_PRESENTER_H_
#define ASH_MULTI_DEVICE_SETUP_MULTI_DEVICE_NOTIFICATION_PRESENTER_H_
#include <memory>
#include <string>
#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_observer.h"
#include "base/auto_reset.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "ui/message_center/message_center_observer.h"
namespace message_center {
class MessageCenter;
class Notification;
class RichNotificationData;
}
namespace ash {
class ASH_EXPORT MultiDeviceNotificationPresenter
: public multidevice_setup::mojom::AccountStatusChangeDelegate,
public SessionObserver,
public message_center::MessageCenterObserver {
public:
explicit MultiDeviceNotificationPresenter(
message_center::MessageCenter* message_center);
MultiDeviceNotificationPresenter(const MultiDeviceNotificationPresenter&) =
delete;
MultiDeviceNotificationPresenter& operator=(
const MultiDeviceNotificationPresenter&) = delete;
~MultiDeviceNotificationPresenter() override;
static std::unique_ptr<base::AutoReset<bool>>
DisableNotificationsForTesting();
void RemoveMultiDeviceSetupNotification();
void UpdateIsSetupNotificationInteracted(
bool is_setup_notificaton_interacted);
static const char kSetupNotificationId[];
protected:
void OnPotentialHostExistsForNewUser() override;
void OnNoLongerNewUser() override;
void OnConnectedHostSwitchedForExistingUser(
const std::string& new_host_device_name) override;
void OnNewChromebookAddedForExistingUser(
const std::string& new_host_device_name) override;
void OnBecameEligibleForWifiSync() override;
void OnUserSessionAdded(const AccountId& account_id) override;
void OnSessionStateChanged(session_manager::SessionState state) override;
void OnNotificationRemoved(const std::string& notification_id,
bool by_user) override;
void OnNotificationClicked(
const std::string& notification_id,
const std::optional<int>& button_index,
const std::optional<std::u16string>& reply) override;
private:
friend class MultiDeviceNotificationPresenterTest;
static const char kWifiSyncNotificationId[];
enum class Status {
kNoNotificationVisible,
kNewUserNotificationVisible,
kExistingUserHostSwitchedNotificationVisible,
kExistingUserNewChromebookNotificationVisible
};
enum class NotificationType {
kNewUserPotentialHostExists = 0,
kExistingUserHostSwitched = 1,
kExistingUserNewChromebookAdded = 2,
kErrorUnknown = 3,
kWifiSyncAnnouncement = 4,
kMaxValue = kWifiSyncAnnouncement
};
static NotificationType GetMetricValueForNotification(
Status notification_status);
static std::string GetNotificationDescriptionForLogging(
Status notification_status);
void ObserveMultiDeviceSetupIfPossible();
void ShowSetupNotification(const Status notification_status,
const std::u16string& title,
const std::u16string& message);
void ShowNotification(const std::string& id,
const std::u16string& title,
const std::u16string& message,
message_center::RichNotificationData optional_fields);
void FlushForTesting();
bool is_setup_notification_interacted_ = false;
raw_ptr<message_center::MessageCenter> message_center_;
Status notification_status_ = Status::kNoNotificationVisible;
mojo::Remote<multidevice_setup::mojom::MultiDeviceSetup>
multidevice_setup_remote_;
mojo::Receiver<multidevice_setup::mojom::AccountStatusChangeDelegate>
receiver_{this};
base::WeakPtrFactory<MultiDeviceNotificationPresenter> weak_ptr_factory_{
this};
};
}
#endif