d52eb45b6a0fb9522a27ab8788155d9e40f70fea
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / java / src / org / xwalk / runtime / extension / api / messaging / messaging_api.js
1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 var _promises = {};
6 var _next_promise_id = 0;
7 var _listeners = {};
8 // Preserve 6 spaces to hold onreceived, onsent, ondeliverysuccess,
9 // ondeliveryerror, onserviceadded and onserviceremoved's
10 // callback functions.
11 var _next_listener_id = 6;
12
13 var Promise = requireNative('sysapps_promise').Promise;
14
15 var postMessage = function(msg) {
16   var p = new Promise();
17
18   _promises[_next_promise_id] = p;
19   msg._promise_id = _next_promise_id.toString();
20   _next_promise_id += 1;
21
22   extension.postMessage(JSON.stringify(msg));
23   return p;
24 };
25
26 function _isFunction(fn) {
27   return !!fn && !fn.nodeName && fn.constructor != String
28     && fn.constructor != RegExp && fn.constructor != Array
29     && /function/i.test( fn + "" );
30 }
31
32 function SmsManager() {}
33
34 SmsManager.prototype.type = "sms";
35
36 Object.defineProperty(SmsManager.prototype, 'serviceIDs', {
37   get: function() {
38     var _msg = {
39       cmd: "msg_smsServiceId",
40     }
41     return JSON.parse(extension.internal.sendSyncMessage(JSON.stringify(_msg)));
42   }
43 });
44
45 SmsManager.prototype.send = function(to, text, serviceID) {
46   var _msg = {
47     cmd: "msg_smsSend",
48     data: {
49       phone: to,
50       message: text,
51       serviceID: serviceID
52     }
53   }
54   return postMessage(_msg);
55 }
56
57 SmsManager.prototype.clear = function(serviceID) {
58   var _msg = {
59     cmd: "msg_smsClear",
60     data: {
61       serviceID: serviceID
62     }
63   }  
64   return postMessage(_msg);
65 }
66
67 SmsManager.prototype.segmentInfo = function(text, serviceID) {
68   var _msg = {
69     cmd: "msg_smsSegmentInfo",
70     data: {
71       text: text,
72       serviceID: serviceID
73     }
74   }
75   return postMessage(_msg);
76 }
77
78 var sms = new SmsManager();
79 exports.sms = sms;
80
81 Object.defineProperty(exports.sms, 'onreceived', {
82   set: function(callback) {
83     _addEventListener(true, 'received', callback);
84   }
85 });
86
87 Object.defineProperty(exports.sms, 'onsent', {
88   set: function(callback) {
89     _addEventListener(true, 'sent', callback);
90   }
91 });
92
93 Object.defineProperty(exports.sms, 'ondeliverysuccess', {
94   set: function(callback) {
95     _addEventListener(true, 'deliverysuccess', callback);
96   }
97 });
98
99 Object.defineProperty(exports.sms, 'ondeliveryerror', {
100   set: function(callback) {
101     _addEventListener(true, 'deliveryerror', callback);
102   }
103 });
104
105 Object.defineProperty(exports.sms, 'onserviceadded', {
106   set: function(callback) {
107     _addEventListener(true, 'serviceadded', callback);
108   }
109 });
110
111 Object.defineProperty(exports.sms, 'onserviceremoved', {
112   set: function(callback) {
113     _addEventListener(true, 'serviceremoved', callback);
114   }
115 });
116
117 function _addEventListener(isOn, eventName, callback) {
118   if (typeof eventName !== 'string') {
119     console.log("Invalid parameters of eventName!");
120     return -1;
121   }
122
123   if (!isOn && (typeof callback !== 'function')) {
124     console.log("Invalid parameters of callback!");
125     return -1;
126   }
127
128   if (isOn && (typeof callback !== null) && (typeof callback !== 'function')) {
129     console.log("Invalid parameters of callback!");
130     return -1;
131   }
132
133   var listener = {
134     'eventName': eventName,
135     'callback': callback
136   };
137
138   var listener_id;
139
140   if (isOn) {
141     switch(listener.eventName) {
142       case 'received':
143         _listeners[0] = listener;
144         listener_id = 0;
145         break;
146       case 'sent':
147         _listeners[1] = listener;
148         listener_id = 1;
149         break;
150       case 'deliverysuccess':
151         _listeners[2] = listener;
152         listener_id = 2;
153         break;
154       case 'deliveryerror':
155         _listeners[3] = listener;
156         listener_id = 3;
157         break;
158       case 'serviceadded':
159         _listeners[4] = listener;
160         listener_id = 4;
161         break;
162       case 'serviceremoved':
163         _listeners[5] = listener;
164         listener_id = 5;
165         break;
166       default:
167         console.log("Invalid event name!");
168         break;
169       }
170     } else {
171       listener_id = _next_listener_id;
172       _next_listener_id += 1;
173       _listeners[listener_id] = listener;
174     }
175
176   return listener_id;
177 }
178
179 exports.sms.addEventListener = function(eventName, callback) {
180   return _addEventListener(false, eventName, callback);
181 }
182
183 function handleEvent(msg) {
184   for (var id in _listeners) {
185     if (_listeners[id]['eventName'] === msg.cmd && _listeners[id]['callback']) {
186       _listeners[id]['callback'](msg.data);
187     }
188   }
189 }
190
191 function MessagingCursor(element) {
192   this.messageIndex = 0;
193   this.element = element;
194 }
195
196 MessagingCursor.prototype.next = function() {
197   var ret = null;
198   if (this.messageIndex > this.element.length) { 
199     this.messageIndex = this.element.length;
200   } else {
201     if (this.element) {
202       ret = this.element[this.messageIndex];
203       this.messageIndex++;
204     }
205   }
206   return ret;
207 }
208
209 MessagingCursor.prototype.previous = function() {
210   var ret = null;
211   if (this.messageIndex < 0) { 
212     this.messageIndex = 0;
213   } else {
214     if (this.element) {
215       ret = this.element[this.messageIndex];
216       this.messageIndex--;
217     }
218   }
219   return ret;
220 }
221
222 function handleFindMessages(msgObj) {
223   if (msgObj.data.error) {
224     if (_isFunction(_promises[msgObj._promise_id].reject)) {
225       _promises[msgObj._promise_id].reject(msgObj.data.body);
226     }
227   } else {
228     if (_isFunction(_promises[msgObj._promise_id].fulfill)) {
229       var cursor = new MessagingCursor(msgObj.data.body.results);
230       _promises[msgObj._promise_id].fulfill(cursor);
231     }
232   }
233
234   delete _promises[msgObj._promise_id];
235 }
236
237 function handlePromise(msgObj) {
238   if (msgObj.data.error) {
239     if (_isFunction(_promises[msgObj._promise_id].reject)) {
240       _promises[msgObj._promise_id].reject(msgObj.data.body);
241     }
242   } else {
243     if (_isFunction(_promises[msgObj._promise_id].fulfill)) {
244       _promises[msgObj._promise_id].fulfill(msgObj.data.body);
245     }
246   }
247
248   delete _promises[msgObj._promise_id];
249 }
250
251 extension.setMessageListener(function(json) {
252   var _msg = JSON.parse(json);
253
254   switch (_msg.cmd) {
255     case "sent":
256     case "received":
257     case "deliverysuccess":
258     case "deliveryerror":
259     case "serviceadded":
260     case "serviceadded": {
261       handleEvent(_msg);
262       break;
263     }
264     case "msg_findMessages_ret": {
265       handleFindMessages(_msg);
266       break;
267     }
268     case "msg_smsSend_ret":
269     case "msg_smsClear_ret":
270     case "msg_smsSegmentInfo_ret":
271     case "msg_getMessage_ret":
272     case "msg_deleteMessage_ret":
273     case "msg_deleteConversation_ret":
274     case "msg_markMessageRead_ret":
275     case "msg_markConversationRead_ret": {
276       handlePromise(_msg);
277       break;
278     }
279     default:
280       break;
281   }
282 });
283
284 exports.findMessages = function(filter, options) {
285   var _msg = {
286     cmd: "msg_findMessages",
287     data: {
288       filter: filter,
289       options: options
290     }
291   }
292   return postMessage(_msg);
293 }
294
295 exports.findConversations = function(groupBy, filter, options) {
296   // TODO:(shawn) Spec is not ready for this part.
297 }
298
299 exports.getMessage = function(type, messageID) {
300   var _msg = {
301     cmd: "msg_getMessage",
302     data: {
303       type: type,
304       messageID: messageID
305     }
306   }
307   return postMessage(_msg);
308 }
309
310 exports.deleteMessage = function(type, messageID) {
311   var _msg = {
312     cmd: "msg_deleteMessage",
313     data: {
314       type: type,
315       messageID: messageID
316     }
317   }
318   return postMessage(_msg);
319 }
320
321 exports.deleteConversation = function(type, conversationID) {
322   var _msg = {
323     cmd: "msg_deleteConversation",
324     data: {
325       type: type,
326       conversationID: conversationID
327     }
328   }
329   return postMessage(_msg);
330 }
331
332 exports.markMessageRead = function(type, messageID, value) {
333   value = (typeof value === 'undefined') ? true : value;
334   var _msg = {
335     cmd: "msg_markMessageRead",
336     data: {
337       type: type,
338       messageID: messageID,
339       value: value
340     }
341   }
342   return postMessage(_msg);
343 }
344
345 exports.markConversationRead = function(type, conversationID, value) {
346   value = (typeof value === 'undefined') ? true : value;
347   var _msg = {
348     cmd: "msg_markConversationRead",
349     data: {
350       type: type,
351       conversationID: conversationID,
352       value: value
353     }
354   }
355   return postMessage(_msg);
356 }