Bug 1620340 - part1: Implement SetMediaMetadata() for the MPRISServiceHandler, r=alwu

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Marc Streckfuss 2020-03-11 15:47:09 +00:00
parent 85fc50fbee
commit 673ce25897
2 changed files with 31 additions and 29 deletions

View File

@ -266,13 +266,7 @@ static GVariant* HandleGetProperty(GDBusConnection* aConnection,
"Invalid Playback Status");
return nullptr;
case Property::eGetMetadata:
std::vector<struct MPRISMetadata> list = handler->GetDefaultMetadata();
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
for (auto const& data : list) {
g_variant_builder_add(&builder, "{sv}", data.mKey, data.mValue);
}
return g_variant_builder_end(&builder);
return handler->GetMetadataAsGVariant();
}
MOZ_ASSERT_UNREACHABLE("Switch Statement incomplete");
@ -606,6 +600,31 @@ GVariant* MPRISServiceHandler::GetPlaybackStatus() const {
}
}
void MPRISServiceHandler::SetMediaMetadata(
const dom::MediaMetadataBase& aMetadata) {
mMetadata = Some(aMetadata);
}
GVariant* MPRISServiceHandler::GetMetadataAsGVariant() const {
GVariantBuilder builder;
g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));
g_variant_builder_add(&builder, "{sv}", "mpris:trackid",
g_variant_new("o", "/valid/path"));
if (mMetadata.isSome()) {
g_variant_builder_add(
&builder, "{sv}", "xesam:title",
g_variant_new_string(NS_ConvertUTF16toUTF8(mMetadata->mTitle).get()));
GVariantBuilder artistBuilder; // Artists is a list.
g_variant_builder_init(&artistBuilder, G_VARIANT_TYPE("as"));
g_variant_builder_add(&artistBuilder, "s",
NS_ConvertUTF16toUTF8(mMetadata->mArtist).get());
g_variant_builder_add(&builder, "{sv}", "xesam:artist",
g_variant_builder_end(&artistBuilder));
}
return g_variant_builder_end(&builder);
}
void MPRISServiceHandler::EmitEvent(mozilla::dom::MediaControlKeysEvent event) {
for (auto& listener : mListeners) {
listener->OnKeyPressed(event);
@ -658,20 +677,5 @@ bool MPRISServiceHandler::OpenUri(char* aUri) {
return false;
}
std::vector<struct MPRISMetadata> MPRISServiceHandler::GetDefaultMetadata() {
std::vector<struct MPRISMetadata> list;
list.push_back({"mpris:trackid", g_variant_new("o", "/valid/path")});
list.push_back({"xesam:title", g_variant_new_string("Firefox")});
GVariantBuilder artistBuilder; // Artists is a list.
g_variant_builder_init(&artistBuilder, G_VARIANT_TYPE("as"));
g_variant_builder_add(&artistBuilder, "s", "Mozilla");
GVariant* artists = g_variant_builder_end(&artistBuilder);
list.push_back({"xesam:artist", artists});
return list;
}
} // namespace widget
} // namespace mozilla

View File

@ -18,11 +18,6 @@
namespace mozilla {
namespace widget {
struct MPRISMetadata {
const char* mKey;
GVariant* mValue;
};
/**
* This class implements the "MPRIS" D-Bus Service
* (https://specifications.freedesktop.org/mpris-spec/2.2),
@ -114,7 +109,6 @@ class MPRISServiceHandler final : public dom::MediaControlKeysEventSource {
void SetShuffle(bool aShuffle);
#endif
std::vector<struct MPRISMetadata> GetDefaultMetadata();
double GetVolume() const;
bool SetVolume(double aVolume);
int64_t GetPosition() const;
@ -126,6 +120,9 @@ class MPRISServiceHandler final : public dom::MediaControlKeysEventSource {
bool CanSeek() const;
bool CanControl() const;
void SetMediaMetadata(const dom::MediaMetadataBase& aMetadata) override;
GVariant* GetMetadataAsGVariant() const;
private:
~MPRISServiceHandler();
@ -142,6 +139,7 @@ class MPRISServiceHandler final : public dom::MediaControlKeysEventSource {
GDBusConnection* mConnection = nullptr;
bool mInitialized = false;
nsAutoCString mIdentity;
Maybe<dom::MediaMetadataBase> mMetadata;
// Queries nsAppInfo to get the branded browser name and vendor
void InitIdentity();
@ -158,7 +156,7 @@ class MPRISServiceHandler final : public dom::MediaControlKeysEventSource {
static void OnBusAcquiredStatic(GDBusConnection* aConnection,
const gchar* aName, gpointer aUserData);
void EmitEvent(mozilla::dom::MediaControlKeysEvent event);
void EmitEvent(dom::MediaControlKeysEvent event);
};
} // namespace widget