From: Piotr Czaja Date: Tue, 3 Feb 2015 13:22:24 +0000 (+0100) Subject: [MediaKey] Media Key plugin implementation X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~273 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0f1fbe87f4aaa85bc91cbaecc60064682ea06de0;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [MediaKey] Media Key plugin implementation Change-Id: I8809fffcdc9f26056891f079578ccad24cfb784e Signed-off-by: Piotr Czaja (cherry picked from commit 4fa8e41737600982834f219cd71e03fac9acc031) --- diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index 01d1a7f3..16e18831 100755 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -34,6 +34,7 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_exif_support 1 %define tizen_feature_filesystem_support 1 %define tizen_feature_fm_radio_support 0 +%define tizen_feature_media_key_support 1 %define tizen_feature_message_port_support 1 %define tizen_feature_messaging_support 1 %define tizen_feature_nbs_support 1 @@ -81,6 +82,7 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_exif_support 0 %define tizen_feature_filesystem_support 0 %define tizen_feature_fm_radio_support 0 +%define tizen_feature_media_key_support 0 %define tizen_feature_message_port_support 0 %define tizen_feature_messaging_support 0 %define tizen_feature_nbs_support 0 @@ -128,6 +130,7 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_exif_support 1 %define tizen_feature_filesystem_support 1 %define tizen_feature_fm_radio_support 0 +%define tizen_feature_media_key_support 0 %define tizen_feature_message_port_support 1 %define tizen_feature_messaging_support 0 %define tizen_feature_nbs_support 0 @@ -299,6 +302,10 @@ BuildRequires: pkgconfig(capi-system-sensor) %endif +%if 0%{?tizen_feature_media_key_support} +BuildRequires: pkgconfig(capi-system-media-key) +%endif + %description Tizen Web APIs implemented. @@ -329,6 +336,7 @@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_download_support=%{?tizen_feature_down GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_exif_support=%{?tizen_feature_exif_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_filesystem_support=%{?tizen_feature_filesystem_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_fm_radio_support=%{?tizen_feature_fm_radio_support}" +GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_media_key_support=%{?tizen_feature_media_key_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_message_port_support=%{?tizen_feature_message_port_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_messaging_support=%{?tizen_feature_messaging_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_nbs_support=%{?tizen_feature_nbs_support}" diff --git a/src/mediakey/mediakey.gyp b/src/mediakey/mediakey.gyp new file mode 100644 index 00000000..9d2a2fe0 --- /dev/null +++ b/src/mediakey/mediakey.gyp @@ -0,0 +1,32 @@ +{ + 'includes':[ + '../common/common.gypi', + ], + 'targets': [ + { + 'target_name': 'tizen_mediakey', + 'type': 'loadable_module', + 'sources': [ + 'mediakey_api.js', + 'mediakey_extension.cc', + 'mediakey_extension.h', + 'mediakey_instance.cc', + 'mediakey_instance.h', + 'mediakey_manager.cc', + 'mediakey_manager.h' + ], + 'includes': [ + '../common/pkg-config.gypi', + ], + 'conditions': [ + ['tizen == 1', { + 'variables': { + 'packages': [ + 'capi-system-media-key', + ] + }, + }], + ], + }, + ], +} diff --git a/src/mediakey/mediakey_api.js b/src/mediakey/mediakey_api.js new file mode 100644 index 00000000..feae3b42 --- /dev/null +++ b/src/mediakey/mediakey_api.js @@ -0,0 +1,55 @@ +// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var validator = xwalk.utils.validator; +var type = xwalk.utils.type; +var native = new xwalk.utils.NativeManager(extension); +var converter_ = xwalk.utils.converter; + +var ON_PRESSED_MEDIA_KEY_EVENT_CALLBACK = 'onPressedMediaKeyEventCallback'; +var ON_RELEASED_MEDIA_KEY_EVENT_CALLBACK = 'onReleasedMediaKeyEventCallback'; + +function MediaKeyManager() { + validator.isConstructorCall(this, MediaKeyManager); +} + +MediaKeyManager.prototype.setMediaKeyEventListener = function(callback) { + var args = validator.validateArgs(arguments, [ + { + name: 'callback', + type: validator.Types.LISTENER, + values: ['onpressed', 'onreleased'] + } + ]); + + var ret = native.callSync('MediaKeyManager_setMediaKeyEventListener', {}); + + if (native.isFailure(ret)) { + throw native.getErrorObject(ret); + } + + native.removeListener(ON_PRESSED_MEDIA_KEY_EVENT_CALLBACK); + native.removeListener(ON_RELEASED_MEDIA_KEY_EVENT_CALLBACK); + + native.addListener(ON_PRESSED_MEDIA_KEY_EVENT_CALLBACK, function(msg) { + native.callIfPossible(args.callback.onpressed, native.getResultObject(msg.type)); + }); + native.addListener(ON_RELEASED_MEDIA_KEY_EVENT_CALLBACK, function(msg) { + native.callIfPossible(args.callback.onpressed, native.getResultObject(msg.type)); + }); + +}; + +MediaKeyManager.prototype.unsetMediaKeyEventListener = function() { + var ret = native.callSync('MediaKeyManager_unsetMediaKeyEventListener',{}); + + if (native.isFailure(ret)) { + throw native.getErrorObject(ret); + } + + native.removeListener(ON_PRESSED_MEDIA_KEY_EVENT_CALLBACK); + native.removeListener(ON_RELEASED_MEDIA_KEY_EVENT_CALLBACK); +}; + +exports = new MediaKeyManager(); diff --git a/src/mediakey/mediakey_extension.cc b/src/mediakey/mediakey_extension.cc new file mode 100644 index 00000000..afc29654 --- /dev/null +++ b/src/mediakey/mediakey_extension.cc @@ -0,0 +1,34 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mediakey/mediakey_extension.h" +#include "mediakey/mediakey_instance.h" +#include "mediakey/mediakey_manager.h" + +// This will be generated from mediakey_api.js. +extern const char kSource_mediakey_api[]; + +namespace extension { +namespace mediakey { + +MediaKeyExtension::MediaKeyExtension() { + SetExtensionName("tizen.mediakey"); + SetJavaScriptAPI(kSource_mediakey_api); +} + +MediaKeyExtension::~MediaKeyExtension() { +} + +common::Instance* MediaKeyExtension::CreateInstance() { + return new MediaKeyInstance(); +} + +} // namespace mediakey +} // namespace extension + +// entry point +common::Extension* CreateExtension() { + return new extension::mediakey::MediaKeyExtension(); +} + diff --git a/src/mediakey/mediakey_extension.h b/src/mediakey/mediakey_extension.h new file mode 100644 index 00000000..4b3ea4d3 --- /dev/null +++ b/src/mediakey/mediakey_extension.h @@ -0,0 +1,27 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SRC_MEDIAKEY_MEDIAKEY_EXTENSION_H_ +#define SRC_MEDIAKEY_MEDIAKEY_EXTENSION_H_ + +#include "common/extension.h" + +namespace extension { +namespace mediakey { + +class MediaKeyManager; + +class MediaKeyExtension : public common::Extension { + public: + MediaKeyExtension(); + virtual ~MediaKeyExtension(); + + private: + virtual common::Instance* CreateInstance(); +}; + +} // namespace mediakey +} // namespace extension + +#endif // SRC_MEDIAKEY_MEDIAKEY_EXTENSION_H_ diff --git a/src/mediakey/mediakey_instance.cc b/src/mediakey/mediakey_instance.cc new file mode 100644 index 00000000..9d25b6c6 --- /dev/null +++ b/src/mediakey/mediakey_instance.cc @@ -0,0 +1,92 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include "common/logger.h" +#include "mediakey/mediakey_instance.h" +#include "mediakey/mediakey_manager.h" + +namespace extension { +namespace mediakey { + +const std::map kMediaKeyTypeMap = { + { MEDIA_KEY_PLAY, "MEDIA_PLAY" }, + { MEDIA_KEY_STOP, "MEDIA_STOP" }, + { MEDIA_KEY_PAUSE, "MEDIA_PAUSE" }, + { MEDIA_KEY_PREVIOUS, "MEDIA_PREVIOUS" }, + { MEDIA_KEY_NEXT, "MEDIA_NEXT" }, + { MEDIA_KEY_FASTFORWARD, "MEDIA_FAST_FORWARD" }, + { MEDIA_KEY_REWIND, "MEDIA_REWIND" }, + { MEDIA_KEY_PLAYPAUSE, "MEDIA_PLAY_PAUSE" } }; + +MediaKeyInstance::MediaKeyInstance() { + LoggerD("Entered"); + using std::placeholders::_1; + using std::placeholders::_2; +#define REGISTER_SYNC(c, x) \ + RegisterSyncHandler(c, std::bind(&MediaKeyInstance::x, this, _1, _2)); + REGISTER_SYNC("MediaKeyManager_setMediaKeyEventListener", + SetMediaKeyEventListener); + REGISTER_SYNC("MediaKeyManager_unsetMediaKeyEventListener", + UnsetMediaKeyEventListener); +#undef REGISTER_SYNC +} + +MediaKeyInstance::~MediaKeyInstance() { + LoggerD("Entered"); +} + +void MediaKeyInstance::SetMediaKeyEventListener(const picojson::value& args, + picojson::object& out) { + common::PlatformResult result = MediaKeyManager::GetInstance() + .RegisterMediaKeyEventListener(this); + if (result.IsError()) { + LOGD("Error occured"); + ReportError(result, &out); + } else { + ReportSuccess(out); + } +} + +void MediaKeyInstance::UnsetMediaKeyEventListener(const picojson::value& args, + picojson::object& out) { + common::PlatformResult result = MediaKeyManager::GetInstance() + .UnregisterMediaKeyEventListener(); + if (result.IsError()) { + LOGD("Error occured"); + ReportError(result, &out); + } else { + ReportSuccess(out); + } +} + +void MediaKeyInstance::OnPressedMediaKeyEventCallback(media_key_e type) { + LoggerD("Enter"); + PostEvent("onPressedMediaKeyEventCallback", type); +} + +void MediaKeyInstance::OnReleasedMediaKeyEventCallback(media_key_e type) { + LoggerD("Enter"); + PostEvent("onReleasedMediaKeyEventCallback", type); +} + +void MediaKeyInstance::PostEvent(const std::string& eventCallback, + media_key_e type) { + LoggerD("Enter"); + auto k = kMediaKeyTypeMap.find(type); + if (k != kMediaKeyTypeMap.end()) { + picojson::value event = picojson::value(picojson::object()); + picojson::object& obj = event.get(); + obj["listenerId"] = picojson::value(eventCallback); + obj["type"] = picojson::value(k->second); + PostMessage(event.serialize().c_str()); + } + else { + LoggerD("Unsupported key"); + } +} + +} // namespace mediakey +} // namespace extension diff --git a/src/mediakey/mediakey_instance.h b/src/mediakey/mediakey_instance.h new file mode 100644 index 00000000..e88f67cc --- /dev/null +++ b/src/mediakey/mediakey_instance.h @@ -0,0 +1,36 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SRC_MEDIAKEY_MEDIAKEY_INSTANCE_H_ +#define SRC_MEDIAKEY_MEDIAKEY_INSTANCE_H_ + +#include + +#include "common/extension.h" +#include "common/picojson.h" + +#include "mediakey/mediakey_manager.h" + +namespace extension { +namespace mediakey { + +class MediaKeyInstance : public common::ParsedInstance, public MediaKeyListener { + public: + MediaKeyInstance(); + virtual ~MediaKeyInstance(); + + private: + void SetMediaKeyEventListener(const picojson::value& args, + picojson::object& out); + void UnsetMediaKeyEventListener(const picojson::value& args, + picojson::object& out); + virtual void OnPressedMediaKeyEventCallback(media_key_e type); + virtual void OnReleasedMediaKeyEventCallback(media_key_e type); + void PostEvent(const std::string& event, media_key_e type); +}; + +} // namespace mediakey +} // namespace extension + +#endif // SRC_MEDIAKEY_MEDIAKEY_INSTANCE_H_ diff --git a/src/mediakey/mediakey_manager.cc b/src/mediakey/mediakey_manager.cc new file mode 100644 index 00000000..c94190e6 --- /dev/null +++ b/src/mediakey/mediakey_manager.cc @@ -0,0 +1,81 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mediakey/mediakey_manager.h" +#include "common/logger.h" +#include "common/platform_exception.h" + +namespace extension { +namespace mediakey { + +using common::UnknownException; +using common::ErrorCode; +MediaKeyListener::~MediaKeyListener() { + LoggerD("Enter"); +} + +MediaKeyManager& MediaKeyManager::GetInstance() { + static MediaKeyManager manager; + return manager; +} + +MediaKeyManager::MediaKeyManager() + : m_media_key_listener_registered(false) { + LoggerD("Enter"); +} + +common::PlatformResult MediaKeyManager::RegisterMediaKeyEventListener( + MediaKeyListener* listener) { + LoggerD("Enter"); + if (!m_media_key_listener_registered) { + int ret = media_key_reserve(MediaKeyEventCallback, NULL); + if (MEDIA_KEY_ERROR_NONE != ret) { + LoggerD("Failed to register " + "a media keys change event callback: %d", + ret); + return common::PlatformResult( + ErrorCode::UNKNOWN_ERR, + "Failed to register a media keys change event callback"); + } + m_media_key_listener = listener; + m_media_key_listener_registered = true; + LOGD("Added media keys change event callback"); + } + return common::PlatformResult(ErrorCode::NO_ERROR); +} +common::PlatformResult MediaKeyManager::UnregisterMediaKeyEventListener() { + LoggerD("Enter"); + if (m_media_key_listener_registered) { + int ret = media_key_release(); + if (MEDIA_KEY_ERROR_NONE != ret) { + LoggerD("Failed to unregister " + "the change event callback function: %d", + ret); + return common::PlatformResult( + ErrorCode::UNKNOWN_ERR, + "Failed to unregister the change event callback function"); + } + } + m_media_key_listener = NULL; + m_media_key_listener_registered = false; + return common::PlatformResult(ErrorCode::NO_ERROR); +} + +void MediaKeyManager::MediaKeyEventCallback(media_key_e key, + media_key_event_e status, + void* user_data) { + LoggerD("Enter"); + if (!GetInstance().m_media_key_listener) { + LOGD("Listener is null. Ignoring"); + return; + } + if (MEDIA_KEY_STATUS_PRESSED == status) { + GetInstance().m_media_key_listener->OnPressedMediaKeyEventCallback(key); + } else if (MEDIA_KEY_STATUS_RELEASED == status) { + GetInstance().m_media_key_listener->OnReleasedMediaKeyEventCallback(key); + } +} + +} // namespace mediakey +} // namespace extension diff --git a/src/mediakey/mediakey_manager.h b/src/mediakey/mediakey_manager.h new file mode 100644 index 00000000..a204d657 --- /dev/null +++ b/src/mediakey/mediakey_manager.h @@ -0,0 +1,44 @@ +// Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include "common/platform_result.h" + +#ifndef SRC_MEDIAKEY_MEDIAKEY_MANAGER_H_ +#define SRC_MEDIAKEY_MEDIAKEY_MANAGER_H_ + +namespace extension { +namespace mediakey { + +class MediaKeyListener { + public: + virtual void OnPressedMediaKeyEventCallback(media_key_e type)= 0; + virtual void OnReleasedMediaKeyEventCallback(media_key_e type)= 0; + virtual ~MediaKeyListener(); +}; + +class MediaKeyManager { + public: + common::PlatformResult RegisterMediaKeyEventListener( + MediaKeyListener* listener); + common::PlatformResult UnregisterMediaKeyEventListener(); + static MediaKeyManager& GetInstance(); + static void MediaKeyEventCallback(media_key_e key, media_key_event_e status, + void* user_data); + + private: + // Not copyable, assignable, movable + MediaKeyManager(MediaKeyManager const&) = delete; + void operator=(MediaKeyManager const&) = delete; + MediaKeyManager(MediaKeyManager &&) = delete; + + MediaKeyManager(); + MediaKeyListener* m_media_key_listener; + bool m_media_key_listener_registered; +}; + +} // namespace mediakey +} // namespace extension + +#endif // SRC_MEDIAKEY_MEDIAKEY_MANAGER_H_ diff --git a/src/tizen-wrt.gyp b/src/tizen-wrt.gyp index 9883326a..e25042ec 100755 --- a/src/tizen-wrt.gyp +++ b/src/tizen-wrt.gyp @@ -131,6 +131,13 @@ ], }, ], + [ + 'tizen_feature_media_key_support==1', { + 'dependencies': [ + 'mediakey/mediakey.gyp:*', + ], + }, + ], [ 'tizen_feature_message_port_support==1', { 'dependencies': [