123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #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 "ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
- #include "base/auto_reset.h"
- #include "base/callback.h"
- #include "base/memory/weak_ptr.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 message_center
- namespace ash {
- // Presents notifications necessary for MultiDevice setup flow. It observes the
- // MultiDeviceSetup mojo service to show a notification when
- // (1) a potential host is found for someone who has not gone through the setup
- // flow before,
- // (2) the host has switched for someone who has, or
- // (3) a new Chromebook has been added to an account for someone who has.
- //
- // The behavior caused by clicking a notification depends its content as
- // described above:
- // (1) triggers the setup UI to appear to prompt setup flow and
- // (2) & (3) open the Connected Devices subpage in Settings.
- //
- // Note that if one notification is showing and another one is triggered, the
- // old text is replaced (if it's different) and the notification pops up again.
- 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;
- // Disables notifications for tests.
- static std::unique_ptr<base::AutoReset<bool>>
- DisableNotificationsForTesting();
- // Removes the notification created by NotifyPotentialHostExists() or does
- // nothing if that notification is not currently displayed.
- void RemoveMultiDeviceSetupNotification();
- protected:
- // multidevice_setup::mojom::AccountStatusChangeDelegate:
- 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;
- // SessionObserver:
- void OnUserSessionAdded(const AccountId& account_id) override;
- void OnSessionStateChanged(session_manager::SessionState state) override;
- // message_center::MessageCenterObserver
- void OnNotificationRemoved(const std::string& notification_id,
- bool by_user) override;
- void OnNotificationClicked(
- const std::string& notification_id,
- const absl::optional<int>& button_index,
- const absl::optional<std::u16string>& reply) override;
- private:
- friend class MultiDeviceNotificationPresenterTest;
- // MultiDevice setup notification ID.
- static const char kSetupNotificationId[];
- static const char kWifiSyncNotificationId[];
- // Represents each possible MultiDevice setup notification that the setup flow
- // can show with a "none" option for the general state with no notification
- // present.
- enum class Status {
- kNoNotificationVisible,
- kNewUserNotificationVisible,
- kExistingUserHostSwitchedNotificationVisible,
- kExistingUserNewChromebookNotificationVisible
- };
- // Reflects MultiDeviceSetupNotification enum in enums.xml. Do not
- // rearrange.
- enum class NotificationType {
- kNewUserPotentialHostExists = 0,
- kExistingUserHostSwitched = 1,
- kExistingUserNewChromebookAdded = 2,
- // This is a legacy error case that is not expected to occur.
- 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();
- message_center::MessageCenter* message_center_;
- // Notification currently showing or
- // Status::kNoNotificationVisible if there isn't one.
- 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};
- };
- } // namespace ash
- #endif // ASH_MULTI_DEVICE_SETUP_MULTI_DEVICE_NOTIFICATION_PRESENTER_H_
|