| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_DETACHABLE_BASE_DETACHABLE_BASE_NOTIFICATION_CONTROLLER_H_ |
| #define ASH_DETACHABLE_BASE_DETACHABLE_BASE_NOTIFICATION_CONTROLLER_H_ |
| |
| #include "ash/ash_export.h" |
| #include "ash/detachable_base/detachable_base_handler.h" |
| #include "ash/detachable_base/detachable_base_observer.h" |
| #include "ash/public/cpp/session/session_observer.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/scoped_observation.h" |
| |
| namespace ash { |
| |
| // Observes DetachableBaseHandler to detect changes to detachable base state, |
| // and shows relevant notifications as needed: |
| // * when the attached base is different from the last one used by the active |
| // user, it shows a notification warning the user the base has changed, and |
| // that the newly attached base might be malicious (untrusted base might be |
| // tracking the user's key strokes). |
| // * when the attached base could not be authenticated, it warns the user that |
| // the base may not be trusted. |
| // * when the detachable base's firmware has to be updated, it shows a |
| // notification asking user to reboot in order to update the base. This |
| // notification will be shown regardless of the user session state - it will |
| // show up on both the lock and the login screen. |
| class ASH_EXPORT DetachableBaseNotificationController |
| : public DetachableBaseObserver, |
| public SessionObserver { |
| public: |
| static const char kBaseChangedNotificationId[]; |
| static const char kBaseRequiresUpdateNotificationId[]; |
| |
| explicit DetachableBaseNotificationController( |
| DetachableBaseHandler* detachable_base_handler); |
| |
| DetachableBaseNotificationController( |
| const DetachableBaseNotificationController&) = delete; |
| DetachableBaseNotificationController& operator=( |
| const DetachableBaseNotificationController&) = delete; |
| |
| ~DetachableBaseNotificationController() override; |
| |
| // DetachableBaseObserver: |
| void OnDetachableBasePairingStatusChanged( |
| DetachableBasePairingStatus pairing_status) override; |
| void OnDetachableBaseRequiresUpdateChanged(bool requires_update) override; |
| |
| // SessionObserver: |
| void OnActiveUserSessionChanged(const AccountId& account_id) override; |
| void OnSessionStateChanged(session_manager::SessionState state) override; |
| |
| private: |
| // Called when the session state or detachable base pairing state change. |
| // Determines whether the current state requires showing a notification to the |
| // user, and show kBaseChangedNotificationId if that is the case. |
| void ShowPairingNotificationIfNeeded(); |
| |
| // Removes kBaseChangedNotificationId notification if it was previously shown |
| // within the current session. |
| void RemovePairingNotification(); |
| |
| // Removes kBaseRequiresUpdateNotificationId if it was previously shown. |
| void RemoveUpdateRequiredNotification(); |
| |
| raw_ptr<DetachableBaseHandler> detachable_base_handler_; |
| |
| base::ScopedObservation<DetachableBaseHandler, DetachableBaseObserver> |
| detachable_base_observation_{this}; |
| ScopedSessionObserver session_observer_{this}; |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_DETACHABLE_BASE_DETACHABLE_BASE_NOTIFICATION_CONTROLLER_H_ |