2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var _global = window || global || {};
19 var utils_ = xwalk.utils;
20 var type_ = utils_.type;
21 var converter_ = utils_.converter;
22 var validator_ = utils_.validator;
23 var types_ = validator_.Types;
24 var native_ = new xwalk.utils.NativeManager(extension);
26 function ListenerManager(native, listenerName, handle) {
28 this.listenerNameToIds = {};
29 this.listenerIdToName = {};
31 this.nativeSet = false;
33 this.listenerName = listenerName;
34 this.handle = handle || function(msg, listener, watchId) {};
35 this.requestIdToListenerId = {};
38 ListenerManager.prototype.addListener = function(callback) {
40 if (!this.nativeSet) {
41 this.native.addListener(
44 for (var watchId in this.listeners) {
45 if (this.listeners.hasOwnProperty(watchId)) {
46 var stop = this.handle(msg, this.listeners[watchId], watchId);
55 this.nativeSet = true;
58 this.listeners[id] = callback;
63 ListenerManager.prototype.addServerInfoListener = function(callback, name) {
65 if (!this.nativeSet) {
66 this.native.addListener(
69 if (this.listenerNameToIds.hasOwnProperty(msg.name)) {
70 var cbArray = this.listenerNameToIds[msg.name];
71 for (var i = 0; i < cbArray.length; ++i) {
72 var watchId = cbArray[i];
73 this.handle(msg, this.listeners[watchId], watchId);
79 this.nativeSet = true;
82 this.listenerIdToName[id] = name;
83 if (this.listenerNameToIds[name]) {
84 this.listenerNameToIds[name].push(id);
86 this.listenerNameToIds[name] = [id];
88 this.listeners[id] = callback;
93 ListenerManager.prototype.removeListener = function(watchId) {
94 if (this.listeners.hasOwnProperty(watchId)) {
95 delete this.listeners[watchId];
99 function removeArrayElement(arr, elem) {
100 var index = arr.indexOf(elem);
102 arr.splice(index, 1);
106 ListenerManager.prototype.removeServerInfoListener = function(watchId) {
107 this.removeListener(watchId);
108 if (this.listenerIdToName.hasOwnProperty(watchId)) {
109 var name = this.listenerIdToName[watchId];
110 removeArrayElement(this.listenerNameToIds[name], watchId);
111 delete this.listenerIdToName[watchId];
115 var ServerCommandListener = new ListenerManager(
117 '_ServerCommandListener',
118 function(msg, listener) {
119 // passing raw msg.data object instead of tizen.Bundle
120 // due to backward compatibility issue.
121 var reply = listener(msg.clientName, msg.command, msg.data);
123 if (!(reply instanceof RequestReply)) {
124 reply = new RequestReply(
125 xwalk.utils.type.isNullOrUndefined(reply) ? null : reply,
131 clientName: msg.clientName,
132 requestId: msg.requestId,
136 var result = native_.callSync('MediaControllerServer_replyCommand', nativeData);
137 if (native_.isFailure(result)) {
138 throw native_.getErrorObject(result);
143 var ReplyCommandListener = new ListenerManager(native_, '_ReplyCommandListener', function(
148 if (this.requestIdToListenerId[watchId] === msg.requestId) {
149 // this listener is a wrapper around user callback which is neccessary
150 // due to difference between sendCommand() and new API methods.
153 this.removeListener(watchId);
154 delete this.requestIdToListenerId[watchId];
161 var ServerPlaybackInfoListener = new ListenerManager(
163 '_ServerPlaybackInfoListener',
164 function(msg, listener) {
165 if (msg.action === 'onplaybackstaterequest') {
166 native_.callIfPossible(listener[msg.action], msg.state, msg.clientName);
168 if (msg.action === 'onplaybackpositionrequest') {
169 native_.callIfPossible(listener[msg.action], msg.position, msg.clientName);
171 if (msg.action === 'onshufflemoderequest') {
172 native_.callIfPossible(listener[msg.action], msg.mode, msg.clientName);
174 if (msg.action === 'onrepeatmoderequest') {
175 utils_.printDeprecationWarningFor(
176 'onrepeatmoderequest',
177 'onrepeatstaterequest'
179 native_.callIfPossible(listener[msg.action], msg.mode, msg.clientName);
181 if (msg.action === 'onrepeatstaterequest') {
182 native_.callIfPossible(listener[msg.action], msg.state, msg.clientName);
184 if (msg.action === 'onplaybackitemrequest') {
185 native_.callIfPossible(
186 listener[msg.action],
197 var ServerInfoStatusListener = new ListenerManager(
199 '_ServerInfoStatusListener',
200 function(msg, listener) {
205 var ServerInfoPlaybackInfoListener = new ListenerManager(
207 '_ServerInfoPlaybackInfoListener',
208 function(msg, listener) {
209 if (msg.action === 'onplaybackchanged') {
210 listener[msg.action](msg.state, msg.position);
212 if (msg.action === 'onshufflemodechanged') {
213 listener[msg.action](msg.mode);
215 if (msg.action === 'onrepeatmodechanged') {
216 utils_.printDeprecationWarningFor(
217 'onrepeatmodechanged',
218 'onrepeatstatechanged'
220 listener[msg.action](msg.mode);
222 if (msg.action === 'onrepeatstatechanged') {
223 listener[msg.action](msg.state);
225 if (msg.action === 'onmetadatachanged') {
226 listener[msg.action](new MediaControllerMetadata(msg.metadata));
231 var ServerInfoPlaylistUpdatedListener = new ListenerManager(
233 '_ServerInfoPlaylistUpdatedListener',
234 function(msg, listener) {
235 if (msg.action === 'onplaylistupdated') {
236 listener[msg.action](msg.serverName, new MediaControllerPlaylist(msg));
238 if (msg.action === 'onplaylistdeleted') {
239 listener[msg.action](msg.serverName, msg.name);
244 var EditManager = function() {
245 this.isAllowed = false;
248 EditManager.prototype.allow = function() {
249 this.isAllowed = true;
252 EditManager.prototype.disallow = function() {
253 this.isAllowed = false;
256 var edit_ = new EditManager();
258 var MediaControllerServerState = {
263 var MediaControllerPlaybackState = {
273 var MediaControllerRepeatState = {
274 REPEAT_OFF: 'REPEAT_OFF',
275 REPEAT_ONE: 'REPEAT_ONE',
276 REPEAT_ALL: 'REPEAT_ALL'
279 var MediaControllerContentAgeRating = {
302 var MediaControllerSearchCategory = {
303 NO_CATEGORY: 'NO_CATEGORY',
311 var MediaControllerContentType = {
316 UNDECIDED: 'UNDECIDED'
319 function MediaControllerManager() {}
321 MediaControllerManager.prototype.getClient = function() {
322 var result = native_.callSync('MediaControllerManager_getClient', {});
324 if (native_.isFailure(result)) {
325 throw native_.getErrorObject(result);
328 return new MediaControllerClient(native_.getResultObject(result));
331 MediaControllerManager.prototype.createServer = function() {
332 var result = native_.callSync('MediaControllerManager_createServer', {});
333 if (native_.isFailure(result)) {
334 throw native_.getErrorObject(result);
337 return new MediaControllerServer(native_.getResultObject(result));
340 var MediaControllerMetadata = function(data) {
349 var _description = '';
352 Object.defineProperties(this, {
358 _title = converter_.toString(v);
367 _artist = converter_.toString(v);
376 _album = converter_.toString(v);
385 _author = converter_.toString(v);
394 _genre = converter_.toString(v);
403 _duration = converter_.toString(v);
412 _date = converter_.toString(v);
421 _copyright = converter_.toString(v);
430 _description = converter_.toString(v);
439 _trackNum = converter_.toString(v);
448 _picture = converter_.toString(v);
454 if (data instanceof _global.Object) {
455 for (var prop in data) {
456 if (data.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
457 this[prop] = data[prop];
463 var MediaControllerPlaybackInfo = function(data) {
466 var _shuffleMode = false;
467 var _repeatMode = false;
468 var _contentType = MediaControllerContentType.UNDECIDED;
469 var _repeatState = MediaControllerRepeatState.REPEAT_OFF;
470 var _ageRating = MediaControllerContentAgeRating.ALL;
471 var _metadata = new MediaControllerMetadata();
473 var _playlistName = null;
474 Object.defineProperties(this, {
480 _state = edit_.isAllowed && v ? v : _state;
489 _position = edit_.isAllowed ? converter_.toLong(v) : _position;
498 _ageRating = edit_.isAllowed && v ? v : _ageRating;
507 _shuffleMode = edit_.isAllowed ? converter_.toBoolean(v) : _shuffleMode;
513 utils_.printDeprecationWarningFor('repeatMode', 'repeatState');
517 _repeatMode = edit_.isAllowed ? converter_.toBoolean(v) : _repeatMode;
526 _repeatState = edit_.isAllowed && v ? v : _repeatState;
535 _contentType = edit_.isAllowed && v ? v : _contentType;
545 edit_.isAllowed && v ? new MediaControllerMetadata(v) : _metadata;
554 _index = edit_.isAllowed && v ? v : _index;
560 return _playlistName;
563 _playlistName = edit_.isAllowed && v ? v : _playlistName;
569 if (data instanceof _global.Object) {
570 for (var prop in data) {
571 if (data.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
572 this[prop] = data[prop];
578 function MediaControllerServer(data) {
581 Object.defineProperties(this, {
583 value: new MediaControllerPlaybackInfo(data),
592 _iconURI = edit_.isAllowed ? (v ? v : null) : _iconURI;
599 MediaControllerServer.prototype.updatePlaybackState = function(state) {
600 var args = validator_.validateArgs(arguments, [
604 values: Object.keys(MediaControllerPlaybackState)
612 var result = native_.callSync('MediaControllerServer_updatePlaybackState', data);
614 if (native_.isFailure(result)) {
615 throw native_.getErrorObject(result);
619 this.playbackInfo.state = args.state;
623 MediaControllerServer.prototype.updateIconURI = function(iconURI) {
624 var args = validator_.validateArgs(arguments, [
625 { name: 'iconURI', type: types_.STRING, nullable: true }
629 iconURI: args.iconURI
632 var result = native_.callSync('MediaControllerServer_updateIconURI', data);
633 if (native_.isFailure(result)) {
634 throw new WebAPIException(
635 WebAPIException.UNKNOWN_ERR,
636 native_.getErrorObject(result).message
641 this.iconURI = args.iconURI;
645 MediaControllerServer.prototype.updatePlaybackPosition = function(position) {
646 var args = validator_.validateArgs(arguments, [
647 { name: 'position', type: types_.UNSIGNED_LONG_LONG }
651 position: args.position
654 var result = native_.callSync('MediaControllerServer_updatePlaybackPosition', data);
656 if (native_.isFailure(result)) {
657 throw native_.getErrorObject(result);
661 this.playbackInfo.position = args.position;
665 MediaControllerServer.prototype.updatePlaybackAgeRating = function(rating) {
666 var args = validator_.validateArgs(arguments, [
670 values: Object.values(MediaControllerContentAgeRating)
678 var result = native_.callSync('MediaControllerServer_updatePlaybackAgeRating', data);
679 if (native_.isFailure(result)) {
680 throw native_.getErrorObject(result);
684 this.playbackInfo.ageRating = args.rating;
688 MediaControllerServer.prototype.updatePlaybackContentType = function(contentType) {
689 var args = validator_.validateArgs(arguments, [
693 values: Object.values(MediaControllerContentType)
698 contentType: args.contentType
701 var result = native_.callSync(
702 'MediaControllerServer_updatePlaybackContentType',
705 if (native_.isFailure(result)) {
706 throw native_.getErrorObject(result);
710 this.playbackInfo.contentType = args.contentType;
714 MediaControllerServer.prototype.updateShuffleMode = function(mode) {
715 var args = validator_.validateArgs(arguments, [
716 { name: 'mode', type: types_.BOOLEAN }
723 var result = native_.callSync('MediaControllerServer_updateShuffleMode', data);
725 if (native_.isFailure(result)) {
726 throw native_.getErrorObject(result);
730 this.playbackInfo.shuffleMode = args.mode;
734 MediaControllerServer.prototype.updateRepeatMode = function(mode) {
735 utils_.printDeprecationWarningFor('updateRepeatMode()', 'updateRepeatState()');
736 var args = validator_.validateArgs(arguments, [
737 { name: 'mode', type: types_.BOOLEAN }
744 var result = native_.callSync('MediaControllerServer_updateRepeatMode', data);
746 if (native_.isFailure(result)) {
747 throw native_.getErrorObject(result);
751 this.playbackInfo.repeatMode = args.mode;
752 this.playbackInfo.repeatState = args.mode
753 ? MediaControllerRepeatState.REPEAT_ALL
754 : MediaControllerRepeatState.REPEAT_OFF;
758 MediaControllerServer.prototype.updateRepeatState = function() {
759 var args = validator_.validateArgs(arguments, [
763 values: Object.keys(MediaControllerRepeatState)
771 var result = native_.callSync('MediaControllerServer_updateRepeatState', data);
773 if (native_.isFailure(result)) {
774 throw native_.getErrorObject(result);
778 this.playbackInfo.repeatState = args.state;
779 if (MediaControllerRepeatState.REPEAT_ONE !== args.state) {
780 this.playbackInfo.repeatMode =
781 args.state === MediaControllerRepeatState.REPEAT_ALL;
786 MediaControllerServer.prototype.updateMetadata = function(metadata) {
787 var args = validator_.validateArgs(arguments, [
790 type: types_.PLATFORM_OBJECT,
791 values: MediaControllerMetadata
796 metadata: args.metadata
799 var result = native_.callSync('MediaControllerServer_updateMetadata', data);
801 if (native_.isFailure(result)) {
802 throw native_.getErrorObject(result);
806 this.playbackInfo.metadata = args.metadata;
810 MediaControllerServer.prototype.addChangeRequestPlaybackInfoListener = function(
813 var args = validator_.validateArgs(arguments, [
816 type: types_.LISTENER,
818 'onplaybackstaterequest',
819 'onplaybackpositionrequest',
820 'onshufflemoderequest',
821 'onrepeatmoderequest',
822 'onrepeatstaterequest',
823 'onplaybackitemrequest'
828 if (type_.isEmptyObject(ServerPlaybackInfoListener.listeners)) {
829 var result = native_.callSync(
830 'MediaControllerServer_addChangeRequestPlaybackInfoListener',
832 listenerId: ServerPlaybackInfoListener.listenerName
835 if (native_.isFailure(result)) {
836 throw native_.getErrorObject(result);
840 return ServerPlaybackInfoListener.addListener(args.listener);
843 MediaControllerServer.prototype.removeChangeRequestPlaybackInfoListener = function(
846 var args = validator_.validateArgs(arguments, [
847 { name: 'watchId', type: types_.LONG }
850 ServerPlaybackInfoListener.removeListener(args.watchId);
852 if (type_.isEmptyObject(ServerPlaybackInfoListener.listeners)) {
853 native_.callSync('MediaControllerServer_removeCommandListener');
857 MediaControllerServer.prototype.addCommandListener = function(listener) {
858 var args = validator_.validateArgs(arguments, [
859 { name: 'listener', type: types_.FUNCTION }
862 if (type_.isEmptyObject(ServerCommandListener.listeners)) {
863 var result = native_.callSync('MediaControllerServer_addCommandListener', {
864 listenerId: ServerCommandListener.listenerName
866 if (native_.isFailure(result)) {
867 throw native_.getErrorObject(result);
871 return ServerCommandListener.addListener(args.listener);
874 MediaControllerServer.prototype.removeCommandListener = function(watchId) {
875 var args = validator_.validateArgs(arguments, [
876 { name: 'watchId', type: types_.LONG }
879 ServerCommandListener.removeListener(args.watchId);
881 if (type_.isEmptyObject(ServerCommandListener.listeners)) {
882 native_.callSync('MediaControllerServer_removeCommandListener');
886 MediaControllerServer.prototype.createPlaylist = function(name) {
887 var args = validator_.validateArgs(arguments, [
888 { name: 'name', type: types_.STRING }
895 var result = native_.callSync('MediaControllerServer_createPlaylist', data);
897 if (native_.isFailure(result)) {
898 throw native_.getErrorObject(result);
901 return new MediaControllerPlaylist(native_.getResultObject(result));
904 MediaControllerServer.prototype.savePlaylist = function(
909 var args = validator_.validateArgs(arguments, [
912 type: types_.PLATFORM_OBJECT,
913 values: MediaControllerPlaylist
916 name: 'successCallback',
917 type: types_.FUNCTION,
921 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
925 name: args.playlist.name
928 var callback = function(result) {
929 if (native_.isFailure(result)) {
930 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
933 native_.callIfPossible(args.successCallback);
936 var result = native_.call('MediaControllerServer_savePlaylist', data, callback);
938 if (native_.isFailure(result)) {
939 throw native_.getErrorObject(result);
943 MediaControllerServer.prototype.deletePlaylist = function(
948 var args = validator_.validateArgs(arguments, [
949 { name: 'name', type: types_.STRING },
951 name: 'successCallback',
952 type: types_.FUNCTION,
956 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
963 var callback = function(result) {
964 if (native_.isFailure(result)) {
965 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
968 native_.callIfPossible(args.successCallback);
971 var result = native_.call('MediaControllerServer_deletePlaylist', data, callback);
973 if (native_.isFailure(result)) {
974 throw native_.getErrorObject(result);
978 MediaControllerServer.prototype.updatePlaybackItem = function(playlistName, index) {
979 var args = validator_.validateArgs(arguments, [
980 { name: 'playlistName', type: types_.STRING },
981 { name: 'index', type: types_.STRING }
985 playlistName: args.playlistName,
989 var result = native_.callSync('MediaControllerServer_updatePlaybackItem', data);
991 if (native_.isFailure(result)) {
992 throw native_.getErrorObject(result);
996 this.playbackInfo.index = args.index;
997 this.playbackInfo.playlistName = args.playlistName;
1001 MediaControllerServer.prototype.getAllPlaylists = function(
1005 var args = validator_.validateArgs(arguments, [
1007 name: 'successCallback',
1008 type: types_.FUNCTION,
1012 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1015 var callback = function(result) {
1016 if (native_.isFailure(result)) {
1017 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1020 var data = native_.getResultObject(result);
1023 for (var i = 0; i < data.length; i++) {
1024 playlists.push(new MediaControllerPlaylist(data[i]));
1027 native_.callIfPossible(args.successCallback, playlists);
1029 var result = native_.call('MediaControllerServer_getAllPlaylists', {}, callback);
1031 if (native_.isFailure(result)) {
1032 throw native_.getErrorObject(result);
1036 function RequestReply(data, code) {
1037 xwalk.utils.validator.isConstructorCall(this, RequestReply);
1038 this.code = xwalk.utils.converter.toLong(code);
1039 this.data = xwalk.utils.type.isNullOrUndefined(data) ? null : new tizen.Bundle(data);
1042 MediaControllerServer.prototype.setSearchRequestListener = function(listener) {
1043 var args = validator_.validateArgs(arguments, [
1044 { name: 'listener', type: types_.FUNCTION }
1047 if (!native_.isListenerSet('SearchRequestListener')) {
1048 var result = native_.callSync('MediaControllerServer_addSearchRequestListener', {
1049 listenerId: 'SearchRequestListener'
1051 if (native_.isFailure(result)) {
1052 throw native_.getErrorObject(result);
1056 var callback = function(msg) {
1058 msg.request.forEach(function(filter) {
1069 var reply = args.listener(msg.clientName, request);
1070 if (type_.isUndefined(reply)) {
1071 reply = new RequestReply(null, 0);
1075 clientName: msg.clientName,
1076 requestId: msg.requestId,
1080 var result = native_.callSync('MediaControllerServer_replyCommand', nativeData);
1081 if (native_.isFailure(result)) {
1082 throw native_.getErrorObject(result);
1086 native_.addListener('SearchRequestListener', callback);
1089 MediaControllerServer.prototype.unsetSearchRequestListener = function() {
1090 var result = native_.callSync('MediaControllerServer_removeSearchRequestListener');
1091 if (native_.isFailure(result)) {
1092 throw native_.getErrorObject(result);
1094 native_.removeListener('SearchRequestListener');
1097 function MediaControllerClient() {}
1099 MediaControllerClient.prototype.findServers = function(successCallback, errorCallback) {
1100 var args = validator_.validateArgs(arguments, [
1101 { name: 'successCallback', type: types_.FUNCTION },
1102 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1105 var callback = function(result) {
1106 if (native_.isFailure(result)) {
1107 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1111 var data = native_.getResultObject(result);
1112 for (var i = 0; i < data.length; i++) {
1113 info.push(new MediaControllerServerInfo(data[i]));
1115 native_.callIfPossible(args.successCallback, info);
1118 native_.call('MediaControllerClient_findServers', {}, callback);
1121 MediaControllerClient.prototype.getLatestServerInfo = function() {
1122 var result = native_.callSync('MediaControllerClient_getLatestServerInfo', {});
1124 if (native_.isFailure(result)) {
1125 throw native_.getErrorObject(result);
1128 var serverInfo = native_.getResultObject(result);
1130 if ('NONE' === serverInfo.state) {
1131 serverInfo.state = 'INACTIVE';
1133 serverInfo = new MediaControllerServerInfo(serverInfo);
1138 function SearchFilter(contentType, category, keyword, extraData) {
1139 validator_.isConstructorCall(this, SearchFilter);
1140 var args = validator_.validateArgs(arguments, [
1142 name: 'contentType',
1144 values: Object.values(MediaControllerContentType)
1149 values: Object.values(MediaControllerSearchCategory),
1152 { name: 'keyword', type: types_.STRING, nullable: true, optional: true }
1155 if (!args.hasOwnProperty('category')) {
1156 args.category = 'NO_CATEGORY';
1158 if (!args.hasOwnProperty('keyword')) {
1159 args.keyword = null;
1162 extraData = xwalk.utils.type.isUndefined(extraData) ? null : extraData;
1163 args.extraData = xwalk.utils.type.isNull(extraData)
1165 : new tizen.Bundle(extraData);
1167 var extraData_ = args.extraData;
1168 var contentType_ = args.contentType;
1169 var category_ = args.category;
1170 var keyword_ = args.keyword;
1172 // keyword can be null only when category is NO_CATEGORY
1174 xwalk.utils.type.isNull(keyword_) &&
1175 category_ != MediaControllerSearchCategory.NO_CATEGORY
1177 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1180 Object.defineProperties(this, {
1184 return contentType_;
1186 set: function(newContentType) {
1187 var args = validator_.validateArgs(arguments, [
1189 name: 'newContentType',
1191 values: Object.values(MediaControllerContentType)
1194 contentType_ = args.newContentType;
1202 set: function(newCategory) {
1203 var args = validator_.validateArgs(arguments, [
1205 name: 'newCategory',
1207 values: Object.values(MediaControllerSearchCategory)
1211 // Keyword can be null only if category is NO_CATEGORY.
1213 xwalk.utils.type.isNull(keyword_) &&
1214 args.newCategory != MediaControllerSearchCategory.NO_CATEGORY
1216 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1219 category_ = args.newCategory;
1227 set: function(newKeyword) {
1228 var args = validator_.validateArgs(arguments, [
1231 type: types_.STRING,
1236 // Keyword can only be null if category is NO_CATEGORY.
1238 xwalk.utils.type.isNull(args.newKeyword) &&
1239 this.category != MediaControllerSearchCategory.NO_CATEGORY
1241 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1244 keyword_ = args.newKeyword;
1252 set: function(newData) {
1253 if (xwalk.utils.type.isUndefined(newData)) {
1256 extraData_ = xwalk.utils.type.isNull(newData)
1258 : new tizen.Bundle(newData);
1264 function MediaControllerServerInfo(data) {
1265 Object.defineProperties(this, {
1278 var result = native_.callSync('MediaControllerClient_getPlaybackInfo', {
1281 if (native_.isFailure(result)) {
1282 throw new native_.getErrorObject(result);
1285 var data = native_.getResultObject(result);
1286 var playbackInfo = new MediaControllerPlaybackInfo(data);
1289 return playbackInfo;
1296 var result = native_.callSync('MediaControllerServerInfo_getIconURI', {
1299 if (native_.isFailure(result)) {
1300 throw new native_.getErrorObject(result);
1302 var data = native_.getResultObject(result);
1303 return data.iconURI;
1311 MediaControllerServerInfo.prototype.sendPlaybackState = function(
1316 var args = validator_.validateArgs(arguments, [
1320 values: Object.keys(MediaControllerPlaybackState)
1323 name: 'successCallback',
1324 type: types_.FUNCTION,
1328 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1336 var callback = function(result) {
1337 if (native_.isFailure(result)) {
1338 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1341 native_.callIfPossible(args.successCallback);
1344 native_.call('MediaControllerServerInfo_sendPlaybackState', data, callback);
1347 MediaControllerServerInfo.prototype.sendPlaybackPosition = function(
1352 var args = validator_.validateArgs(arguments, [
1353 { name: 'position', type: types_.LONG_LONG },
1355 name: 'successCallback',
1356 type: types_.FUNCTION,
1360 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1363 if (args.position < 0) {
1364 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1367 var callback = function(result) {
1368 if (native_.isFailure(result)) {
1369 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1372 native_.callIfPossible(args.successCallback);
1376 position: args.position,
1380 native_.call('MediaControllerServerInfo_sendPlaybackPosition', data, callback);
1383 MediaControllerServerInfo.prototype.sendShuffleMode = function(
1388 var args = validator_.validateArgs(arguments, [
1389 { name: 'mode', type: types_.BOOLEAN },
1391 name: 'successCallback',
1392 type: types_.FUNCTION,
1396 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1399 var callback = function(result) {
1400 if (native_.isFailure(result)) {
1401 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1404 native_.callIfPossible(args.successCallback);
1411 native_.call('MediaControllerServerInfo_sendShuffleMode', data, callback);
1414 MediaControllerServerInfo.prototype.sendRepeatMode = function(
1419 utils_.printDeprecationWarningFor('sendRepeatMode()', 'sendRepeatState()');
1420 var args = validator_.validateArgs(arguments, [
1421 { name: 'mode', type: types_.BOOLEAN },
1423 name: 'successCallback',
1424 type: types_.FUNCTION,
1428 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1431 var callback = function(result) {
1432 if (native_.isFailure(result)) {
1433 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1436 native_.callIfPossible(args.successCallback);
1443 native_.call('MediaControllerServerInfo_sendRepeatMode', data, callback);
1446 MediaControllerServerInfo.prototype.sendRepeatState = function() {
1447 var args = validator_.validateArgs(arguments, [
1451 values: Object.keys(MediaControllerRepeatState)
1454 name: 'successCallback',
1455 type: types_.FUNCTION,
1459 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1462 var callback = function(result) {
1463 if (native_.isFailure(result)) {
1464 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1467 native_.callIfPossible(args.successCallback);
1474 native_.call('MediaControllerServerInfo_sendRepeatState', data, callback);
1477 MediaControllerServerInfo.prototype.sendCommand = function(
1483 var args = validator_.validateArgs(arguments, [
1484 { name: 'command', type: types_.STRING },
1485 { name: 'data', type: types_.DICTIONARY, nullable: true },
1486 { name: 'successCallback', type: types_.FUNCTION },
1487 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1490 var callback = function(result) {
1491 if (native_.isFailure(result)) {
1492 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1495 native_.callIfPossible(
1496 args.successCallback,
1497 native_.getResultObject(result).data,
1498 native_.getResultObject(result).code
1503 command: args.command,
1504 data: args.data === null ? null : new tizen.Bundle(args.data),
1506 listenerId: ReplyCommandListener.listenerName
1509 var replyListenerId = ReplyCommandListener.addListener(callback);
1510 var result = native_.callSync('MediaControllerServerInfo_sendCommand', nativeData);
1512 ReplyCommandListener.requestIdToListenerId[replyListenerId] = result.requestId;
1515 MediaControllerServerInfo.prototype.sendSearchRequest = function(
1520 var args = validator_.validateArgs(arguments, [
1521 { name: 'request', type: types_.ARRAY, values: SearchFilter },
1522 { name: 'successCallback', type: types_.FUNCTION },
1523 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1526 if (args.request.length < 1 || args.request.length > 20) {
1527 throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR);
1530 var callback = function(result) {
1531 if (native_.isFailure(result)) {
1532 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1535 var reply = native_.getResultObject(result);
1536 native_.callIfPossible(
1537 args.successCallback,
1538 new RequestReply(reply.data, reply.code)
1543 request: args.request,
1545 listenerId: ReplyCommandListener.listenerName
1548 var result = native_.callSync(
1549 'MediaControllerServerInfo_sendSearchRequest',
1553 if (native_.isFailure(result)) {
1554 throw native_.getErrorObject(result);
1557 var replyListenerId = ReplyCommandListener.addListener(callback);
1558 ReplyCommandListener.requestIdToListenerId[replyListenerId] = result.requestId;
1561 MediaControllerServerInfo.prototype.addServerStatusChangeListener = function(listener) {
1562 var args = validator_.validateArgs(arguments, [
1563 { name: 'listener', type: types_.FUNCTION }
1566 if (type_.isEmptyObject(ServerInfoStatusListener.listeners)) {
1567 var result = native_.callSync(
1568 'MediaControllerServerInfo_addServerStatusChangeListener',
1570 listenerId: ServerInfoStatusListener.listenerName
1573 if (native_.isFailure(result)) {
1574 throw native_.getErrorObject(result);
1577 return ServerInfoStatusListener.addServerInfoListener(args.listener, this.name);
1580 MediaControllerServerInfo.prototype.removeServerStatusChangeListener = function(watchId) {
1581 var args = validator_.validateArgs(arguments, [
1582 { name: 'watchId', type: types_.LONG }
1585 ServerInfoStatusListener.removeServerInfoListener(args.watchId);
1587 if (type_.isEmptyObject(ServerInfoStatusListener.listeners)) {
1588 native_.callSync('MediaControllerServerInfo_removeServerStatusChangeListener');
1592 MediaControllerServerInfo.prototype.addPlaybackInfoChangeListener = function(listener) {
1593 var args = validator_.validateArgs(arguments, [
1596 type: types_.LISTENER,
1598 'onplaybackchanged',
1599 'onshufflemodechanged',
1600 'onrepeatmodechanged',
1601 'onrepeatstatechanged',
1607 if (type_.isEmptyObject(ServerInfoPlaybackInfoListener.listeners)) {
1608 var result = native_.callSync(
1609 'MediaControllerServerInfo_addPlaybackInfoChangeListener',
1611 listenerId: ServerInfoPlaybackInfoListener.listenerName
1614 if (native_.isFailure(result)) {
1615 throw native_.getErrorObject(result);
1619 return ServerInfoPlaybackInfoListener.addServerInfoListener(args.listener, this.name);
1622 MediaControllerServerInfo.prototype.removePlaybackInfoChangeListener = function(watchId) {
1623 var args = validator_.validateArgs(arguments, [
1624 { name: 'watchId', type: types_.LONG }
1627 ServerInfoPlaybackInfoListener.removeServerInfoListener(args.watchId);
1629 if (type_.isEmptyObject(ServerInfoPlaybackInfoListener.listeners)) {
1630 native_.callSync('MediaControllerServerInfo_removePlaybackInfoChangeListener');
1634 MediaControllerServerInfo.prototype.getAllPlaylists = function(
1638 var args = validator_.validateArgs(arguments, [
1640 name: 'successCallback',
1641 type: types_.FUNCTION,
1645 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1648 var callback = function(result) {
1649 if (native_.isFailure(result)) {
1650 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1653 var data = native_.getResultObject(result);
1656 for (var i = 0; i < data.length; i++) {
1657 playlists.push(new MediaControllerPlaylist(data[i]));
1660 native_.callIfPossible(args.successCallback, playlists);
1663 var result = native_.call(
1664 'MediaControllerServerInfo_getAllPlaylists',
1665 { name: this.name },
1669 if (native_.isFailure(result)) {
1670 throw native_.getErrorObject(result);
1674 MediaControllerServerInfo.prototype.sendPlaybackItem = function(
1680 var args = validator_.validateArgs(arguments, [
1681 { name: 'playlistName', type: types_.STRING },
1682 { name: 'index', type: types_.STRING },
1686 values: Object.keys(MediaControllerPlaybackState)
1688 { name: 'position', type: types_.UNSIGNED_LONG_LONG }
1693 playlistName: args.playlistName,
1696 position: args.position
1699 var result = native_.callSync('MediaControllerServerInfo_sendPlaybackItem', data);
1701 if (native_.isFailure(result)) {
1702 throw native_.getErrorObject(result);
1706 MediaControllerServerInfo.prototype.addPlaylistUpdatedListener = function(listener) {
1707 var args = validator_.validateArgs(arguments, [
1710 type: types_.LISTENER,
1711 values: ['onplaylistupdated', 'onplaylistdeleted']
1715 if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) {
1716 var result = native_.callSync(
1717 'MediaControllerServerInfo_addPlaylistUpdatedListener',
1719 listenerId: ServerInfoPlaylistUpdatedListener.listenerName
1722 if (native_.isFailure(result)) {
1723 throw native_.getErrorObject(result);
1727 return ServerInfoPlaylistUpdatedListener.addListener(args.listener, this.name);
1730 MediaControllerServerInfo.prototype.removePlaylistUpdatedListener = function(watchId) {
1731 var args = validator_.validateArgs(arguments, [
1732 { name: 'watchId', type: types_.LONG }
1735 ServerInfoPlaylistUpdatedListener.removeListener(args.watchId);
1737 if (type_.isEmptyObject(ServerInfoPlaylistUpdatedListener.listeners)) {
1738 var result = native_.callSync(
1739 'MediaControllerServerInfo_removePlaylistUpdatedListener'
1742 if (native_.isFailure(result)) {
1743 throw native_.getErrorObject(result);
1748 var MediaControllerPlaylistItem = function(data) {
1750 var _metadata = new MediaControllerMetadata();
1751 Object.defineProperties(this, {
1757 _index = edit_.isAllowed && v ? v : _index;
1767 edit_.isAllowed && v ? new MediaControllerMetadata(v) : _metadata;
1774 if (data instanceof _global.Object) {
1775 for (var prop in data) {
1776 if (data.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
1777 this[prop] = data[prop];
1784 function MediaControllerPlaylist(data) {
1787 Object.defineProperties(this, {
1793 _name = edit_.isAllowed && v ? v : _name;
1799 if (data instanceof _global.Object) {
1800 for (var prop in data) {
1801 if (data.hasOwnProperty(prop) && this.hasOwnProperty(prop)) {
1802 this[prop] = data[prop];
1809 MediaControllerPlaylist.prototype.addItem = function(index, metadata) {
1810 var args = validator_.validateArgs(arguments, [
1811 { name: 'index', type: types_.STRING },
1812 { name: 'metadata', type: types_.DICTIONARY }
1817 metadata: args.metadata,
1821 var result = native_.callSync('MediaControllerPlaylist_addItem', data);
1823 if (native_.isFailure(result)) {
1824 throw native_.getErrorObject(result);
1828 MediaControllerPlaylist.prototype.getItems = function(successCallback, errorCallback) {
1829 var args = validator_.validateArgs(arguments, [
1831 name: 'successCallback',
1832 type: types_.FUNCTION,
1836 { name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true }
1843 var callback = function(result) {
1844 if (native_.isFailure(result)) {
1845 native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
1848 var data = native_.getResultObject(result);
1851 for (var i = 0; i < data.length; i++) {
1852 items.push(new MediaControllerPlaylistItem(data[i]));
1855 native_.callIfPossible(args.successCallback, items);
1858 var result = native_.call('MediaControllerPlaylist_getItems', data, callback);
1860 if (native_.isFailure(result)) {
1861 throw native_.getErrorObject(result);
1865 exports = new MediaControllerManager();
1866 exports.SearchFilter = SearchFilter;
1867 exports.RequestReply = RequestReply;