зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
937b72e5c8
Коммит
053826b10f
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче