From dae2202589255ad0b40586f99ce6996869bafa76 Mon Sep 17 00:00:00 2001 From: "bg.chun" Date: Tue, 5 Apr 2016 17:10:15 +0900 Subject: [PATCH] [tizen3.0] add tv inputdevice api Change-Id: Icadc6eab3a2a8f12d0c9bfc27905dabde819913e Signed-off-by: bg.chun --- packaging/webapi-plugins.spec | 8 +- src/tizen-wrt.gyp | 7 + src/tvinputdevice/tvinputdevice.gyp | 32 ++ src/tvinputdevice/tvinputdevice_api.js | 424 +++++++++++++++++++ src/tvinputdevice/tvinputdevice_extension.cc | 30 ++ src/tvinputdevice/tvinputdevice_extension.h | 26 ++ src/tvinputdevice/tvinputdevice_instance.cc | 34 ++ src/tvinputdevice/tvinputdevice_instance.h | 38 ++ 8 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 src/tvinputdevice/tvinputdevice.gyp create mode 100755 src/tvinputdevice/tvinputdevice_api.js create mode 100644 src/tvinputdevice/tvinputdevice_extension.cc create mode 100644 src/tvinputdevice/tvinputdevice_extension.h create mode 100644 src/tvinputdevice/tvinputdevice_instance.cc create mode 100644 src/tvinputdevice/tvinputdevice_instance.h diff --git a/packaging/webapi-plugins.spec b/packaging/webapi-plugins.spec index f3390943..27d94e95 100644 --- a/packaging/webapi-plugins.spec +++ b/packaging/webapi-plugins.spec @@ -112,6 +112,8 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_nbs_support 0 %endif +%define tizen_feature_tvinputdevice_support 0 + %endif # tizen_profile_mobile #################################################################### @@ -193,6 +195,7 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_web_setting_support 0 %define tizen_feature_wi_fi_support 1 %define tizen_feature_inputdevice_support 1 +%define tizen_feature_tvinputdevice_support 0 #- telephony related APIs # CallHistory API is optional in Tizen Wearable Profile. @@ -255,7 +258,8 @@ Source0: %{name}-%{version}.tar.gz %define tizen_feature_time_support 1 %define tizen_feature_web_setting_support 1 %define tizen_feature_wi_fi_support 1 -%define tizen_feature_inputdevice_support 1 +%define tizen_feature_inputdevice_support 0 +%define tizen_feature_tvinputdevice_support 1 %endif # tizen_profile_tv @@ -424,6 +428,7 @@ BuildRequires: pkgconfig(capi-system-sensor) BuildRequires: pkgconfig(capi-system-media-key) %endif + %description Tizen Web APIs implemented. @@ -491,6 +496,7 @@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_time_support=%{?tizen_feature_time_sup GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_inputdevice_support=%{?tizen_feature_inputdevice_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_web_setting_support=%{?tizen_feature_web_setting_support}" GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_wi_fi_support=%{?tizen_feature_wi_fi_support}" +GYP_OPTIONS="$GYP_OPTIONS -Dtizen_feature_tvinputdevice_support=%{?tizen_feature_tvinputdevice_support}" ./tools/gyp/gyp $GYP_OPTIONS src/tizen-wrt.gyp diff --git a/src/tizen-wrt.gyp b/src/tizen-wrt.gyp index 4d2a4837..65659deb 100755 --- a/src/tizen-wrt.gyp +++ b/src/tizen-wrt.gyp @@ -287,6 +287,13 @@ ], }, ], + [ + 'tizen_feature_tvinputdevice_support==1', { + 'dependencies': [ + 'tvinputdevice/tvinputdevice.gyp:*' + ], + }, + ], ], # end conditions }, ], # end targets diff --git a/src/tvinputdevice/tvinputdevice.gyp b/src/tvinputdevice/tvinputdevice.gyp new file mode 100644 index 00000000..9bd3ab0c --- /dev/null +++ b/src/tvinputdevice/tvinputdevice.gyp @@ -0,0 +1,32 @@ +{ + 'includes':[ + '../common/common.gypi', + ], + 'targets': [ + { + 'target_name': 'tizen_tvinputdevice', + 'type': 'loadable_module', + 'dependencies': [ + '../common/common.gyp:tizen_common', + ], + 'sources': [ + 'tvinputdevice_api.js', + 'tvinputdevice_extension.cc', + 'tvinputdevice_extension.h', + 'tvinputdevice_instance.cc', + 'tvinputdevice_instance.h' + ], + 'includes': [ + '../common/pkg-config.gypi', + ], + 'conditions': [ + ['tizen == 1', { + 'variables': { + 'packages': [ + ] + }, + }], + ], + }, + ], +} diff --git a/src/tvinputdevice/tvinputdevice_api.js b/src/tvinputdevice/tvinputdevice_api.js new file mode 100755 index 00000000..b2f34f1b --- /dev/null +++ b/src/tvinputdevice/tvinputdevice_api.js @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var native = new xwalk.utils.NativeManager(extension); +var validator = xwalk.utils.validator; +var types = validator.Types; +var mandatoryMap = { + "ArrowLeft" : { + keyName : "Left", + keyCode : 37 + }, + "ArrowUp" : { + keyName : "Up", + keyCode : 38 + }, + "ArrowRight" : { + keyName : "Right", + keyCode : 39 + }, + "ArrowDown" : { + keyName : "Down", + keyCode : 40 + }, + "Enter" : { + keyName : "Return", + keyCode : 13 + }, + "Back" : { + keyName : "XF86Back", + keyCode : 10009 + }, +}; +var map = { + "VolumeUp": { + keyName: "XF86AudioRaiseVolume", + keyCode: 447 + }, + "VolumeDown": { + keyName: "XF86AudioLowerVolume", + keyCode: 448 + }, + "VolumeMute": { + keyName: "XF86AudioMute", + keyCode: 449 + }, + "ChannelUp": { + keyName: "XF86RaiseChannel", + keyCode: 427 + }, + "ChannelDown": { + keyName: "XF86LowerChannel", + keyCode: 428 + }, + "ColorF0Red": { + keyName: "XF86Red", + keyCode: 403 + }, + "ColorF1Green": { + keyName: "XF86Green", + keyCode: 404 + }, + "ColorF2Yellow": { + keyName: "XF86Yellow", + keyCode: 405 + }, + "ColorF3Blue": { + keyName: "XF86Blue", + keyCode: 406 + }, + "Menu": { + keyName: "XF86SysMenu", + keyCode: 10133 + }, + "Tools": { + keyName: "XF86SimpleMenu", + keyCode: 10135 + }, + "Info": { + keyName: "XF86Info", + keyCode: 457 + }, + "Exit": { + keyName: "XF86Exit", + keyCode: 10182 + }, + "Search": { + keyName: "XF86Search", + keyCode: 10225 + }, + "Guide": { + keyName: "XF86ChannelGuide", + keyCode: 458 + }, + "MediaRewind": { + keyName: "XF86AudioRewind", + keyCode: 412 + }, + "MediaPause": { + keyName: "XF86AudioPause", + keyCode: 19 + }, + "MediaFastForward": { + keyName: "XF86AudioNext", + keyCode: 417 + }, + "MediaRecord": { + keyName: "XF86AudioRecord", + keyCode: 416 + }, + "MediaPlay": { + keyName: "XF86AudioPlay", + keyCode: 415 + }, + "MediaStop": { + keyName: "XF86AudioStop", + keyCode: 413 + }, + "MediaPlayPause": { + keyName: "XF86PlayBack", + keyCode: 10252 + }, + "MediaTrackPrevious": { + keyName: "XF86PreviousChapter", + keyCode: 10232 + }, + "MediaTrackNext": { + keyName: "XF86NextChapter", + keyCode: 10233 + }, + "Source": { + keyName: "XF86Display", + keyCode: 10072 + }, + "PictureSize": { + keyName: "XF86PictureSize", + keyCode: 10140 + }, + "PreviousChannel": { + keyName: "XF86PreviousChannel", + keyCode: 10190 + }, + "ChannelList": { + keyName: "XF86ChannelList", + keyCode: 10073 + }, + "E-Manual": { + keyName: "XF86EManual", + keyCode: 10146 + }, + "MTS": { + keyName: "XF86MTS", + keyCode: 10195 + }, + "3D": { + keyName: "XF863D", + keyCode: 10199 + }, + "Soccer": { + keyName: "XF86SoccerMode", + keyCode: 10228 + }, + "Caption": { + keyName: "XF86Caption", + keyCode: 10221 + }, + "Teletext": { + keyName: "XF86TTXMIX", + keyCode: 10200 + }, + "Extra": { + keyName: "XF86ExtraApp", + keyCode: 10253 + }, + "0": { + keyName: "0", + keyCode: 48 + }, + "1": { + keyName: "1", + keyCode: 49 + }, + "2": { + keyName: "2", + keyCode: 50 + }, + "3": { + keyName: "3", + keyCode: 51 + }, + "4": { + keyName: "4", + keyCode: 52 + }, + "5": { + keyName: "5", + keyCode: 53 + }, + "6": { + keyName: "6", + keyCode: 54 + }, + "7": { + keyName: "7", + keyCode: 55 + }, + "8": { + keyName: "8", + keyCode: 56 + }, + "9": { + keyName: "9", + keyCode: 57 + }, + "Minus": { + keyName: "minus", + keyCode: 189 + }, +}; + + +function TVInputDeviceKey(dict) { + for (var key in dict) { + if (dict.hasOwnProperty(key)) { + Object.defineProperty(this, key, { + value: dict[key], + enumerable: true + }); + } + } + Object.freeze(this); +} + + +/** + * This class provides access to the API functionalities through the tizen.tvinputdevice interface. + * @constructor + */ +function TVInputDeviceManager() { + if (!(this instanceof TVInputDeviceManager)) { + throw new TypeError; + } +} + +/** + * Retrieves the list of keys can be registered with the registerKey() method. + * @return {array} Array of keys + */ +TVInputDeviceManager.prototype.getSupportedKeys = function() { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var re = []; + for (var key in map) { + if (map.hasOwnProperty(key)) { + re.push(new TVInputDeviceKey({name: key, code: map[key].keyCode})); + } + } + + return re; +}; + + +/** + * Returns information about the key which has the given name. + * @param {!string} keyName The key name + * @return {object} Key object + */ +TVInputDeviceManager.prototype.getKey = function(keyName) { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var args = validator.validateArgs(arguments, [ + {name: 'keyName', type: types.STRING} + ]); + + if (map[args.keyName]) { + return new TVInputDeviceKey( { name: args.keyName, code: map[args.keyName].keyCode } ); + } else if (mandatoryMap[args.keyName]) { + return new TVInputDeviceKey( { name: args.keyName, code: mandatoryMap[args.keyName].keyCode } ); + } else { + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, + 'Parameter "keyName" is invalid.'); + } + +}; + + +/** + * Registers an input device key to receive DOM keyboard event when it is pressed or released. + * @param {!string} keyName The key name + */ +TVInputDeviceManager.prototype.registerKey = function(keyName) { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var args = validator.validateArgs(arguments, [ + {name: 'keyName', type: types.STRING} + ]); + if (!map[args.keyName]) { + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, + 'Parameter "keyName" is invalid.'); + } + + var ret = native.sendRuntimeSyncMessage('tizen://api/inputdevice/registerKey', map[args.keyName].keyName); + if (ret === 'error') { + throw new WebAPIException(WebAPIException.UNKNOWN_ERR, 'UnknownError'); + } +}; + + +/** + * Unregisters an input device key. + * @param {!string} keyName The key name + */ +TVInputDeviceManager.prototype.unregisterKey = function(keyName) { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var args = validator.validateArgs(arguments, [ + {name: 'keyName', type: types.STRING} + ]); + + if (!map[args.keyName]) { + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, + 'Parameter "keyName" is invalid.'); + } + + var ret = native.sendRuntimeSyncMessage('tizen://api/inputdevice/unregisterKey', map[args.keyName].keyName); + if (ret === 'error') { + throw new WebAPIException(WebAPIException.UNKNOWN_ERR, 'UnknownError'); + } +}; + +TVInputDeviceManager.prototype.registerKeyBatch = function() { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var args = validator.validateMethod(arguments, [ + { + name: 'keyNames', + type: types.ARRAY, + values: types.STRING + }, + { + name: 'successCallback', + type: types.FUNCTION, + optional: true, + nullable: true + }, + { + name: 'errorCallback', + type: types.FUNCTION, + optional: true, + nullable: true + } + ]); + + var keysList = ""; + for (var i = 0; i < args.keyNames.length; ++i) { + if (!map[args.keyNames[i]]) { + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, + 'Invalid key name: "' + args.keyNames[i] + '"'); + } + keysList += map[args.keyNames[i]].keyName + ((i < args.keyNames.length - 1) ? "," : ""); + } + + setTimeout(function() { + var ret = native.sendRuntimeSyncMessage('tizen://api/inputdevice/registerKeyBatch', keysList); + if (ret === 'error') { + native.callIfPossible(args.errorCallback, new WebAPIException( + WebAPIException.UNKNOWN_ERR, 'Failed to register keys.')); + } else { + native.callIfPossible(args.successCallback); + } + }.bind(this), 0); + }; + + TVInputDeviceManager.prototype.unregisterKeyBatch = function() { + xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.TV_INPUT_DEVICE); + var args = validator.validateMethod(arguments, [ + { + name: 'keyNames', + type: types.ARRAY, + values: types.STRING + }, + { + name: 'successCallback', + type: types.FUNCTION, + optional: true, + nullable: true + }, + { + name: 'errorCallback', + type: types.FUNCTION, + optional: true, + nullable: true + } + ]); + + var keysList = ""; + for (var i = 0; i < args.keyNames.length; ++i) { + if (!map[args.keyNames[i]]) { + throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, + 'Invalid key name: "' + args.keyNames[i] + '"'); + } + keysList += map[args.keyNames[i]].keyName + ((i < args.keyNames.length - 1) ? "," : ""); + } + + setTimeout(function() { + var ret = native.sendRuntimeSyncMessage('tizen://api/inputdevice/unregisterKeyBatch', keysList); + if (ret === 'error') { + native.callIfPossible(args.errorCallback, new WebAPIException( + WebAPIException.UNKNOWN_ERR, 'Failed to unregister keys.')); + } else { + native.callIfPossible(args.successCallback); + } + }.bind(this), 0); + }; + +// Exports +exports = new TVInputDeviceManager(); diff --git a/src/tvinputdevice/tvinputdevice_extension.cc b/src/tvinputdevice/tvinputdevice_extension.cc new file mode 100644 index 00000000..e007872f --- /dev/null +++ b/src/tvinputdevice/tvinputdevice_extension.cc @@ -0,0 +1,30 @@ +// Copyright 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 "../tvinputdevice/tvinputdevice_extension.h" +#include "../tvinputdevice/tvinputdevice_instance.h" + +// This will be generated from tvinputdevice_api.js +extern const char kSource_tvinputdevice_api[]; + +namespace extension { +namespace tvinputdevice { + +TVInputDeviceExtension::TVInputDeviceExtension() { + SetExtensionName("tizen.tvinputdevice"); + SetJavaScriptAPI(kSource_tvinputdevice_api); +} + +TVInputDeviceExtension::~TVInputDeviceExtension() {} + +common::Instance* TVInputDeviceExtension::CreateInstance() { + return new TVInputDeviceInstance; +} + +} // namespace tvinputdevice +} // namespace extension + +common::Extension* CreateExtension() { + return new extension::tvinputdevice::TVInputDeviceExtension; +} diff --git a/src/tvinputdevice/tvinputdevice_extension.h b/src/tvinputdevice/tvinputdevice_extension.h new file mode 100644 index 00000000..8a633f15 --- /dev/null +++ b/src/tvinputdevice/tvinputdevice_extension.h @@ -0,0 +1,26 @@ +// Copyright 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_TVINPUTDEVICE_TVINPUTDEVICE_EXTENSION_H_ +#define SRC_TVINPUTDEVICE_TVINPUTDEVICE_EXTENSION_H_ + +#include "common/extension.h" + +namespace extension { +namespace tvinputdevice { + +class TVInputDeviceExtension : public common::Extension { + public: + TVInputDeviceExtension(); + virtual ~TVInputDeviceExtension(); + + private: + virtual common::Instance* CreateInstance(); +}; + +} // namespace tvinputdevice +} // namespace extension + +#endif // SRC_TVINPUTDEVICE_TVINPUTDEVICE_EXTENSION_H_ + diff --git a/src/tvinputdevice/tvinputdevice_instance.cc b/src/tvinputdevice/tvinputdevice_instance.cc new file mode 100644 index 00000000..67212b53 --- /dev/null +++ b/src/tvinputdevice/tvinputdevice_instance.cc @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "../tvinputdevice/tvinputdevice_instance.h" +#include "common/logger.h" + + +namespace extension { +namespace tvinputdevice { + +TVInputDeviceInstance::TVInputDeviceInstance() { + LoggerD("Enter"); +} + +TVInputDeviceInstance::~TVInputDeviceInstance() { + LoggerD("Enter"); +} + +} // namespace tvinputdevice +} // namespace extension diff --git a/src/tvinputdevice/tvinputdevice_instance.h b/src/tvinputdevice/tvinputdevice_instance.h new file mode 100644 index 00000000..d48248e1 --- /dev/null +++ b/src/tvinputdevice/tvinputdevice_instance.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SRC_TVINPUTDEVICE_TVINPUTDEVICE_INSTANCE_H_ +#define SRC_TVINPUTDEVICE_TVINPUTDEVICE_INSTANCE_H_ + +#include "common/picojson.h" +#include "common/extension.h" + + +namespace extension { +namespace tvinputdevice { + +class TVInputDeviceInstance : public common::ParsedInstance { + public: + TVInputDeviceInstance(); + virtual ~TVInputDeviceInstance(); + + private: +}; + +} // namespace tvinputdevice +} // namespace extension + +#endif // SRC_TVINPUTDEVICE_TVINPUTDEVICE_INSTANCE_H_ -- 2.34.1