// 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.
#include "components/system_media_controls/mac/remote_command_center_delegate.h"
#include "base/time/time.h"
#include "components/system_media_controls/mac/remote_command_center_delegate_cocoa.h"
#include "components/system_media_controls/system_media_controls_observer.h"
namespace system_media_controls::internal {
RemoteCommandCenterDelegate::RemoteCommandCenterDelegate() {
remote_command_center_delegate_cocoa_ =
[[RemoteCommandCenterDelegateCocoa alloc] initWithDelegate:this];
}
RemoteCommandCenterDelegate::~RemoteCommandCenterDelegate() {
// Ensure that we unregister from all commands.
SetIsNextEnabled(false);
SetIsPreviousEnabled(false);
SetIsPlayPauseEnabled(false);
SetIsStopEnabled(false);
SetIsSeekToEnabled(false);
}
void RemoteCommandCenterDelegate::SetIsNextEnabled(bool value) {
if (!ShouldSetCommandEnabled(Command::kNextTrack, value))
return;
[remote_command_center_delegate_cocoa_ setCanGoNextTrack:value];
}
void RemoteCommandCenterDelegate::SetIsPreviousEnabled(bool value) {
if (!ShouldSetCommandEnabled(Command::kPreviousTrack, value))
return;
[remote_command_center_delegate_cocoa_ setCanGoPreviousTrack:value];
}
void RemoteCommandCenterDelegate::SetIsPlayPauseEnabled(bool value) {
if (!ShouldSetCommandEnabled(Command::kPlayPause, value))
return;
[remote_command_center_delegate_cocoa_ setCanPlay:value];
[remote_command_center_delegate_cocoa_ setCanPause:value];
[remote_command_center_delegate_cocoa_ setCanPlayPause:value];
}
void RemoteCommandCenterDelegate::SetIsStopEnabled(bool value) {
if (!ShouldSetCommandEnabled(Command::kStop, value))
return;
[remote_command_center_delegate_cocoa_ setCanStop:value];
}
void RemoteCommandCenterDelegate::SetIsSeekToEnabled(bool value) {
if (!ShouldSetCommandEnabled(Command::kSeekTo, value))
return;
[remote_command_center_delegate_cocoa_ setCanSeekTo:value];
}
void RemoteCommandCenterDelegate::OnNext() {
DCHECK(enabled_commands_.contains(Command::kNextTrack));
observer_remote_->OnNext();
}
void RemoteCommandCenterDelegate::OnPrevious() {
DCHECK(enabled_commands_.contains(Command::kPreviousTrack));
observer_remote_->OnPrevious();
}
void RemoteCommandCenterDelegate::OnPlay() {
DCHECK(enabled_commands_.contains(Command::kPlayPause));
observer_remote_->OnPlay();
}
void RemoteCommandCenterDelegate::OnPause() {
DCHECK(enabled_commands_.contains(Command::kPlayPause));
observer_remote_->OnPause();
}
void RemoteCommandCenterDelegate::OnPlayPause() {
DCHECK(enabled_commands_.contains(Command::kPlayPause));
observer_remote_->OnPlayPause();
}
void RemoteCommandCenterDelegate::OnStop() {
DCHECK(enabled_commands_.contains(Command::kStop));
observer_remote_->OnStop();
}
void RemoteCommandCenterDelegate::OnSeekTo(const base::TimeDelta& time) {
DCHECK(enabled_commands_.contains(Command::kSeekTo));
observer_remote_->OnSeekTo(time);
}
void RemoteCommandCenterDelegate::BindObserverRemote(
mojo::PendingRemote<mojom::SystemMediaControlsObserver> remote) {
if (observer_remote_.is_bound()) {
observer_remote_.reset();
}
observer_remote_.Bind(std::move(remote));
DCHECK(observer_remote_.is_bound());
DCHECK(observer_remote_.is_connected());
}
bool RemoteCommandCenterDelegate::ShouldSetCommandEnabled(Command command,
bool will_enable) {
if (will_enable == enabled_commands_.contains(command))
return false;
if (will_enable)
enabled_commands_.insert(command);
else
enabled_commands_.erase(command);
return true;
}
void RemoteCommandCenterDelegate::OnBridgeCreatedForTesting() {
observer_remote_->OnBridgeCreatedForTesting();
}
void RemoteCommandCenterDelegate::OnMetadataClearedForTesting() {
observer_remote_->OnMetadataClearedForTesting();
}
} // namespace system_media_controls::internal