| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_SYSTEM_MEDIA_CONTROLS_MAC_REMOTE_COMMAND_CENTER_DELEGATE_H_ |
| #define COMPONENTS_SYSTEM_MEDIA_CONTROLS_MAC_REMOTE_COMMAND_CENTER_DELEGATE_H_ |
| |
| #include "base/containers/flat_set.h" |
| #include "components/system_media_controls/mac/remote_cocoa/system_media_controls.mojom.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/remote.h" |
| |
| @class RemoteCommandCenterDelegateCocoa; |
| |
| namespace base { |
| class TimeDelta; |
| } |
| |
| namespace system_media_controls { |
| |
| class SystemMediaControls; |
| class SystemMediaControlsObserver; |
| |
| namespace internal { |
| |
| // Wraps an NSObject which interfaces with the MPRemoteCommandCenter. |
| // This class can be in-process (browser) or out-of-process (app shim). In both |
| // cases it communicates to the browser about events received from macOS. |
| class RemoteCommandCenterDelegate { |
| public: |
| RemoteCommandCenterDelegate(); |
| |
| RemoteCommandCenterDelegate(const RemoteCommandCenterDelegate&) = delete; |
| RemoteCommandCenterDelegate& operator=(const RemoteCommandCenterDelegate&) = |
| delete; |
| |
| ~RemoteCommandCenterDelegate(); |
| |
| // Part of the implementation of SystemMediaControls. |
| void AddObserver(SystemMediaControlsObserver* observer); |
| void RemoveObserver(SystemMediaControlsObserver* observer); |
| void SetIsNextEnabled(bool value); |
| void SetIsPreviousEnabled(bool value); |
| void SetIsPlayPauseEnabled(bool value); |
| void SetIsStopEnabled(bool value); |
| void SetIsSeekToEnabled(bool value); |
| |
| // Called by `remote_command_center_delegate_cocoa_` when the event happens. |
| // Passes the message back to the browser process via `observer_remote_`. |
| void OnNext(); |
| void OnPrevious(); |
| void OnPause(); |
| void OnPlayPause(); |
| void OnStop(); |
| void OnPlay(); |
| void OnSeekTo(const base::TimeDelta& time); |
| |
| // This rebinds `observer_remote_` to a different listener set. |
| // This is used to account for duplicate dPWAs sharing a single app shim. |
| void BindObserverRemote( |
| mojo::PendingRemote<mojom::SystemMediaControlsObserver> remote); |
| |
| // Notifies the browser process when a SystemMediaControlsBridge is made. |
| void OnBridgeCreatedForTesting(); |
| |
| // Notifies the browser process when the now playing info has been cleared. |
| void OnMetadataClearedForTesting(); |
| |
| private: |
| // Used to track which commands we're already listening for. |
| enum class Command { |
| kStop, |
| kPlayPause, |
| kNextTrack, |
| kPreviousTrack, |
| kSeekTo, |
| }; |
| |
| bool ShouldSetCommandEnabled(Command command, bool will_enable); |
| |
| // Sends messages back to the browser process about events from macOS. |
| mojo::Remote<mojom::SystemMediaControlsObserver> observer_remote_; |
| |
| RemoteCommandCenterDelegateCocoa* __strong |
| remote_command_center_delegate_cocoa_; |
| base::flat_set<Command> enabled_commands_; |
| }; |
| |
| } // namespace internal |
| } // namespace system_media_controls |
| |
| #endif // COMPONENTS_SYSTEM_MEDIA_CONTROLS_MAC_REMOTE_COMMAND_CENTER_DELEGATE_H_ |