blob: eccd684a18e1227c01ab5a51deea7bfd6151298b [file] [log] [blame]
Emeric Vigier6119d782012-09-21 18:04:14 -04001/**
2 * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
alisionb1763882013-06-18 17:30:51 -04003 * Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
Emeric Vigier6119d782012-09-21 18:04:14 -04004 *
5 * Author: Regis Montoya <r3gis.3R@gmail.com>
6 * Author: Emeric Vigier <emeric.vigier@savoirfairelinux.com>
alision11e8e162013-05-28 10:33:14 -04007 * Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Emeric Vigier6119d782012-09-21 18:04:14 -04008 *
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 * If you own a pjsip commercial license you can also redistribute it
14 * and/or modify it under the terms of the GNU Lesser General Public License
15 * as an android library.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
24 */
Emeric Vigiereaf2c492012-09-19 14:38:20 -040025package com.savoirfairelinux.sflphone.service;
26
Emeric Vigier6119d782012-09-21 18:04:14 -040027import java.lang.ref.WeakReference;
alision17052d42013-04-22 10:39:38 -040028import java.util.ArrayList;
29import java.util.HashMap;
alisioncc7bb422013-06-06 15:31:39 -040030import java.util.Iterator;
alision7f18fc82013-05-01 09:37:33 -040031import java.util.List;
alision17052d42013-04-22 10:39:38 -040032import java.util.Map;
alision806e18e2013-06-21 15:30:17 -040033import java.util.Map.Entry;
alision2cb99562013-05-30 17:02:20 -040034import java.util.Random;
Emeric Vigier6119d782012-09-21 18:04:14 -040035
alision2cb99562013-05-30 17:02:20 -040036import android.app.Notification;
37import android.app.NotificationManager;
38import android.app.PendingIntent;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040039import android.app.Service;
alision17052d42013-04-22 10:39:38 -040040import android.content.Context;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040041import android.content.Intent;
alision17052d42013-04-22 10:39:38 -040042import android.content.IntentFilter;
alision7f18fc82013-05-01 09:37:33 -040043import android.os.Bundle;
Emeric Vigier6119d782012-09-21 18:04:14 -040044import android.os.Handler;
45import android.os.HandlerThread;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040046import android.os.IBinder;
Emeric Vigier6119d782012-09-21 18:04:14 -040047import android.os.Looper;
48import android.os.Message;
alision5f899632013-04-22 17:26:56 -040049import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040050import android.support.v4.app.NotificationCompat;
alision17052d42013-04-22 10:39:38 -040051import android.support.v4.content.LocalBroadcastManager;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040052import android.util.Log;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040053
alision2cb99562013-05-30 17:02:20 -040054import com.savoirfairelinux.sflphone.R;
alision5cfc35d2013-07-11 15:11:39 -040055import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
alisionf76de3b2013-04-16 15:35:22 -040056import com.savoirfairelinux.sflphone.account.AccountDetailsHandler;
Alexandre Lision6711ab22013-09-16 15:15:38 -040057import com.savoirfairelinux.sflphone.account.CallDetailsHandler;
alisione2a38e12013-04-25 14:20:20 -040058import com.savoirfairelinux.sflphone.account.HistoryHandler;
alision2cb99562013-05-30 17:02:20 -040059import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040060import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
alision806e18e2013-06-21 15:30:17 -040061import com.savoirfairelinux.sflphone.model.Conference;
alisionfde875f2013-05-28 17:01:54 -040062import com.savoirfairelinux.sflphone.model.SipCall;
alisioncc7bb422013-06-06 15:31:39 -040063import com.savoirfairelinux.sflphone.receivers.IncomingReceiver;
Alexandre Savard713a34d2012-09-26 15:50:41 -040064
Emeric Vigiereaf2c492012-09-19 14:38:20 -040065public class SipService extends Service {
66
67 static final String TAG = "SipService";
68 static final int DELAY = 5000; /* 5 sec */
69 private boolean runFlag = false;
70 private SipServiceThread sipServiceThread;
Emeric Vigier84e05da2012-09-20 14:53:05 -040071 private SFLphoneApplication sflphoneApp;
Emeric Vigier6119d782012-09-21 18:04:14 -040072 private SipServiceExecutor mExecutor;
73 private static HandlerThread executorThread;
alision3ea8f3c2013-07-16 17:35:35 -040074 private CallManager callManagerJNI;
Alexandre Lision67817192013-07-18 12:04:30 -040075 private ManagerImpl managerImpl;
Emeric Vigier0007dee2012-09-24 11:35:58 -040076 private CallManagerCallBack callManagerCallBack;
alision3ea8f3c2013-07-16 17:35:35 -040077 private ConfigurationManager configurationManagerJNI;
Alexandre Savardfccd1dc2012-10-17 17:31:38 -040078 private ConfigurationManagerCallback configurationManagerCallback;
Emeric Vigier6119d782012-09-21 18:04:14 -040079 private boolean isPjSipStackStarted = false;
alisioncc7bb422013-06-06 15:31:39 -040080
alision2cb99562013-05-30 17:02:20 -040081 public static final String NOTIF_CREATION = "notif_creation";
82 public static final String NOTIF_DELETION = "notif_deletion";
alision04a00182013-05-10 17:05:29 -040083
alision2cb99562013-05-30 17:02:20 -040084 private HashMap<String, SipCall> current_calls = new HashMap<String, SipCall>();
alision806e18e2013-06-21 15:30:17 -040085 private HashMap<String, Conference> current_confs = new HashMap<String, Conference>();
86 private IncomingReceiver receiver;
Emeric Vigier6119d782012-09-21 18:04:14 -040087
alision806e18e2013-06-21 15:30:17 -040088 public HashMap<String, Conference> getCurrent_confs() {
89 return current_confs;
90 }
alision43a9b362013-05-01 16:30:15 -040091
92 @Override
93 public boolean onUnbind(Intent i) {
94 super.onUnbind(i);
95 Log.i(TAG, "onUnbind(intent)");
96 return false;
97
98 }
99
100 /* called once by startService() */
101 @Override
102 public void onCreate() {
103 Log.i(TAG, "onCreated");
104 super.onCreate();
105
106 sflphoneApp = (SFLphoneApplication) getApplication();
107 sipServiceThread = new SipServiceThread();
108
109 IntentFilter callFilter = new IntentFilter(CallManagerCallBack.CALL_STATE_CHANGED);
110 callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
111 callFilter.addAction(CallManagerCallBack.NEW_CALL_CREATED);
alision4a0eb092013-05-07 13:52:03 -0400112 callFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
113 callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
alision04a00182013-05-10 17:05:29 -0400114 callFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
alision806e18e2013-06-21 15:30:17 -0400115 callFilter.addAction(CallManagerCallBack.CONF_CREATED);
116 callFilter.addAction(CallManagerCallBack.CONF_REMOVED);
117 callFilter.addAction(CallManagerCallBack.CONF_CHANGED);
alisiondf1dac92013-06-27 17:35:53 -0400118 callFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
alision806e18e2013-06-21 15:30:17 -0400119 receiver = new IncomingReceiver(this, mBinder);
alision2cb99562013-05-30 17:02:20 -0400120 LocalBroadcastManager.getInstance(this).registerReceiver(receiver, callFilter);
alision2cb99562013-05-30 17:02:20 -0400121
alisioncc7bb422013-06-06 15:31:39 -0400122 getExecutor().execute(new StartRunnable());
alisioncc7bb422013-06-06 15:31:39 -0400123 }
alision43a9b362013-05-01 16:30:15 -0400124
125 /* called for each startService() */
126 @Override
127 public int onStartCommand(Intent intent, int flags, int startId) {
128 Log.i(TAG, "onStarted");
129 super.onStartCommand(intent, flags, startId);
130
alision806e18e2013-06-21 15:30:17 -0400131 receiver = new IncomingReceiver(this, mBinder);
alision43a9b362013-05-01 16:30:15 -0400132 if (!runFlag) {
133 sipServiceThread.start();
134 runFlag = true;
135 sflphoneApp.setServiceRunning(true);
Alexandre Lision0a300ff2013-09-23 14:22:34 -0400136 Log.i(TAG, "Sflphone Service started");
alision43a9b362013-05-01 16:30:15 -0400137 }
138
alision907bde72013-06-20 14:40:37 -0400139 return START_NOT_STICKY; /* started and stopped explicitly */
alision43a9b362013-05-01 16:30:15 -0400140 }
141
142 @Override
143 public void onDestroy() {
144 /* called once by stopService() */
145 sipServiceThread.interrupt();
146 sipServiceThread = null;
147 runFlag = false;
Alexandre Lision0a300ff2013-09-23 14:22:34 -0400148
149 LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
alision2cb99562013-05-30 17:02:20 -0400150
alision43a9b362013-05-01 16:30:15 -0400151 sflphoneApp.setServiceRunning(false);
Alexandre Lision0a300ff2013-09-23 14:22:34 -0400152// Toast.makeText(this, "Sflphone Service stopped", Toast.LENGTH_SHORT).show();
alision43a9b362013-05-01 16:30:15 -0400153 super.onDestroy();
154
155 Log.i(TAG, "onDestroyed");
156 }
157
158 @Override
159 public IBinder onBind(Intent arg0) {
160 Log.i(TAG, "onBound");
161 return mBinder;
162 }
163
164 private static Looper createLooper() {
165 if (executorThread == null) {
166 Log.d(TAG, "Creating new handler thread");
167 // ADT gives a fake warning due to bad parse rule.
168 executorThread = new HandlerThread("SipService.Executor");
169 executorThread.start();
170 }
171 return executorThread.getLooper();
172 }
173
174 public SipServiceExecutor getExecutor() {
175 // create mExecutor lazily
176 if (mExecutor == null) {
177 mExecutor = new SipServiceExecutor(this);
178 }
179 return mExecutor;
180 }
181
182 // Executes immediate tasks in a single executorThread.
183 public static class SipServiceExecutor extends Handler {
184 WeakReference<SipService> handlerService;
185
186 SipServiceExecutor(SipService s) {
187 super(createLooper());
188 handlerService = new WeakReference<SipService>(s);
189 }
190
191 public void execute(Runnable task) {
192 // TODO: add wakelock
193 Message.obtain(this, 0/* don't care */, task).sendToTarget();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400194 Log.w(TAG, "SenT!");
alision43a9b362013-05-01 16:30:15 -0400195 }
196
197 @Override
198 public void handleMessage(Message msg) {
199 if (msg.obj instanceof Runnable) {
200 executeInternal((Runnable) msg.obj);
201 } else {
202 Log.w(TAG, "can't handle msg: " + msg);
203 }
204 }
205
206 private void executeInternal(Runnable task) {
207 try {
208 task.run();
209 } catch (Throwable t) {
210 Log.e(TAG, "run task: " + task, t);
211 }
212 }
213 }
214
215 private void startPjSipStack() throws SameThreadException {
216 if (isPjSipStackStarted)
217 return;
218
219 try {
220 System.loadLibrary("gnustl_shared");
221 System.loadLibrary("expat");
222 System.loadLibrary("yaml");
223 System.loadLibrary("ccgnu2");
224 System.loadLibrary("crypto");
225 System.loadLibrary("ssl");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400226 System.loadLibrary("sndfile");
alision43a9b362013-05-01 16:30:15 -0400227 System.loadLibrary("ccrtp1");
alision43a9b362013-05-01 16:30:15 -0400228 System.loadLibrary("samplerate");
229 System.loadLibrary("codec_ulaw");
230 System.loadLibrary("codec_alaw");
Alexandre Lision0a300ff2013-09-23 14:22:34 -0400231 System.loadLibrary("codec_g722");
Alexandre Lision6deda412013-09-25 13:21:22 -0400232 System.loadLibrary("codec_opus");
alision43a9b362013-05-01 16:30:15 -0400233 System.loadLibrary("speexresampler");
234 System.loadLibrary("sflphone");
235 isPjSipStackStarted = true;
Adrien Béraud9360f242013-09-19 11:07:42 +1000236
alision43a9b362013-05-01 16:30:15 -0400237 } catch (UnsatisfiedLinkError e) {
238 Log.e(TAG, "Problem with the current Pj stack...", e);
239 isPjSipStackStarted = false;
240 return;
241 } catch (Exception e) {
242 Log.e(TAG, "Problem with the current Pj stack...", e);
243 }
244
Alexandre Lision67817192013-07-18 12:04:30 -0400245 Log.i(TAG, "PjSIPStack started");
246 managerImpl = SFLPhoneservice.instance();
247
248 /* set static AppPath before calling manager.init */
249
Adrien Béraud9360f242013-09-19 11:07:42 +1000250 // managerImpl.setPath(sflphoneApp.getAppPath());
alision43a9b362013-05-01 16:30:15 -0400251
alision3ea8f3c2013-07-16 17:35:35 -0400252 callManagerJNI = new CallManager();
alision43a9b362013-05-01 16:30:15 -0400253 callManagerCallBack = new CallManagerCallBack(this);
254 SFLPhoneservice.setCallbackObject(callManagerCallBack);
255
alision3ea8f3c2013-07-16 17:35:35 -0400256 configurationManagerJNI = new ConfigurationManager();
alision43a9b362013-05-01 16:30:15 -0400257 configurationManagerCallback = new ConfigurationManagerCallback(this);
258 SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
Adrien Béraud9360f242013-09-19 11:07:42 +1000259
Alexandre Lision67817192013-07-18 12:04:30 -0400260 Log.i(TAG, "before init");
261 managerImpl.init("");
Adrien Béraud9360f242013-09-19 11:07:42 +1000262
Alexandre Lision67817192013-07-18 12:04:30 -0400263 Log.i(TAG, "->startPjSipStack");
alision43a9b362013-05-01 16:30:15 -0400264
alision43a9b362013-05-01 16:30:15 -0400265 }
266
Adrien Béraud9360f242013-09-19 11:07:42 +1000267 public HashMap<String, SipCall> getCurrent_calls() {
alision2cb99562013-05-30 17:02:20 -0400268 return current_calls;
269 }
270
alision43a9b362013-05-01 16:30:15 -0400271 // Enforce same thread contract to ensure we do not call from somewhere else
272 public class SameThreadException extends Exception {
273 private static final long serialVersionUID = -905639124232613768L;
274
275 public SameThreadException() {
276 super("Should be launched from a single worker thread");
277 }
278 }
279
280 public abstract static class SipRunnable implements Runnable {
281 protected abstract void doRun() throws SameThreadException, RemoteException;
282
Adrien Béraud9360f242013-09-19 11:07:42 +1000283 @Override
alision43a9b362013-05-01 16:30:15 -0400284 public void run() {
285 try {
286 doRun();
287 } catch (SameThreadException e) {
288 Log.e(TAG, "Not done from same thread");
289 } catch (RemoteException e) {
290 Log.e(TAG, e.toString());
291 }
292 }
293 }
294
295 public abstract static class SipRunnableWithReturn implements Runnable {
296 Object obj = null;
297 boolean done = false;
298
299 protected abstract Object doRun() throws SameThreadException;
300
301 public Object getVal() {
302 return obj;
303 }
304
305 public boolean isDone() {
306 return done;
307 }
308
Adrien Béraud9360f242013-09-19 11:07:42 +1000309 @Override
alision43a9b362013-05-01 16:30:15 -0400310 public void run() {
311 try {
312 obj = doRun();
313 done = true;
314 } catch (SameThreadException e) {
315 Log.e(TAG, "Not done from same thread");
316 }
317 }
318 }
319
320 class StartRunnable extends SipRunnable {
321 @Override
322 protected void doRun() throws SameThreadException {
323 startPjSipStack();
324 }
325 }
326
327 private class SipServiceThread extends Thread {
328
329 public SipServiceThread() {
330 super("sipServiceThread");
331 }
332
333 @Override
334 public void run() {
335 Log.i(TAG, "SipService thread running...");
336 SipService sipService = SipService.this;
337 while (sipService.runFlag) {
338 try {
339 Thread.sleep(DELAY);
340 } catch (InterruptedException e) {
341 sipService.runFlag = false;
342 Log.w(TAG, "service thread interrupted!");
343 }
344 }
345 }
346 }
347
348 /* ************************************
349 *
350 * Implement public interface for the service
351 *
Alexandre Lision67817192013-07-18 12:04:30 -0400352 * *********************************
353 */
354
Emeric Vigier6119d782012-09-21 18:04:14 -0400355 private final ISipService.Stub mBinder = new ISipService.Stub() {
356
357 @Override
alisionfde875f2013-05-28 17:01:54 -0400358 public void placeCall(final SipCall call) {
Emeric Vigier6119d782012-09-21 18:04:14 -0400359 getExecutor().execute(new SipRunnable() {
360 @Override
361 protected void doRun() throws SameThreadException {
362 Log.i(TAG, "SipService.placeCall() thread running...");
alision907bde72013-06-20 14:40:37 -0400363 callManagerJNI.placeCall(call.getAccountID(), call.getCallId(), call.getContact().getPhones().get(0).getNumber());
Adrien Béraud9360f242013-09-19 11:07:42 +1000364
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400365 HashMap<String, String> details = CallDetailsHandler.convertSwigToNative(callManagerJNI.getCallDetails(call.getCallId()));
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400366 // watchout timestamp stored by sflphone is in seconds
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400367 call.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -0400368 getCurrent_calls().put(call.getCallId(), call);
Adrien Béraud9360f242013-09-19 11:07:42 +1000369
Emeric Vigier6119d782012-09-21 18:04:14 -0400370 }
371 });
372 }
373
374 @Override
375 public void refuse(final String callID) {
376 getExecutor().execute(new SipRunnable() {
377 @Override
378 protected void doRun() throws SameThreadException {
379 Log.i(TAG, "SipService.refuse() thread running...");
380 callManagerJNI.refuse(callID);
381 }
382 });
383 }
384
385 @Override
386 public void accept(final String callID) {
387 getExecutor().execute(new SipRunnable() {
388 @Override
389 protected void doRun() throws SameThreadException {
Tristan Matthews40cf25e2013-07-24 13:45:15 -0400390 Log.i(TAG, "SipService.accept() thread running...");
Emeric Vigier6119d782012-09-21 18:04:14 -0400391 callManagerJNI.accept(callID);
392 }
393 });
394 }
395
396 @Override
397 public void hangUp(final String callID) {
398 getExecutor().execute(new SipRunnable() {
399 @Override
400 protected void doRun() throws SameThreadException {
401 Log.i(TAG, "SipService.hangUp() thread running...");
402 callManagerJNI.hangUp(callID);
403 }
404 });
405 }
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400406
407 @Override
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400408 public void hold(final String callID) {
409 getExecutor().execute(new SipRunnable() {
410 @Override
411 protected void doRun() throws SameThreadException {
412 Log.i(TAG, "SipService.hold() thread running...");
413 callManagerJNI.hold(callID);
414 }
415 });
416 }
417
418 @Override
419 public void unhold(final String callID) {
420 getExecutor().execute(new SipRunnable() {
421 @Override
422 protected void doRun() throws SameThreadException {
423 Log.i(TAG, "SipService.unhold() thread running...");
424 callManagerJNI.unhold(callID);
425 }
426 });
427 }
Adrien Béraud9360f242013-09-19 11:07:42 +1000428
Alexandre Lision6711ab22013-09-16 15:15:38 -0400429 @Override
430 public HashMap<String, String> getCallDetails(String callID) throws RemoteException {
431 class CallDetails extends SipRunnableWithReturn {
432 private String id;
433
434 CallDetails(String callID) {
435 id = callID;
436 }
437
438 @Override
439 protected StringMap doRun() throws SameThreadException {
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400440 Log.i(TAG, "SipService.getCallDetails() thread running...");
Alexandre Lision6711ab22013-09-16 15:15:38 -0400441 return callManagerJNI.getCallDetails(id);
442 }
443 }
444
445 CallDetails runInstance = new CallDetails(callID);
446 getExecutor().execute(runInstance);
447
448 while (!runInstance.isDone()) {
449 }
450 StringMap swigmap = (StringMap) runInstance.getVal();
451
452 HashMap<String, String> nativemap = CallDetailsHandler.convertSwigToNative(swigmap);
453
454 return nativemap;
Adrien Béraud9360f242013-09-19 11:07:42 +1000455
Alexandre Lision6711ab22013-09-16 15:15:38 -0400456 }
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400457
458 @Override
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400459 public void setAudioPlugin(final String audioPlugin) {
460 getExecutor().execute(new SipRunnable() {
alision371b77e2013-04-23 14:51:26 -0400461 @Override
462 protected void doRun() throws SameThreadException {
463 Log.i(TAG, "SipService.setAudioPlugin() thread running...");
464 configurationManagerJNI.setAudioPlugin(audioPlugin);
465 }
Alexandre Savard31d27c62012-10-04 16:05:08 -0400466 });
467 }
468
469 @Override
470 public String getCurrentAudioOutputPlugin() {
471 class CurrentAudioPlugin extends SipRunnableWithReturn {
472 @Override
473 protected String doRun() throws SameThreadException {
474 Log.i(TAG, "SipService.getCurrentAudioOutputPlugin() thread running...");
475 return configurationManagerJNI.getCurrentAudioOutputPlugin();
476 }
alision371b77e2013-04-23 14:51:26 -0400477 }
478 ;
Alexandre Savard31d27c62012-10-04 16:05:08 -0400479
480 CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
481 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400482 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400483 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400484 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400485 return (String) runInstance.getVal();
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400486 }
Alexandre Savard713a34d2012-09-26 15:50:41 -0400487
488 @Override
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400489 public ArrayList<String> getAccountList() {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400490 class AccountList extends SipRunnableWithReturn {
491 @Override
492 protected StringVect doRun() throws SameThreadException {
493 Log.i(TAG, "SipService.getAccountList() thread running...");
494 return configurationManagerJNI.getAccountList();
495 }
alision371b77e2013-04-23 14:51:26 -0400496 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400497 AccountList runInstance = new AccountList();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400498 Log.i(TAG, "SipService.getAccountList() thread running...");
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400499 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400500 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400501 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400502 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400503 StringVect swigvect = (StringVect) runInstance.getVal();
504
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400505 ArrayList<String> nativelist = new ArrayList<String>();
Alexandre Savard52a72522012-09-27 16:40:13 -0400506
alision371b77e2013-04-23 14:51:26 -0400507 for (int i = 0; i < swigvect.size(); i++)
508 nativelist.add(swigvect.get(i));
Alexandre Savard52a72522012-09-27 16:40:13 -0400509
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400510 return nativelist;
alision371b77e2013-04-23 14:51:26 -0400511 }
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400512
513 @Override
alision371b77e2013-04-23 14:51:26 -0400514 public HashMap<String, String> getAccountDetails(final String accountID) {
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400515 class AccountDetails extends SipRunnableWithReturn {
516 private String id;
alision371b77e2013-04-23 14:51:26 -0400517
518 AccountDetails(String accountId) {
519 id = accountId;
520 }
521
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400522 @Override
523 protected StringMap doRun() throws SameThreadException {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400524 Log.i(TAG, "SipService.getAccountDetails() thread running...");
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400525 return configurationManagerJNI.getAccountDetails(id);
526 }
alision371b77e2013-04-23 14:51:26 -0400527 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400528
529 AccountDetails runInstance = new AccountDetails(accountID);
530 getExecutor().execute(runInstance);
alisionfde875f2013-05-28 17:01:54 -0400531
alision371b77e2013-04-23 14:51:26 -0400532 while (!runInstance.isDone()) {
533 }
534 StringMap swigmap = (StringMap) runInstance.getVal();
Alexandre Savard713a34d2012-09-26 15:50:41 -0400535
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400536 HashMap<String, String> nativemap = AccountDetailsHandler.convertSwigToNative(swigmap);
Alexandre Savard713a34d2012-09-26 15:50:41 -0400537
538 return nativemap;
539 }
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400540
Alexandre Lision6e8931e2013-09-19 16:49:34 -0400541 @SuppressWarnings("unchecked") // Hashmap runtime cast
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400542 @Override
alisioncc7bb422013-06-06 15:31:39 -0400543 public void setAccountDetails(final String accountId, final Map map) {
alision371b77e2013-04-23 14:51:26 -0400544 HashMap<String, String> nativemap = (HashMap<String, String>) map;
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400545
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400546 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig(nativemap);
Alexandre Savard718d49f2012-10-02 15:17:13 -0400547
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400548 getExecutor().execute(new SipRunnable() {
549 @Override
550 protected void doRun() throws SameThreadException {
alisioncc7bb422013-06-06 15:31:39 -0400551
552 configurationManagerJNI.setCredentials(accountId, extractCredentials(map));
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400553 configurationManagerJNI.setAccountDetails(accountId, swigmap);
alisioncc7bb422013-06-06 15:31:39 -0400554
555 convertSwigToNative(configurationManagerJNI.getCredentials(accountId));
556 Log.i(TAG, "SipService.setAccountDetails() thread running...");
557 }
558
559 private VectMap extractCredentials(Map map) {
560 VectMap swigmap = new VectMap();
561 StringMap entry = new StringMap();
alision5cfc35d2013-07-11 15:11:39 -0400562 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
563 if ((String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM) != null)
564 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM));
alisioncc7bb422013-06-06 15:31:39 -0400565 else
alision5cfc35d2013-07-11 15:11:39 -0400566 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, "*");
567 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400568 swigmap.add(entry);
569 return swigmap;
570
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400571 }
572 });
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400573 }
574
alisioncc7bb422013-06-06 15:31:39 -0400575 public ArrayList<HashMap<String, String>> convertSwigToNative(VectMap swigmap) {
576
577 ArrayList<HashMap<String, String>> nativemap = new ArrayList<HashMap<String, String>>();
578 Log.i(TAG, "swigmap size " + swigmap.size());
579 for (int i = 0; i < swigmap.size(); ++i) {
580 Log.i(TAG, "Entry " + i);
581 StringMap tmp = swigmap.get(i);
alision5cfc35d2013-07-11 15:11:39 -0400582 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
alision806e18e2013-06-21 15:30:17 -0400583 // Log.i(TAG, tmp.get(ServiceConstants.CONFIG_ACCOUNT_REALM));
alision5cfc35d2013-07-11 15:11:39 -0400584 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400585 }
586
587 return nativemap;
588 }
589
Alexandre Lision6e8931e2013-09-19 16:49:34 -0400590 @SuppressWarnings("unchecked") // Hashmap runtime cast
Alexandre Savard46036572012-10-05 13:56:49 -0400591 @Override
592 public String addAccount(Map map) {
593 class AddAccount extends SipRunnableWithReturn {
594 StringMap map;
alision371b77e2013-04-23 14:51:26 -0400595
596 AddAccount(StringMap m) {
597 map = m;
598 }
599
Alexandre Savard46036572012-10-05 13:56:49 -0400600 @Override
601 protected String doRun() throws SameThreadException {
602 Log.i(TAG, "SipService.getAccountDetails() thread running...");
603 return configurationManagerJNI.addAccount(map);
604 }
alision371b77e2013-04-23 14:51:26 -0400605 }
Alexandre Savard46036572012-10-05 13:56:49 -0400606
alision371b77e2013-04-23 14:51:26 -0400607 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
Alexandre Savard46036572012-10-05 13:56:49 -0400608
609 AddAccount runInstance = new AddAccount(swigmap);
610 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400611 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400612 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400613 }
Alexandre Savard46036572012-10-05 13:56:49 -0400614 String accountId = (String) runInstance.getVal();
615
616 return accountId;
617 }
618
619 @Override
620 public void removeAccount(final String accountId) {
621 getExecutor().execute(new SipRunnable() {
622 @Override
623 protected void doRun() throws SameThreadException {
624 Log.i(TAG, "SipService.setAccountDetails() thread running...");
625 configurationManagerJNI.removeAccount(accountId);
626 }
627 });
628 }
alision5f899632013-04-22 17:26:56 -0400629
alisione2a38e12013-04-25 14:20:20 -0400630 @Override
631 public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
632 class History extends SipRunnableWithReturn {
633
634 @Override
635 protected VectMap doRun() throws SameThreadException {
636 Log.i(TAG, "SipService.getHistory() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400637
alisione2a38e12013-04-25 14:20:20 -0400638 return configurationManagerJNI.getHistory();
639 }
640 }
641
642 History runInstance = new History();
643 getExecutor().execute(runInstance);
644 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400645 // Log.w(TAG, "Waiting for getHistory");
alisione2a38e12013-04-25 14:20:20 -0400646 }
alision1005ba12013-06-19 13:52:44 -0400647 Log.i(TAG, "SipService.getHistory() DONE");
alisione2a38e12013-04-25 14:20:20 -0400648 VectMap swigmap = (VectMap) runInstance.getVal();
649
650 ArrayList<HashMap<String, String>> nativemap = HistoryHandler.convertSwigToNative(swigmap);
651
652 return nativemap;
653 }
alision7f18fc82013-05-01 09:37:33 -0400654
alision43a9b362013-05-01 16:30:15 -0400655 /*************************
656 * Transfer related API
657 *************************/
658
alision7f18fc82013-05-01 09:37:33 -0400659 @Override
660 public void transfer(final String callID, final String to) throws RemoteException {
661 getExecutor().execute(new SipRunnable() {
662 @Override
663 protected void doRun() throws SameThreadException, RemoteException {
664 Log.i(TAG, "SipService.transfer() thread running...");
665 if (callManagerJNI.transfer(callID, to)) {
666 Bundle bundle = new Bundle();
667 bundle.putString("CallID", callID);
668 bundle.putString("State", "HUNGUP");
669 Intent intent = new Intent(CallManagerCallBack.CALL_STATE_CHANGED);
alision7f18fc82013-05-01 09:37:33 -0400670 intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
alision84813a12013-05-27 17:40:39 -0400671 sendBroadcast(intent);
alision7f18fc82013-05-01 09:37:33 -0400672 } else
673 Log.i(TAG, "NOT OK");
674 }
675 });
676
677 }
alision43a9b362013-05-01 16:30:15 -0400678
alision7f18fc82013-05-01 09:37:33 -0400679 @Override
680 public void attendedTransfer(final String transferID, final String targetID) throws RemoteException {
681 getExecutor().execute(new SipRunnable() {
682 @Override
683 protected void doRun() throws SameThreadException, RemoteException {
alision43a9b362013-05-01 16:30:15 -0400684 Log.i(TAG, "SipService.attendedTransfer() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400685 if (callManagerJNI.attendedTransfer(transferID, targetID)) {
686 Log.i(TAG, "OK");
alision7f18fc82013-05-01 09:37:33 -0400687 } else
688 Log.i(TAG, "NOT OK");
689 }
690 });
alision43a9b362013-05-01 16:30:15 -0400691
692 }
693
694 /*************************
695 * Conference related API
696 *************************/
697
698 @Override
699 public void removeConference(final String confID) throws RemoteException {
700 getExecutor().execute(new SipRunnable() {
701 @Override
702 protected void doRun() throws SameThreadException, RemoteException {
703 Log.i(TAG, "SipService.createConference() thread running...");
704 callManagerJNI.removeConference(confID);
705 }
706 });
707
alision7f18fc82013-05-01 09:37:33 -0400708 }
709
710 @Override
alision43a9b362013-05-01 16:30:15 -0400711 public void joinParticipant(final String sel_callID, final String drag_callID) throws RemoteException {
712 getExecutor().execute(new SipRunnable() {
713 @Override
714 protected void doRun() throws SameThreadException, RemoteException {
715 Log.i(TAG, "SipService.joinParticipant() thread running...");
716 callManagerJNI.joinParticipant(sel_callID, drag_callID);
alision806e18e2013-06-21 15:30:17 -0400717 // Generate a CONF_CREATED callback
alision43a9b362013-05-01 16:30:15 -0400718 }
719 });
720
alision7f18fc82013-05-01 09:37:33 -0400721 }
722
alision7f18fc82013-05-01 09:37:33 -0400723 @Override
alision806e18e2013-06-21 15:30:17 -0400724 public void addParticipant(final SipCall call, final String confID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400725 getExecutor().execute(new SipRunnable() {
726 @Override
727 protected void doRun() throws SameThreadException, RemoteException {
728 Log.i(TAG, "SipService.addParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400729 callManagerJNI.addParticipant(call.getCallId(), confID);
730 current_confs.get(confID).getParticipants().add(call);
alision43a9b362013-05-01 16:30:15 -0400731 }
732 });
733
alision7f18fc82013-05-01 09:37:33 -0400734 }
735
736 @Override
alision43a9b362013-05-01 16:30:15 -0400737 public void addMainParticipant(final String confID) throws RemoteException {
738 getExecutor().execute(new SipRunnable() {
739 @Override
740 protected void doRun() throws SameThreadException, RemoteException {
741 Log.i(TAG, "SipService.addMainParticipant() thread running...");
742 callManagerJNI.addMainParticipant(confID);
743 }
744 });
745
alision7f18fc82013-05-01 09:37:33 -0400746 }
747
748 @Override
alision43a9b362013-05-01 16:30:15 -0400749 public void detachParticipant(final String callID) throws RemoteException {
750 getExecutor().execute(new SipRunnable() {
751 @Override
752 protected void doRun() throws SameThreadException, RemoteException {
753 Log.i(TAG, "SipService.detachParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400754 Log.i(TAG, "Detaching " + callID);
755 Iterator<Entry<String, Conference>> it = current_confs.entrySet().iterator();
756 Log.i(TAG, "current_confs size " + current_confs.size());
757 while (it.hasNext()) {
758 Conference tmp = it.next().getValue();
759 Log.i(TAG, "conf has " + tmp.getParticipants().size() + " participants");
760 if (tmp.contains(callID)) {
761 current_calls.put(callID, tmp.getCall(callID));
762 Log.i(TAG, "Call found and put in current_calls");
763 }
764 }
alision43a9b362013-05-01 16:30:15 -0400765 callManagerJNI.detachParticipant(callID);
766 }
767 });
768
alision7f18fc82013-05-01 09:37:33 -0400769 }
770
771 @Override
alision43a9b362013-05-01 16:30:15 -0400772 public void joinConference(final String sel_confID, final String drag_confID) throws RemoteException {
773 getExecutor().execute(new SipRunnable() {
774 @Override
775 protected void doRun() throws SameThreadException, RemoteException {
776 Log.i(TAG, "SipService.joinConference() thread running...");
777 callManagerJNI.joinConference(sel_confID, drag_confID);
778 }
779 });
780
alision7f18fc82013-05-01 09:37:33 -0400781 }
782
783 @Override
alision43a9b362013-05-01 16:30:15 -0400784 public void hangUpConference(final String confID) throws RemoteException {
785 getExecutor().execute(new SipRunnable() {
786 @Override
787 protected void doRun() throws SameThreadException, RemoteException {
788 Log.i(TAG, "SipService.joinConference() thread running...");
789 callManagerJNI.hangUpConference(confID);
790 }
791 });
792
alision7f18fc82013-05-01 09:37:33 -0400793 }
794
795 @Override
alision43a9b362013-05-01 16:30:15 -0400796 public void holdConference(final String confID) throws RemoteException {
797 getExecutor().execute(new SipRunnable() {
798 @Override
799 protected void doRun() throws SameThreadException, RemoteException {
800 Log.i(TAG, "SipService.holdConference() thread running...");
801 callManagerJNI.holdConference(confID);
802 }
803 });
804
alision7f18fc82013-05-01 09:37:33 -0400805 }
806
807 @Override
alision43a9b362013-05-01 16:30:15 -0400808 public void unholdConference(final String confID) throws RemoteException {
809 getExecutor().execute(new SipRunnable() {
810 @Override
811 protected void doRun() throws SameThreadException, RemoteException {
812 Log.i(TAG, "SipService.unholdConference() thread running...");
813 callManagerJNI.unholdConference(confID);
814 }
815 });
816
alision7f18fc82013-05-01 09:37:33 -0400817 }
Alexandre Lision67817192013-07-18 12:04:30 -0400818
alisioncd8fb912013-06-28 14:43:51 -0400819 @Override
820 public boolean isConferenceParticipant(final String callID) throws RemoteException {
821 class IsParticipant extends SipRunnableWithReturn {
822
823 @Override
824 protected Boolean doRun() throws SameThreadException {
825 Log.i(TAG, "SipService.isRecording() thread running...");
826 return callManagerJNI.isConferenceParticipant(callID);
827 }
828 }
829
830 IsParticipant runInstance = new IsParticipant();
831 getExecutor().execute(runInstance);
832 while (!runInstance.isDone()) {
833 }
834
835 return (Boolean) runInstance.getVal();
836 }
alision7f18fc82013-05-01 09:37:33 -0400837
838 @Override
alisiondf1dac92013-06-27 17:35:53 -0400839 public HashMap<String, Conference> getConferenceList() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -0400840 // class ConfList extends SipRunnableWithReturn {
841 // @Override
842 // protected StringVect doRun() throws SameThreadException {
843 // Log.i(TAG, "SipService.getConferenceList() thread running...");
844 // return callManagerJNI.getConferenceList();
845 // }
846 // }
847 // ;
848 // ConfList runInstance = new ConfList();
849 // getExecutor().execute(runInstance);
850 // while (!runInstance.isDone()) {
851 // // Log.w(TAG, "Waiting for getConferenceList");
852 // }
853 // StringVect swigvect = (StringVect) runInstance.getVal();
854 //
855 // ArrayList<String> nativelist = new ArrayList<String>();
856 //
857 // for (int i = 0; i < swigvect.size(); i++)
858 // nativelist.add(swigvect.get(i));
859 //
860 // return nativelist;
alisiondf1dac92013-06-27 17:35:53 -0400861 return current_confs;
alision7f18fc82013-05-01 09:37:33 -0400862 }
863
864 @Override
alision907bde72013-06-20 14:40:37 -0400865 public List getParticipantList(final String confID) throws RemoteException {
866 class PartList extends SipRunnableWithReturn {
867 @Override
868 protected StringVect doRun() throws SameThreadException {
869 Log.i(TAG, "SipService.getAccountList() thread running...");
870 return callManagerJNI.getParticipantList(confID);
871 }
872 }
873 ;
874 PartList runInstance = new PartList();
875 getExecutor().execute(runInstance);
876 while (!runInstance.isDone()) {
877 // Log.w(TAG, "Waiting for getConferenceList");
878 }
879 StringVect swigvect = (StringVect) runInstance.getVal();
880
881 ArrayList<String> nativelist = new ArrayList<String>();
882
883 for (int i = 0; i < swigvect.size(); i++)
884 nativelist.add(swigvect.get(i));
885
886 return nativelist;
alision7f18fc82013-05-01 09:37:33 -0400887 }
alision806e18e2013-06-21 15:30:17 -0400888
alision1005ba12013-06-19 13:52:44 -0400889 @Override
alision7f18fc82013-05-01 09:37:33 -0400890 public String getConferenceId(String callID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400891 Log.e(TAG, "getConferenceList not implemented");
alision7f18fc82013-05-01 09:37:33 -0400892 return null;
893 }
894
895 @Override
alision806e18e2013-06-21 15:30:17 -0400896 public String getConferenceDetails(final String callID) throws RemoteException {
897 class ConfDetails extends SipRunnableWithReturn {
898 @Override
899 protected StringMap doRun() throws SameThreadException {
900 Log.i(TAG, "SipService.getAccountList() thread running...");
901 return callManagerJNI.getConferenceDetails(callID);
902 }
903 }
904 ;
905 ConfDetails runInstance = new ConfDetails();
906 getExecutor().execute(runInstance);
907 while (!runInstance.isDone()) {
908 // Log.w(TAG, "Waiting for getConferenceList");
909 }
910 StringMap swigvect = (StringMap) runInstance.getVal();
911
912 return swigvect.get("CONF_STATE");
alision7f18fc82013-05-01 09:37:33 -0400913 }
914
alision04a00182013-05-10 17:05:29 -0400915 @Override
916 public String getRecordPath() throws RemoteException {
917 class RecordPath extends SipRunnableWithReturn {
918
919 @Override
920 protected String doRun() throws SameThreadException {
921 Log.i(TAG, "SipService.getRecordPath() thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +1000922 return configurationManagerJNI.getRecordPath();
alision04a00182013-05-10 17:05:29 -0400923 }
924 }
925
926 RecordPath runInstance = new RecordPath();
927 getExecutor().execute(runInstance);
928 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400929 // Log.w(TAG, "Waiting for getRecordPath");
alision04a00182013-05-10 17:05:29 -0400930 }
931 String path = (String) runInstance.getVal();
932
933 return path;
934 }
935
936 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400937 public boolean toggleRecordingCall(final String id) throws RemoteException {
Adrien Béraud9360f242013-09-19 11:07:42 +1000938
Alexandre Lisiona764c682013-09-09 10:02:07 -0400939 class ToggleRecording extends SipRunnableWithReturn {
940
alision04a00182013-05-10 17:05:29 -0400941 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400942 protected Boolean doRun() throws SameThreadException {
943 Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
944 return callManagerJNI.toggleRecording(id);
alision04a00182013-05-10 17:05:29 -0400945 }
Alexandre Lisiona764c682013-09-09 10:02:07 -0400946 }
947
948 ToggleRecording runInstance = new ToggleRecording();
949 getExecutor().execute(runInstance);
950 while (!runInstance.isDone()) {
951 }
952
953 return (Boolean) runInstance.getVal();
alision04a00182013-05-10 17:05:29 -0400954
955 }
Alexandre Lision67817192013-07-18 12:04:30 -0400956
alision50fa0722013-06-25 17:29:44 -0400957 @Override
alisiondf1dac92013-06-27 17:35:53 -0400958 public boolean isRecording(final String id) throws RemoteException {
959 class IsRecording extends SipRunnableWithReturn {
960
961 @Override
962 protected Boolean doRun() throws SameThreadException {
963 Log.i(TAG, "SipService.isRecording() thread running...");
964 return callManagerJNI.getIsRecording(id);
965 }
966 }
967
968 IsRecording runInstance = new IsRecording();
969 getExecutor().execute(runInstance);
970 while (!runInstance.isDone()) {
971 }
972
973 return (Boolean) runInstance.getVal();
Alexandre Lision67817192013-07-18 12:04:30 -0400974
alisiondf1dac92013-06-27 17:35:53 -0400975 }
Alexandre Lision67817192013-07-18 12:04:30 -0400976
alisiondf1dac92013-06-27 17:35:53 -0400977 @Override
alision50fa0722013-06-25 17:29:44 -0400978 public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
979 getExecutor().execute(new SipRunnable() {
980 @Override
981 protected void doRun() throws SameThreadException, RemoteException {
982 Log.i(TAG, "SipService.setRecordingCall() thread running...");
983 callManagerJNI.startRecordedFilePlayback(filepath);
984 }
985 });
986 return false;
987 }
988
989 @Override
990 public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
991 getExecutor().execute(new SipRunnable() {
992 @Override
993 protected void doRun() throws SameThreadException, RemoteException {
994 Log.i(TAG, "SipService.stopRecordedFilePlayback() thread running...");
995 callManagerJNI.stopRecordedFilePlayback(filepath);
996 }
997 });
998 }
alision04a00182013-05-10 17:05:29 -0400999
1000 @Override
1001 public void setRecordPath(final String path) throws RemoteException {
1002 getExecutor().execute(new SipRunnable() {
1003 @Override
1004 protected void doRun() throws SameThreadException, RemoteException {
Alexandre Lisiona764c682013-09-09 10:02:07 -04001005 Log.i(TAG, "SipService.setRecordPath() "+path+" thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +10001006 configurationManagerJNI.setRecordPath(path);
alision04a00182013-05-10 17:05:29 -04001007 }
1008 });
1009 }
1010
1011 @Override
1012 public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
1013 getExecutor().execute(new SipRunnable() {
1014 @Override
1015 protected void doRun() throws SameThreadException, RemoteException {
1016 Log.i(TAG, "SipService.sendTextMessage() thread running...");
Alexandre Lision10314352013-07-17 15:06:56 -04001017 callManagerJNI.sendTextMessage(callID, message);
alision04a00182013-05-10 17:05:29 -04001018 }
1019 });
1020
1021 }
1022
alisiond295ec22013-05-17 10:12:13 -04001023 @Override
1024 public List getAudioCodecList(String accountID) throws RemoteException {
alision806e18e2013-06-21 15:30:17 -04001025 // class AudioCodecList extends SipRunnableWithReturn {
1026 //
1027 // @Override
1028 // protected IntVect doRun() throws SameThreadException {
1029 // Log.i(TAG, "SipService.getAudioCodecList() thread running...");
1030 // return configurationManagerJNI.getAudioCodecList();
1031 // }
1032 // }
1033 //
1034 // AudioCodecList runInstance = new AudioCodecList();
1035 // getExecutor().execute(runInstance);
1036 // while (!runInstance.isDone()) {
1037 // Log.w(TAG, "Waiting for getAudioCodecList");
1038 // }
1039 // IntVect swigmap = (IntVect) runInstance.getVal();
1040 //
1041 // ArrayList<Integer> codecs = AudioHandler.convertSwigToNative(swigmap);
1042 //
1043 // return codecs;
alision907bde72013-06-20 14:40:37 -04001044 return null;
alisiond295ec22013-05-17 10:12:13 -04001045 }
1046
alision9f7a6ec2013-05-24 16:26:26 -04001047 @Override
alisionfde875f2013-05-28 17:01:54 -04001048 public HashMap<String, SipCall> getCallList() throws RemoteException {
alision85704182013-05-29 15:23:03 -04001049 // class CallList extends SipRunnableWithReturn {
1050 //
1051 // @Override
1052 // protected StringVect doRun() throws SameThreadException {
1053 // Log.i(TAG, "SipService.getCallList() thread running...");
1054 // return callManagerJNI.getCallList();
1055 // }
1056 // }
1057 //
1058 // CallList runInstance = new CallList();
1059 // getExecutor().execute(runInstance);
1060 // while (!runInstance.isDone()) {
1061 // Log.w(TAG, "Waiting for getAudioCodecList");
1062 // }
1063 // StringVect swigmap = (StringVect) runInstance.getVal();
1064 //
1065 // ArrayList<String> nativemap = new ArrayList<String>();
1066 // for (int i = 0; i < swigmap.size(); ++i) {
1067 //
1068 // String t = swigmap.get(i);
1069 // nativemap.add(t);
1070 // }
alision9f7a6ec2013-05-24 16:26:26 -04001071
alision2cb99562013-05-30 17:02:20 -04001072 return getCurrent_calls();
alision9f7a6ec2013-05-24 16:26:26 -04001073 }
1074
alision85704182013-05-29 15:23:03 -04001075 @Override
1076 public SipCall getCall(String callID) throws RemoteException {
alision2cb99562013-05-30 17:02:20 -04001077 return getCurrent_calls().get(callID);
1078 }
1079
1080 /***********************
1081 * Notification API
1082 ***********************/
1083 @Override
1084 public void createNotification() throws RemoteException {
1085 makeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001086
alision2cb99562013-05-30 17:02:20 -04001087 }
1088
1089 @Override
1090 public void destroyNotification() throws RemoteException {
1091 removeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001092
alision2cb99562013-05-30 17:02:20 -04001093 }
alisioncc7bb422013-06-06 15:31:39 -04001094
Adrien Béraud9360f242013-09-19 11:07:42 +10001095 private final int NOTIFICATION_ID = new Random().nextInt(1000);
alisioncc7bb422013-06-06 15:31:39 -04001096
alision2cb99562013-05-30 17:02:20 -04001097 private void makeNotification() {
alisioncc7bb422013-06-06 15:31:39 -04001098 if (current_calls.size() == 0) {
alision2cb99562013-05-30 17:02:20 -04001099 return;
1100 }
1101 Intent notificationIntent = new Intent(getApplicationContext(), SFLPhoneHomeActivity.class);
alisioncc7bb422013-06-06 15:31:39 -04001102 PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 007, notificationIntent,
1103 PendingIntent.FLAG_UPDATE_CURRENT);
alision2cb99562013-05-30 17:02:20 -04001104
1105 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
Adrien Béraud9360f242013-09-19 11:07:42 +10001106 nm.cancel(NOTIFICATION_ID); // clear previous notifications.
alision2cb99562013-05-30 17:02:20 -04001107
1108 NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext());
alisioncc7bb422013-06-06 15:31:39 -04001109 //
1110 // builder.setContent(view);
1111 builder.setContentIntent(contentIntent).setOngoing(true).setSmallIcon(R.drawable.ic_launcher)
Adrien Béraud9360f242013-09-19 11:07:42 +10001112 .setContentTitle(getCurrent_calls().size() + " ongoing calls").setTicker("Pending calls").setWhen(System.currentTimeMillis())
1113 .setAutoCancel(false);
alision2cb99562013-05-30 17:02:20 -04001114 builder.setPriority(NotificationCompat.PRIORITY_MAX);
1115 Notification n = builder.build();
1116
1117 nm.notify(NOTIFICATION_ID, n);
alision2cb99562013-05-30 17:02:20 -04001118 }
1119
1120 public void removeNotification() {
1121 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
1122 nm.cancel(NOTIFICATION_ID);
alision85704182013-05-29 15:23:03 -04001123 }
1124
alisiondf1dac92013-06-27 17:35:53 -04001125 @Override
1126 public Conference getCurrentCall() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -04001127 for (SipCall i : current_calls.values()) {
Adrien Béraud9360f242013-09-19 11:07:42 +10001128
Alexandre Lisionc51ccb12013-09-11 16:00:30 -04001129 // Incoming >> Ongoing
1130 if(i.isIncoming()){
1131 Conference tmp = new Conference("-1");
1132 tmp.getParticipants().add(i);
1133 return tmp;
1134 }
Adrien Béraud9360f242013-09-19 11:07:42 +10001135
Alexandre Lision67817192013-07-18 12:04:30 -04001136 if (i.isOngoing()) {
alisiondf1dac92013-06-27 17:35:53 -04001137 Conference tmp = new Conference("-1");
1138 tmp.getParticipants().add(i);
1139 return tmp;
1140 }
1141 }
Alexandre Lision67817192013-07-18 12:04:30 -04001142
1143 if (!current_confs.isEmpty()) {
alisiondf1dac92013-06-27 17:35:53 -04001144 return (Conference) current_confs.values().toArray()[0];
1145 }
1146 return null;
1147 }
1148
Alexandre Lision64dc8c02013-09-25 15:32:25 -04001149
1150
1151
1152 @Override
1153 public void playDtmf(final String key) throws RemoteException {
1154 getExecutor().execute(new SipRunnable() {
1155 @Override
1156 protected void doRun() throws SameThreadException, RemoteException {
1157 Log.i(TAG, "SipService.playDtmf() thread running...");
1158 callManagerJNI.playDTMF(key);
1159 }
1160 });
1161 }
1162
Emeric Vigier6119d782012-09-21 18:04:14 -04001163 };
Emeric Vigiereaf2c492012-09-19 14:38:20 -04001164}