Bug 1604653 - add new methods to set and get playback state for the event source. r=MeFisto94

Differential Revision: https://phabricator.services.mozilla.com/D58159

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Alastor Wu 2019-12-31 14:10:53 +00:00
Родитель 937b72e5c8
Коммит 053826b10f
6 изменённых файлов: 73 добавлений и 0 удалений

Просмотреть файл

@ -13,6 +13,8 @@
namespace mozilla {
namespace dom {
using PlaybackState = MediaControlKeysEventSource::PlaybackState;
// avoid redefined macro in unified build
#undef LOG_SOURCE
#define LOG_SOURCE(msg, ...) \
@ -92,5 +94,17 @@ void MediaControlKeysEventSource::Close() {
mListeners.Clear();
}
void MediaControlKeysEventSource::SetPlaybackState(PlaybackState aState) {
if (mPlaybackState == aState) {
return;
}
LOG_SOURCE("SetPlaybackState '%s'", ToPlaybackStateEventStr(aState));
mPlaybackState = aState;
}
PlaybackState MediaControlKeysEventSource::GetPlaybackState() const {
return mPlaybackState;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -70,6 +70,14 @@ class MediaControlKeysEventSource {
NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
MediaControlKeysEventSource() = default;
// This is used to indicate current media playback state. For those platforms
// which have virtual control interface, we have to update the playback state
// correctly in order to show the correct control icon on the interface.
enum class PlaybackState : uint8_t {
ePaused,
ePlayed,
};
virtual void AddListener(MediaControlKeysEventListener* aListener);
virtual void RemoveListener(MediaControlKeysEventListener* aListener);
size_t GetListenersNum() const;
@ -80,9 +88,13 @@ class MediaControlKeysEventSource {
virtual void Close();
virtual bool IsOpened() const = 0;
virtual void SetPlaybackState(PlaybackState aState);
virtual PlaybackState GetPlaybackState() const;
protected:
virtual ~MediaControlKeysEventSource() = default;
nsTArray<RefPtr<MediaControlKeysEventListener>> mListeners;
PlaybackState mPlaybackState = PlaybackState::ePaused;
};
} // namespace dom

Просмотреть файл

@ -20,6 +20,8 @@
namespace mozilla {
namespace dom {
using PlaybackState = MediaControlKeysEventSource::PlaybackState;
bool MediaControlKeysManager::IsOpened() const {
// As MediaControlKeysManager represents a platform-indenpendent event source,
// which we can use to add other listeners to moniter media key events, we
@ -60,6 +62,7 @@ void MediaControlKeysManager::StartMonitoringControlKeys() {
if (mEventSource && !mEventSource->IsOpened()) {
LOG("StartMonitoringControlKeys");
mEventSource->Open();
mEventSource->SetPlaybackState(mPlaybackState);
mEventSource->AddListener(this);
}
}
@ -87,5 +90,19 @@ void MediaControlKeysManager::OnKeyPressed(MediaControlKeysEvent aKeyEvent) {
}
}
void MediaControlKeysManager::SetPlaybackState(PlaybackState aState) {
if (mEventSource) {
mEventSource->SetPlaybackState(aState);
} else {
// If the event source haven't been created, we have to cache the state,
// then set the event source's state again when it's created.
mPlaybackState = aState;
}
}
PlaybackState MediaControlKeysManager::GetPlaybackState() const {
return mEventSource ? mEventSource->GetPlaybackState() : mPlaybackState;
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -30,6 +30,9 @@ class MediaControlKeysManager final : public MediaControlKeysEventSource,
bool Open() override;
bool IsOpened() const override;
void SetPlaybackState(PlaybackState aState) override;
PlaybackState GetPlaybackState() const override;
// MediaControlKeysEventListener methods
void OnKeyPressed(MediaControlKeysEvent aKeyEvent) override;

Просмотреть файл

@ -65,6 +65,19 @@ ConvertMediaControlKeysTestEventToMediaControlKeysEvent(
}
}
inline const char* ToPlaybackStateEventStr(
MediaControlKeysEventSource::PlaybackState aState) {
switch (aState) {
case MediaControlKeysEventSource::PlaybackState::ePlayed:
return "Played";
case MediaControlKeysEventSource::PlaybackState::ePaused:
return "Paused";
default:
MOZ_ASSERT_UNREACHABLE("Invalid playback state.");
return "Unknown";
}
}
void NotifyMediaStarted(uint64_t aWindowID);
void NotifyMediaStopped(uint64_t aWindowID);
void NotifyMediaAudibleChanged(uint64_t aWindowID, bool aAudible);

Просмотреть файл

@ -6,6 +6,7 @@
#include "MediaControlKeysEvent.h"
using namespace mozilla::dom;
using PlaybackState = MediaControlKeysEventSource::PlaybackState;
class MediaControlKeysEventSourceTestImpl : public MediaControlKeysEventSource {
public:
@ -32,3 +33,16 @@ TEST(MediaControlKeysEvent, TestAddOrRemoveListener)
source->RemoveListener(listener);
ASSERT_TRUE(source->GetListenersNum() == 0);
}
TEST(MediaControlKeysEvent, SetSourcePlaybackState)
{
RefPtr<MediaControlKeysEventSource> source =
new MediaControlKeysEventSourceTestImpl();
ASSERT_TRUE(source->GetPlaybackState() == PlaybackState::ePaused);
source->SetPlaybackState(PlaybackState::ePlayed);
ASSERT_TRUE(source->GetPlaybackState() == PlaybackState::ePlayed);
source->SetPlaybackState(PlaybackState::ePaused);
ASSERT_TRUE(source->GetPlaybackState() == PlaybackState::ePaused);
}