| // Copyright 2017 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_TRAY_ACTION_TRAY_ACTION_H_ |
| #define ASH_TRAY_ACTION_TRAY_ACTION_H_ |
| |
| #include <memory> |
| |
| #include "ash/ash_export.h" |
| #include "ash/public/mojom/tray_action.mojom.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/observer_list.h" |
| #include "base/scoped_observation.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver_set.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| #include "ui/events/devices/device_data_manager.h" |
| #include "ui/events/devices/input_device_event_observer.h" |
| |
| namespace ui { |
| enum class StylusState; |
| } // namespace ui |
| |
| namespace ash { |
| |
| class BacklightsForcedOffSetter; |
| class LockScreenNoteDisplayStateHandler; |
| class TrayActionObserver; |
| |
| // Controller that ash can use to request a predefined set of actions to be |
| // performed by clients. |
| // The controller provides an interface to: |
| // * Send a request to the client to handle an action. |
| // * Observe the state of support for an action as reported by the current ash |
| // client. |
| // Currently, only single action is supported - creating new note on the lock |
| // screen - Chrome handles this action by launching an app (if any) that is |
| // registered as a lock screen enabled action handler for the new note action. |
| class ASH_EXPORT TrayAction : public mojom::TrayAction, |
| public ui::InputDeviceEventObserver { |
| public: |
| explicit TrayAction(BacklightsForcedOffSetter* backlights_forced_off_setter); |
| |
| TrayAction(const TrayAction&) = delete; |
| TrayAction& operator=(const TrayAction&) = delete; |
| |
| ~TrayAction() override; |
| |
| LockScreenNoteDisplayStateHandler* |
| lock_screen_note_display_state_handler_for_test() { |
| return lock_screen_note_display_state_handler_.get(); |
| } |
| |
| void AddObserver(TrayActionObserver* observer); |
| void RemoveObserver(TrayActionObserver* observer); |
| |
| void BindReceiver(mojo::PendingReceiver<mojom::TrayAction> receiver); |
| |
| // Gets last known handler state for the lock screen note action. |
| // It will return kNotAvailable if an action handler has not been set using |
| // |SetClient|. |
| mojom::TrayActionState GetLockScreenNoteState() const; |
| |
| // Helper method for determining if lock screen not action is in active state. |
| bool IsLockScreenNoteActive() const; |
| |
| // If the client is set, sends it a request to handle the lock screen note |
| // action. |
| void RequestNewLockScreenNote(mojom::LockScreenNoteOrigin origin); |
| |
| // If the client is set, sends a request to close the lock screen note. |
| void CloseLockScreenNote(mojom::CloseLockScreenNoteReason reason); |
| |
| // mojom::TrayAction: |
| void SetClient(mojo::PendingRemote<mojom::TrayActionClient> action_handler, |
| mojom::TrayActionState lock_screen_note_state) override; |
| void UpdateLockScreenNoteState(mojom::TrayActionState state) override; |
| |
| // ui::InputDeviceEventObserver: |
| void OnStylusStateChanged(ui::StylusState state) override; |
| |
| void FlushMojoForTesting(); |
| |
| private: |
| // Notifies the observers that state for the lock screen note action has been |
| // updated. |
| void NotifyLockScreenNoteStateChanged(); |
| |
| const raw_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_; |
| |
| // Last known state for lock screen note action. |
| mojom::TrayActionState lock_screen_note_state_ = |
| mojom::TrayActionState::kNotAvailable; |
| |
| std::unique_ptr<LockScreenNoteDisplayStateHandler> |
| lock_screen_note_display_state_handler_; |
| |
| base::ObserverList<TrayActionObserver>::Unchecked observers_; |
| |
| // Receivers for users of the mojo interface. |
| mojo::ReceiverSet<mojom::TrayAction> receivers_; |
| |
| mojo::Remote<mojom::TrayActionClient> tray_action_client_; |
| |
| base::ScopedObservation<ui::DeviceDataManager, ui::InputDeviceEventObserver> |
| stylus_observation_{this}; |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_TRAY_ACTION_TRAY_ACTION_H_ |