blob: fb78acb233b27a5482ffc136df500d189d8f7b00 [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;
53import android.widget.Toast;
54
alision2cb99562013-05-30 17:02:20 -040055import com.savoirfairelinux.sflphone.R;
alision5cfc35d2013-07-11 15:11:39 -040056import com.savoirfairelinux.sflphone.account.AccountDetailBasic;
alisionf76de3b2013-04-16 15:35:22 -040057import com.savoirfairelinux.sflphone.account.AccountDetailsHandler;
Alexandre Lision6711ab22013-09-16 15:15:38 -040058import com.savoirfairelinux.sflphone.account.CallDetailsHandler;
alisione2a38e12013-04-25 14:20:20 -040059import com.savoirfairelinux.sflphone.account.HistoryHandler;
alision2cb99562013-05-30 17:02:20 -040060import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040061import com.savoirfairelinux.sflphone.client.SFLphoneApplication;
alision806e18e2013-06-21 15:30:17 -040062import com.savoirfairelinux.sflphone.model.Conference;
alisionfde875f2013-05-28 17:01:54 -040063import com.savoirfairelinux.sflphone.model.SipCall;
alisioncc7bb422013-06-06 15:31:39 -040064import com.savoirfairelinux.sflphone.receivers.IncomingReceiver;
Alexandre Savard713a34d2012-09-26 15:50:41 -040065
Emeric Vigiereaf2c492012-09-19 14:38:20 -040066public class SipService extends Service {
67
68 static final String TAG = "SipService";
69 static final int DELAY = 5000; /* 5 sec */
70 private boolean runFlag = false;
71 private SipServiceThread sipServiceThread;
Emeric Vigier84e05da2012-09-20 14:53:05 -040072 private SFLphoneApplication sflphoneApp;
Emeric Vigier6119d782012-09-21 18:04:14 -040073 private SipServiceExecutor mExecutor;
74 private static HandlerThread executorThread;
alision3ea8f3c2013-07-16 17:35:35 -040075 private CallManager callManagerJNI;
Alexandre Lision67817192013-07-18 12:04:30 -040076 private ManagerImpl managerImpl;
Emeric Vigier0007dee2012-09-24 11:35:58 -040077 private CallManagerCallBack callManagerCallBack;
alision3ea8f3c2013-07-16 17:35:35 -040078 private ConfigurationManager configurationManagerJNI;
Alexandre Savardfccd1dc2012-10-17 17:31:38 -040079 private ConfigurationManagerCallback configurationManagerCallback;
Emeric Vigier6119d782012-09-21 18:04:14 -040080 private boolean isPjSipStackStarted = false;
alisioncc7bb422013-06-06 15:31:39 -040081
alision2cb99562013-05-30 17:02:20 -040082 public static final String NOTIF_CREATION = "notif_creation";
83 public static final String NOTIF_DELETION = "notif_deletion";
alision04a00182013-05-10 17:05:29 -040084
alision2cb99562013-05-30 17:02:20 -040085 private HashMap<String, SipCall> current_calls = new HashMap<String, SipCall>();
alision806e18e2013-06-21 15:30:17 -040086 private HashMap<String, Conference> current_confs = new HashMap<String, Conference>();
87 private IncomingReceiver receiver;
Emeric Vigier6119d782012-09-21 18:04:14 -040088
alision806e18e2013-06-21 15:30:17 -040089 public HashMap<String, Conference> getCurrent_confs() {
90 return current_confs;
91 }
alision43a9b362013-05-01 16:30:15 -040092
93 @Override
94 public boolean onUnbind(Intent i) {
95 super.onUnbind(i);
96 Log.i(TAG, "onUnbind(intent)");
97 return false;
98
99 }
100
101 /* called once by startService() */
102 @Override
103 public void onCreate() {
104 Log.i(TAG, "onCreated");
105 super.onCreate();
106
107 sflphoneApp = (SFLphoneApplication) getApplication();
108 sipServiceThread = new SipServiceThread();
109
110 IntentFilter callFilter = new IntentFilter(CallManagerCallBack.CALL_STATE_CHANGED);
111 callFilter.addAction(CallManagerCallBack.INCOMING_CALL);
112 callFilter.addAction(CallManagerCallBack.NEW_CALL_CREATED);
alision4a0eb092013-05-07 13:52:03 -0400113 callFilter.addAction(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED);
114 callFilter.addAction(ConfigurationManagerCallback.ACCOUNTS_CHANGED);
alision04a00182013-05-10 17:05:29 -0400115 callFilter.addAction(CallManagerCallBack.INCOMING_TEXT);
alision806e18e2013-06-21 15:30:17 -0400116 callFilter.addAction(CallManagerCallBack.CONF_CREATED);
117 callFilter.addAction(CallManagerCallBack.CONF_REMOVED);
118 callFilter.addAction(CallManagerCallBack.CONF_CHANGED);
alisiondf1dac92013-06-27 17:35:53 -0400119 callFilter.addAction(CallManagerCallBack.RECORD_STATE_CHANGED);
alision806e18e2013-06-21 15:30:17 -0400120 receiver = new IncomingReceiver(this, mBinder);
alision2cb99562013-05-30 17:02:20 -0400121 LocalBroadcastManager.getInstance(this).registerReceiver(receiver, callFilter);
alision2cb99562013-05-30 17:02:20 -0400122
alisioncc7bb422013-06-06 15:31:39 -0400123 getExecutor().execute(new StartRunnable());
alisioncc7bb422013-06-06 15:31:39 -0400124 }
alision43a9b362013-05-01 16:30:15 -0400125
126 /* called for each startService() */
127 @Override
128 public int onStartCommand(Intent intent, int flags, int startId) {
129 Log.i(TAG, "onStarted");
130 super.onStartCommand(intent, flags, startId);
131
alision806e18e2013-06-21 15:30:17 -0400132 receiver = new IncomingReceiver(this, mBinder);
alision43a9b362013-05-01 16:30:15 -0400133 if (!runFlag) {
134 sipServiceThread.start();
135 runFlag = true;
136 sflphoneApp.setServiceRunning(true);
137 Toast.makeText(this, "Sflphone Service started", Toast.LENGTH_SHORT).show();
138 }
139
alision907bde72013-06-20 14:40:37 -0400140 return START_NOT_STICKY; /* started and stopped explicitly */
alision43a9b362013-05-01 16:30:15 -0400141 }
142
143 @Override
144 public void onDestroy() {
145 /* called once by stopService() */
146 sipServiceThread.interrupt();
147 sipServiceThread = null;
148 runFlag = false;
alision2cb99562013-05-30 17:02:20 -0400149 unregisterReceiver(receiver);
150
alision43a9b362013-05-01 16:30:15 -0400151 sflphoneApp.setServiceRunning(false);
152 Toast.makeText(this, "Sflphone Service stopped", Toast.LENGTH_SHORT).show();
153 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");
231 System.loadLibrary("speexresampler");
232 System.loadLibrary("sflphone");
233 isPjSipStackStarted = true;
Adrien Béraud9360f242013-09-19 11:07:42 +1000234
alision43a9b362013-05-01 16:30:15 -0400235 } catch (UnsatisfiedLinkError e) {
236 Log.e(TAG, "Problem with the current Pj stack...", e);
237 isPjSipStackStarted = false;
238 return;
239 } catch (Exception e) {
240 Log.e(TAG, "Problem with the current Pj stack...", e);
241 }
242
Alexandre Lision67817192013-07-18 12:04:30 -0400243 Log.i(TAG, "PjSIPStack started");
244 managerImpl = SFLPhoneservice.instance();
245
246 /* set static AppPath before calling manager.init */
247
Adrien Béraud9360f242013-09-19 11:07:42 +1000248 // managerImpl.setPath(sflphoneApp.getAppPath());
alision43a9b362013-05-01 16:30:15 -0400249
alision3ea8f3c2013-07-16 17:35:35 -0400250 callManagerJNI = new CallManager();
alision43a9b362013-05-01 16:30:15 -0400251 callManagerCallBack = new CallManagerCallBack(this);
252 SFLPhoneservice.setCallbackObject(callManagerCallBack);
253
alision3ea8f3c2013-07-16 17:35:35 -0400254 configurationManagerJNI = new ConfigurationManager();
alision43a9b362013-05-01 16:30:15 -0400255 configurationManagerCallback = new ConfigurationManagerCallback(this);
256 SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
Adrien Béraud9360f242013-09-19 11:07:42 +1000257
Alexandre Lision67817192013-07-18 12:04:30 -0400258 Log.i(TAG, "before init");
259 managerImpl.init("");
Adrien Béraud9360f242013-09-19 11:07:42 +1000260
Alexandre Lision67817192013-07-18 12:04:30 -0400261 Log.i(TAG, "->startPjSipStack");
alision43a9b362013-05-01 16:30:15 -0400262
alision43a9b362013-05-01 16:30:15 -0400263 }
264
Adrien Béraud9360f242013-09-19 11:07:42 +1000265 public HashMap<String, SipCall> getCurrent_calls() {
alision2cb99562013-05-30 17:02:20 -0400266 return current_calls;
267 }
268
alision43a9b362013-05-01 16:30:15 -0400269 // Enforce same thread contract to ensure we do not call from somewhere else
270 public class SameThreadException extends Exception {
271 private static final long serialVersionUID = -905639124232613768L;
272
273 public SameThreadException() {
274 super("Should be launched from a single worker thread");
275 }
276 }
277
278 public abstract static class SipRunnable implements Runnable {
279 protected abstract void doRun() throws SameThreadException, RemoteException;
280
Adrien Béraud9360f242013-09-19 11:07:42 +1000281 @Override
alision43a9b362013-05-01 16:30:15 -0400282 public void run() {
283 try {
284 doRun();
285 } catch (SameThreadException e) {
286 Log.e(TAG, "Not done from same thread");
287 } catch (RemoteException e) {
288 Log.e(TAG, e.toString());
289 }
290 }
291 }
292
293 public abstract static class SipRunnableWithReturn implements Runnable {
294 Object obj = null;
295 boolean done = false;
296
297 protected abstract Object doRun() throws SameThreadException;
298
299 public Object getVal() {
300 return obj;
301 }
302
303 public boolean isDone() {
304 return done;
305 }
306
Adrien Béraud9360f242013-09-19 11:07:42 +1000307 @Override
alision43a9b362013-05-01 16:30:15 -0400308 public void run() {
309 try {
310 obj = doRun();
311 done = true;
312 } catch (SameThreadException e) {
313 Log.e(TAG, "Not done from same thread");
314 }
315 }
316 }
317
318 class StartRunnable extends SipRunnable {
319 @Override
320 protected void doRun() throws SameThreadException {
321 startPjSipStack();
322 }
323 }
324
325 private class SipServiceThread extends Thread {
326
327 public SipServiceThread() {
328 super("sipServiceThread");
329 }
330
331 @Override
332 public void run() {
333 Log.i(TAG, "SipService thread running...");
334 SipService sipService = SipService.this;
335 while (sipService.runFlag) {
336 try {
337 Thread.sleep(DELAY);
338 } catch (InterruptedException e) {
339 sipService.runFlag = false;
340 Log.w(TAG, "service thread interrupted!");
341 }
342 }
343 }
344 }
345
346 /* ************************************
347 *
348 * Implement public interface for the service
349 *
Alexandre Lision67817192013-07-18 12:04:30 -0400350 * *********************************
351 */
352
Emeric Vigier6119d782012-09-21 18:04:14 -0400353 private final ISipService.Stub mBinder = new ISipService.Stub() {
354
355 @Override
alisionfde875f2013-05-28 17:01:54 -0400356 public void placeCall(final SipCall call) {
Emeric Vigier6119d782012-09-21 18:04:14 -0400357 getExecutor().execute(new SipRunnable() {
358 @Override
359 protected void doRun() throws SameThreadException {
360 Log.i(TAG, "SipService.placeCall() thread running...");
alision907bde72013-06-20 14:40:37 -0400361 callManagerJNI.placeCall(call.getAccountID(), call.getCallId(), call.getContact().getPhones().get(0).getNumber());
Adrien Béraud9360f242013-09-19 11:07:42 +1000362
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400363 HashMap<String, String> details = CallDetailsHandler.convertSwigToNative(callManagerJNI.getCallDetails(call.getCallId()));
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400364 // watchout timestamp stored by sflphone is in seconds
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400365 call.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -0400366 getCurrent_calls().put(call.getCallId(), call);
Adrien Béraud9360f242013-09-19 11:07:42 +1000367
Emeric Vigier6119d782012-09-21 18:04:14 -0400368 }
369 });
370 }
371
372 @Override
373 public void refuse(final String callID) {
374 getExecutor().execute(new SipRunnable() {
375 @Override
376 protected void doRun() throws SameThreadException {
377 Log.i(TAG, "SipService.refuse() thread running...");
378 callManagerJNI.refuse(callID);
379 }
380 });
381 }
382
383 @Override
384 public void accept(final String callID) {
385 getExecutor().execute(new SipRunnable() {
386 @Override
387 protected void doRun() throws SameThreadException {
Tristan Matthews40cf25e2013-07-24 13:45:15 -0400388 Log.i(TAG, "SipService.accept() thread running...");
Emeric Vigier6119d782012-09-21 18:04:14 -0400389 callManagerJNI.accept(callID);
390 }
391 });
392 }
393
394 @Override
395 public void hangUp(final String callID) {
396 getExecutor().execute(new SipRunnable() {
397 @Override
398 protected void doRun() throws SameThreadException {
399 Log.i(TAG, "SipService.hangUp() thread running...");
400 callManagerJNI.hangUp(callID);
401 }
402 });
403 }
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400404
405 @Override
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400406 public void hold(final String callID) {
407 getExecutor().execute(new SipRunnable() {
408 @Override
409 protected void doRun() throws SameThreadException {
410 Log.i(TAG, "SipService.hold() thread running...");
411 callManagerJNI.hold(callID);
412 }
413 });
414 }
415
416 @Override
417 public void unhold(final String callID) {
418 getExecutor().execute(new SipRunnable() {
419 @Override
420 protected void doRun() throws SameThreadException {
421 Log.i(TAG, "SipService.unhold() thread running...");
422 callManagerJNI.unhold(callID);
423 }
424 });
425 }
Adrien Béraud9360f242013-09-19 11:07:42 +1000426
Alexandre Lision6711ab22013-09-16 15:15:38 -0400427 @Override
428 public HashMap<String, String> getCallDetails(String callID) throws RemoteException {
429 class CallDetails extends SipRunnableWithReturn {
430 private String id;
431
432 CallDetails(String callID) {
433 id = callID;
434 }
435
436 @Override
437 protected StringMap doRun() throws SameThreadException {
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400438 Log.i(TAG, "SipService.getCallDetails() thread running...");
Alexandre Lision6711ab22013-09-16 15:15:38 -0400439 return callManagerJNI.getCallDetails(id);
440 }
441 }
442
443 CallDetails runInstance = new CallDetails(callID);
444 getExecutor().execute(runInstance);
445
446 while (!runInstance.isDone()) {
447 }
448 StringMap swigmap = (StringMap) runInstance.getVal();
449
450 HashMap<String, String> nativemap = CallDetailsHandler.convertSwigToNative(swigmap);
451
452 return nativemap;
Adrien Béraud9360f242013-09-19 11:07:42 +1000453
Alexandre Lision6711ab22013-09-16 15:15:38 -0400454 }
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400455
456 @Override
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400457 public void setAudioPlugin(final String audioPlugin) {
458 getExecutor().execute(new SipRunnable() {
alision371b77e2013-04-23 14:51:26 -0400459 @Override
460 protected void doRun() throws SameThreadException {
461 Log.i(TAG, "SipService.setAudioPlugin() thread running...");
462 configurationManagerJNI.setAudioPlugin(audioPlugin);
463 }
Alexandre Savard31d27c62012-10-04 16:05:08 -0400464 });
465 }
466
467 @Override
468 public String getCurrentAudioOutputPlugin() {
469 class CurrentAudioPlugin extends SipRunnableWithReturn {
470 @Override
471 protected String doRun() throws SameThreadException {
472 Log.i(TAG, "SipService.getCurrentAudioOutputPlugin() thread running...");
473 return configurationManagerJNI.getCurrentAudioOutputPlugin();
474 }
alision371b77e2013-04-23 14:51:26 -0400475 }
476 ;
Alexandre Savard31d27c62012-10-04 16:05:08 -0400477
478 CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
479 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400480 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400481 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400482 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400483 return (String) runInstance.getVal();
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400484 }
Alexandre Savard713a34d2012-09-26 15:50:41 -0400485
486 @Override
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400487 public ArrayList<String> getAccountList() {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400488 class AccountList extends SipRunnableWithReturn {
489 @Override
490 protected StringVect doRun() throws SameThreadException {
491 Log.i(TAG, "SipService.getAccountList() thread running...");
492 return configurationManagerJNI.getAccountList();
493 }
alision371b77e2013-04-23 14:51:26 -0400494 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400495 AccountList runInstance = new AccountList();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400496 Log.i(TAG, "SipService.getAccountList() thread running...");
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400497 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400498 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400499 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400500 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400501 StringVect swigvect = (StringVect) runInstance.getVal();
502
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400503 ArrayList<String> nativelist = new ArrayList<String>();
Alexandre Savard52a72522012-09-27 16:40:13 -0400504
alision371b77e2013-04-23 14:51:26 -0400505 for (int i = 0; i < swigvect.size(); i++)
506 nativelist.add(swigvect.get(i));
Alexandre Savard52a72522012-09-27 16:40:13 -0400507
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400508 return nativelist;
alision371b77e2013-04-23 14:51:26 -0400509 }
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400510
511 @Override
alision371b77e2013-04-23 14:51:26 -0400512 public HashMap<String, String> getAccountDetails(final String accountID) {
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400513 class AccountDetails extends SipRunnableWithReturn {
514 private String id;
alision371b77e2013-04-23 14:51:26 -0400515
516 AccountDetails(String accountId) {
517 id = accountId;
518 }
519
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400520 @Override
521 protected StringMap doRun() throws SameThreadException {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400522 Log.i(TAG, "SipService.getAccountDetails() thread running...");
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400523 return configurationManagerJNI.getAccountDetails(id);
524 }
alision371b77e2013-04-23 14:51:26 -0400525 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400526
527 AccountDetails runInstance = new AccountDetails(accountID);
528 getExecutor().execute(runInstance);
alisionfde875f2013-05-28 17:01:54 -0400529
alision371b77e2013-04-23 14:51:26 -0400530 while (!runInstance.isDone()) {
531 }
532 StringMap swigmap = (StringMap) runInstance.getVal();
Alexandre Savard713a34d2012-09-26 15:50:41 -0400533
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400534 HashMap<String, String> nativemap = AccountDetailsHandler.convertSwigToNative(swigmap);
Alexandre Savard713a34d2012-09-26 15:50:41 -0400535
536 return nativemap;
537 }
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400538
539 @Override
alisioncc7bb422013-06-06 15:31:39 -0400540 public void setAccountDetails(final String accountId, final Map map) {
alision371b77e2013-04-23 14:51:26 -0400541 HashMap<String, String> nativemap = (HashMap<String, String>) map;
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400542
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400543 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig(nativemap);
Alexandre Savard718d49f2012-10-02 15:17:13 -0400544
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400545 getExecutor().execute(new SipRunnable() {
546 @Override
547 protected void doRun() throws SameThreadException {
alisioncc7bb422013-06-06 15:31:39 -0400548
549 configurationManagerJNI.setCredentials(accountId, extractCredentials(map));
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400550 configurationManagerJNI.setAccountDetails(accountId, swigmap);
alisioncc7bb422013-06-06 15:31:39 -0400551
552 convertSwigToNative(configurationManagerJNI.getCredentials(accountId));
553 Log.i(TAG, "SipService.setAccountDetails() thread running...");
554 }
555
556 private VectMap extractCredentials(Map map) {
557 VectMap swigmap = new VectMap();
558 StringMap entry = new StringMap();
alision5cfc35d2013-07-11 15:11:39 -0400559 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
560 if ((String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM) != null)
561 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM));
alisioncc7bb422013-06-06 15:31:39 -0400562 else
alision5cfc35d2013-07-11 15:11:39 -0400563 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, "*");
564 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400565 swigmap.add(entry);
566 return swigmap;
567
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400568 }
569 });
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400570 }
571
alisioncc7bb422013-06-06 15:31:39 -0400572 public ArrayList<HashMap<String, String>> convertSwigToNative(VectMap swigmap) {
573
574 ArrayList<HashMap<String, String>> nativemap = new ArrayList<HashMap<String, String>>();
575 Log.i(TAG, "swigmap size " + swigmap.size());
576 for (int i = 0; i < swigmap.size(); ++i) {
577 Log.i(TAG, "Entry " + i);
578 StringMap tmp = swigmap.get(i);
alision5cfc35d2013-07-11 15:11:39 -0400579 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
alision806e18e2013-06-21 15:30:17 -0400580 // Log.i(TAG, tmp.get(ServiceConstants.CONFIG_ACCOUNT_REALM));
alision5cfc35d2013-07-11 15:11:39 -0400581 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400582 }
583
584 return nativemap;
585 }
586
Alexandre Savard46036572012-10-05 13:56:49 -0400587 @Override
588 public String addAccount(Map map) {
589 class AddAccount extends SipRunnableWithReturn {
590 StringMap map;
alision371b77e2013-04-23 14:51:26 -0400591
592 AddAccount(StringMap m) {
593 map = m;
594 }
595
Alexandre Savard46036572012-10-05 13:56:49 -0400596 @Override
597 protected String doRun() throws SameThreadException {
598 Log.i(TAG, "SipService.getAccountDetails() thread running...");
599 return configurationManagerJNI.addAccount(map);
600 }
alision371b77e2013-04-23 14:51:26 -0400601 }
Alexandre Savard46036572012-10-05 13:56:49 -0400602
alision371b77e2013-04-23 14:51:26 -0400603 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
Alexandre Savard46036572012-10-05 13:56:49 -0400604
605 AddAccount runInstance = new AddAccount(swigmap);
606 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400607 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400608 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400609 }
Alexandre Savard46036572012-10-05 13:56:49 -0400610 String accountId = (String) runInstance.getVal();
611
612 return accountId;
613 }
614
615 @Override
616 public void removeAccount(final String accountId) {
617 getExecutor().execute(new SipRunnable() {
618 @Override
619 protected void doRun() throws SameThreadException {
620 Log.i(TAG, "SipService.setAccountDetails() thread running...");
621 configurationManagerJNI.removeAccount(accountId);
622 }
623 });
624 }
alision5f899632013-04-22 17:26:56 -0400625
alisione2a38e12013-04-25 14:20:20 -0400626 @Override
627 public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
628 class History extends SipRunnableWithReturn {
629
630 @Override
631 protected VectMap doRun() throws SameThreadException {
632 Log.i(TAG, "SipService.getHistory() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400633
alisione2a38e12013-04-25 14:20:20 -0400634 return configurationManagerJNI.getHistory();
635 }
636 }
637
638 History runInstance = new History();
639 getExecutor().execute(runInstance);
640 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400641 // Log.w(TAG, "Waiting for getHistory");
alisione2a38e12013-04-25 14:20:20 -0400642 }
alision1005ba12013-06-19 13:52:44 -0400643 Log.i(TAG, "SipService.getHistory() DONE");
alisione2a38e12013-04-25 14:20:20 -0400644 VectMap swigmap = (VectMap) runInstance.getVal();
645
646 ArrayList<HashMap<String, String>> nativemap = HistoryHandler.convertSwigToNative(swigmap);
647
648 return nativemap;
649 }
alision7f18fc82013-05-01 09:37:33 -0400650
alision43a9b362013-05-01 16:30:15 -0400651 /*************************
652 * Transfer related API
653 *************************/
654
alision7f18fc82013-05-01 09:37:33 -0400655 @Override
656 public void transfer(final String callID, final String to) throws RemoteException {
657 getExecutor().execute(new SipRunnable() {
658 @Override
659 protected void doRun() throws SameThreadException, RemoteException {
660 Log.i(TAG, "SipService.transfer() thread running...");
661 if (callManagerJNI.transfer(callID, to)) {
662 Bundle bundle = new Bundle();
663 bundle.putString("CallID", callID);
664 bundle.putString("State", "HUNGUP");
665 Intent intent = new Intent(CallManagerCallBack.CALL_STATE_CHANGED);
alision7f18fc82013-05-01 09:37:33 -0400666 intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
alision84813a12013-05-27 17:40:39 -0400667 sendBroadcast(intent);
alision7f18fc82013-05-01 09:37:33 -0400668 } else
669 Log.i(TAG, "NOT OK");
670 }
671 });
672
673 }
alision43a9b362013-05-01 16:30:15 -0400674
alision7f18fc82013-05-01 09:37:33 -0400675 @Override
676 public void attendedTransfer(final String transferID, final String targetID) throws RemoteException {
677 getExecutor().execute(new SipRunnable() {
678 @Override
679 protected void doRun() throws SameThreadException, RemoteException {
alision43a9b362013-05-01 16:30:15 -0400680 Log.i(TAG, "SipService.attendedTransfer() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400681 if (callManagerJNI.attendedTransfer(transferID, targetID)) {
682 Log.i(TAG, "OK");
alision7f18fc82013-05-01 09:37:33 -0400683 } else
684 Log.i(TAG, "NOT OK");
685 }
686 });
alision43a9b362013-05-01 16:30:15 -0400687
688 }
689
690 /*************************
691 * Conference related API
692 *************************/
693
694 @Override
695 public void removeConference(final String confID) throws RemoteException {
696 getExecutor().execute(new SipRunnable() {
697 @Override
698 protected void doRun() throws SameThreadException, RemoteException {
699 Log.i(TAG, "SipService.createConference() thread running...");
700 callManagerJNI.removeConference(confID);
701 }
702 });
703
alision7f18fc82013-05-01 09:37:33 -0400704 }
705
706 @Override
alision43a9b362013-05-01 16:30:15 -0400707 public void joinParticipant(final String sel_callID, final String drag_callID) throws RemoteException {
708 getExecutor().execute(new SipRunnable() {
709 @Override
710 protected void doRun() throws SameThreadException, RemoteException {
711 Log.i(TAG, "SipService.joinParticipant() thread running...");
712 callManagerJNI.joinParticipant(sel_callID, drag_callID);
alision806e18e2013-06-21 15:30:17 -0400713 // Generate a CONF_CREATED callback
alision43a9b362013-05-01 16:30:15 -0400714 }
715 });
716
alision7f18fc82013-05-01 09:37:33 -0400717 }
718
alision7f18fc82013-05-01 09:37:33 -0400719 @Override
alision806e18e2013-06-21 15:30:17 -0400720 public void addParticipant(final SipCall call, final String confID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400721 getExecutor().execute(new SipRunnable() {
722 @Override
723 protected void doRun() throws SameThreadException, RemoteException {
724 Log.i(TAG, "SipService.addParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400725 callManagerJNI.addParticipant(call.getCallId(), confID);
726 current_confs.get(confID).getParticipants().add(call);
alision43a9b362013-05-01 16:30:15 -0400727 }
728 });
729
alision7f18fc82013-05-01 09:37:33 -0400730 }
731
732 @Override
alision43a9b362013-05-01 16:30:15 -0400733 public void addMainParticipant(final String confID) throws RemoteException {
734 getExecutor().execute(new SipRunnable() {
735 @Override
736 protected void doRun() throws SameThreadException, RemoteException {
737 Log.i(TAG, "SipService.addMainParticipant() thread running...");
738 callManagerJNI.addMainParticipant(confID);
739 }
740 });
741
alision7f18fc82013-05-01 09:37:33 -0400742 }
743
744 @Override
alision43a9b362013-05-01 16:30:15 -0400745 public void detachParticipant(final String callID) throws RemoteException {
746 getExecutor().execute(new SipRunnable() {
747 @Override
748 protected void doRun() throws SameThreadException, RemoteException {
749 Log.i(TAG, "SipService.detachParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400750 Log.i(TAG, "Detaching " + callID);
751 Iterator<Entry<String, Conference>> it = current_confs.entrySet().iterator();
752 Log.i(TAG, "current_confs size " + current_confs.size());
753 while (it.hasNext()) {
754 Conference tmp = it.next().getValue();
755 Log.i(TAG, "conf has " + tmp.getParticipants().size() + " participants");
756 if (tmp.contains(callID)) {
757 current_calls.put(callID, tmp.getCall(callID));
758 Log.i(TAG, "Call found and put in current_calls");
759 }
760 }
alision43a9b362013-05-01 16:30:15 -0400761 callManagerJNI.detachParticipant(callID);
762 }
763 });
764
alision7f18fc82013-05-01 09:37:33 -0400765 }
766
767 @Override
alision43a9b362013-05-01 16:30:15 -0400768 public void joinConference(final String sel_confID, final String drag_confID) throws RemoteException {
769 getExecutor().execute(new SipRunnable() {
770 @Override
771 protected void doRun() throws SameThreadException, RemoteException {
772 Log.i(TAG, "SipService.joinConference() thread running...");
773 callManagerJNI.joinConference(sel_confID, drag_confID);
774 }
775 });
776
alision7f18fc82013-05-01 09:37:33 -0400777 }
778
779 @Override
alision43a9b362013-05-01 16:30:15 -0400780 public void hangUpConference(final String confID) throws RemoteException {
781 getExecutor().execute(new SipRunnable() {
782 @Override
783 protected void doRun() throws SameThreadException, RemoteException {
784 Log.i(TAG, "SipService.joinConference() thread running...");
785 callManagerJNI.hangUpConference(confID);
786 }
787 });
788
alision7f18fc82013-05-01 09:37:33 -0400789 }
790
791 @Override
alision43a9b362013-05-01 16:30:15 -0400792 public void holdConference(final String confID) throws RemoteException {
793 getExecutor().execute(new SipRunnable() {
794 @Override
795 protected void doRun() throws SameThreadException, RemoteException {
796 Log.i(TAG, "SipService.holdConference() thread running...");
797 callManagerJNI.holdConference(confID);
798 }
799 });
800
alision7f18fc82013-05-01 09:37:33 -0400801 }
802
803 @Override
alision43a9b362013-05-01 16:30:15 -0400804 public void unholdConference(final String confID) throws RemoteException {
805 getExecutor().execute(new SipRunnable() {
806 @Override
807 protected void doRun() throws SameThreadException, RemoteException {
808 Log.i(TAG, "SipService.unholdConference() thread running...");
809 callManagerJNI.unholdConference(confID);
810 }
811 });
812
alision7f18fc82013-05-01 09:37:33 -0400813 }
Alexandre Lision67817192013-07-18 12:04:30 -0400814
alisioncd8fb912013-06-28 14:43:51 -0400815 @Override
816 public boolean isConferenceParticipant(final String callID) throws RemoteException {
817 class IsParticipant extends SipRunnableWithReturn {
818
819 @Override
820 protected Boolean doRun() throws SameThreadException {
821 Log.i(TAG, "SipService.isRecording() thread running...");
822 return callManagerJNI.isConferenceParticipant(callID);
823 }
824 }
825
826 IsParticipant runInstance = new IsParticipant();
827 getExecutor().execute(runInstance);
828 while (!runInstance.isDone()) {
829 }
830
831 return (Boolean) runInstance.getVal();
832 }
alision7f18fc82013-05-01 09:37:33 -0400833
834 @Override
alisiondf1dac92013-06-27 17:35:53 -0400835 public HashMap<String, Conference> getConferenceList() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -0400836 // class ConfList extends SipRunnableWithReturn {
837 // @Override
838 // protected StringVect doRun() throws SameThreadException {
839 // Log.i(TAG, "SipService.getConferenceList() thread running...");
840 // return callManagerJNI.getConferenceList();
841 // }
842 // }
843 // ;
844 // ConfList runInstance = new ConfList();
845 // getExecutor().execute(runInstance);
846 // while (!runInstance.isDone()) {
847 // // Log.w(TAG, "Waiting for getConferenceList");
848 // }
849 // StringVect swigvect = (StringVect) runInstance.getVal();
850 //
851 // ArrayList<String> nativelist = new ArrayList<String>();
852 //
853 // for (int i = 0; i < swigvect.size(); i++)
854 // nativelist.add(swigvect.get(i));
855 //
856 // return nativelist;
alisiondf1dac92013-06-27 17:35:53 -0400857 return current_confs;
alision7f18fc82013-05-01 09:37:33 -0400858 }
859
860 @Override
alision907bde72013-06-20 14:40:37 -0400861 public List getParticipantList(final String confID) throws RemoteException {
862 class PartList extends SipRunnableWithReturn {
863 @Override
864 protected StringVect doRun() throws SameThreadException {
865 Log.i(TAG, "SipService.getAccountList() thread running...");
866 return callManagerJNI.getParticipantList(confID);
867 }
868 }
869 ;
870 PartList runInstance = new PartList();
871 getExecutor().execute(runInstance);
872 while (!runInstance.isDone()) {
873 // Log.w(TAG, "Waiting for getConferenceList");
874 }
875 StringVect swigvect = (StringVect) runInstance.getVal();
876
877 ArrayList<String> nativelist = new ArrayList<String>();
878
879 for (int i = 0; i < swigvect.size(); i++)
880 nativelist.add(swigvect.get(i));
881
882 return nativelist;
alision7f18fc82013-05-01 09:37:33 -0400883 }
alision806e18e2013-06-21 15:30:17 -0400884
alision1005ba12013-06-19 13:52:44 -0400885 @Override
alision7f18fc82013-05-01 09:37:33 -0400886 public String getConferenceId(String callID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400887 Log.e(TAG, "getConferenceList not implemented");
alision7f18fc82013-05-01 09:37:33 -0400888 return null;
889 }
890
891 @Override
alision806e18e2013-06-21 15:30:17 -0400892 public String getConferenceDetails(final String callID) throws RemoteException {
893 class ConfDetails extends SipRunnableWithReturn {
894 @Override
895 protected StringMap doRun() throws SameThreadException {
896 Log.i(TAG, "SipService.getAccountList() thread running...");
897 return callManagerJNI.getConferenceDetails(callID);
898 }
899 }
900 ;
901 ConfDetails runInstance = new ConfDetails();
902 getExecutor().execute(runInstance);
903 while (!runInstance.isDone()) {
904 // Log.w(TAG, "Waiting for getConferenceList");
905 }
906 StringMap swigvect = (StringMap) runInstance.getVal();
907
908 return swigvect.get("CONF_STATE");
alision7f18fc82013-05-01 09:37:33 -0400909 }
910
alision04a00182013-05-10 17:05:29 -0400911 @Override
912 public String getRecordPath() throws RemoteException {
913 class RecordPath extends SipRunnableWithReturn {
914
915 @Override
916 protected String doRun() throws SameThreadException {
917 Log.i(TAG, "SipService.getRecordPath() thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +1000918 return configurationManagerJNI.getRecordPath();
alision04a00182013-05-10 17:05:29 -0400919 }
920 }
921
922 RecordPath runInstance = new RecordPath();
923 getExecutor().execute(runInstance);
924 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400925 // Log.w(TAG, "Waiting for getRecordPath");
alision04a00182013-05-10 17:05:29 -0400926 }
927 String path = (String) runInstance.getVal();
928
929 return path;
930 }
931
932 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400933 public boolean toggleRecordingCall(final String id) throws RemoteException {
Adrien Béraud9360f242013-09-19 11:07:42 +1000934
Alexandre Lisiona764c682013-09-09 10:02:07 -0400935 class ToggleRecording extends SipRunnableWithReturn {
936
alision04a00182013-05-10 17:05:29 -0400937 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400938 protected Boolean doRun() throws SameThreadException {
939 Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
940 return callManagerJNI.toggleRecording(id);
alision04a00182013-05-10 17:05:29 -0400941 }
Alexandre Lisiona764c682013-09-09 10:02:07 -0400942 }
943
944 ToggleRecording runInstance = new ToggleRecording();
945 getExecutor().execute(runInstance);
946 while (!runInstance.isDone()) {
947 }
948
949 return (Boolean) runInstance.getVal();
alision04a00182013-05-10 17:05:29 -0400950
951 }
Alexandre Lision67817192013-07-18 12:04:30 -0400952
alision50fa0722013-06-25 17:29:44 -0400953 @Override
alisiondf1dac92013-06-27 17:35:53 -0400954 public boolean isRecording(final String id) throws RemoteException {
955 class IsRecording extends SipRunnableWithReturn {
956
957 @Override
958 protected Boolean doRun() throws SameThreadException {
959 Log.i(TAG, "SipService.isRecording() thread running...");
960 return callManagerJNI.getIsRecording(id);
961 }
962 }
963
964 IsRecording runInstance = new IsRecording();
965 getExecutor().execute(runInstance);
966 while (!runInstance.isDone()) {
967 }
968
969 return (Boolean) runInstance.getVal();
Alexandre Lision67817192013-07-18 12:04:30 -0400970
alisiondf1dac92013-06-27 17:35:53 -0400971 }
Alexandre Lision67817192013-07-18 12:04:30 -0400972
alisiondf1dac92013-06-27 17:35:53 -0400973 @Override
alision50fa0722013-06-25 17:29:44 -0400974 public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
975 getExecutor().execute(new SipRunnable() {
976 @Override
977 protected void doRun() throws SameThreadException, RemoteException {
978 Log.i(TAG, "SipService.setRecordingCall() thread running...");
979 callManagerJNI.startRecordedFilePlayback(filepath);
980 }
981 });
982 return false;
983 }
984
985 @Override
986 public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
987 getExecutor().execute(new SipRunnable() {
988 @Override
989 protected void doRun() throws SameThreadException, RemoteException {
990 Log.i(TAG, "SipService.stopRecordedFilePlayback() thread running...");
991 callManagerJNI.stopRecordedFilePlayback(filepath);
992 }
993 });
994 }
alision04a00182013-05-10 17:05:29 -0400995
996 @Override
997 public void setRecordPath(final String path) throws RemoteException {
998 getExecutor().execute(new SipRunnable() {
999 @Override
1000 protected void doRun() throws SameThreadException, RemoteException {
Alexandre Lisiona764c682013-09-09 10:02:07 -04001001 Log.i(TAG, "SipService.setRecordPath() "+path+" thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +10001002 configurationManagerJNI.setRecordPath(path);
alision04a00182013-05-10 17:05:29 -04001003 }
1004 });
1005 }
1006
1007 @Override
1008 public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
1009 getExecutor().execute(new SipRunnable() {
1010 @Override
1011 protected void doRun() throws SameThreadException, RemoteException {
1012 Log.i(TAG, "SipService.sendTextMessage() thread running...");
Alexandre Lision10314352013-07-17 15:06:56 -04001013 callManagerJNI.sendTextMessage(callID, message);
alision04a00182013-05-10 17:05:29 -04001014 }
1015 });
1016
1017 }
1018
alisiond295ec22013-05-17 10:12:13 -04001019 @Override
1020 public List getAudioCodecList(String accountID) throws RemoteException {
alision806e18e2013-06-21 15:30:17 -04001021 // class AudioCodecList extends SipRunnableWithReturn {
1022 //
1023 // @Override
1024 // protected IntVect doRun() throws SameThreadException {
1025 // Log.i(TAG, "SipService.getAudioCodecList() thread running...");
1026 // return configurationManagerJNI.getAudioCodecList();
1027 // }
1028 // }
1029 //
1030 // AudioCodecList runInstance = new AudioCodecList();
1031 // getExecutor().execute(runInstance);
1032 // while (!runInstance.isDone()) {
1033 // Log.w(TAG, "Waiting for getAudioCodecList");
1034 // }
1035 // IntVect swigmap = (IntVect) runInstance.getVal();
1036 //
1037 // ArrayList<Integer> codecs = AudioHandler.convertSwigToNative(swigmap);
1038 //
1039 // return codecs;
alision907bde72013-06-20 14:40:37 -04001040 return null;
alisiond295ec22013-05-17 10:12:13 -04001041 }
1042
alision9f7a6ec2013-05-24 16:26:26 -04001043 @Override
alisionfde875f2013-05-28 17:01:54 -04001044 public HashMap<String, SipCall> getCallList() throws RemoteException {
alision85704182013-05-29 15:23:03 -04001045 // class CallList extends SipRunnableWithReturn {
1046 //
1047 // @Override
1048 // protected StringVect doRun() throws SameThreadException {
1049 // Log.i(TAG, "SipService.getCallList() thread running...");
1050 // return callManagerJNI.getCallList();
1051 // }
1052 // }
1053 //
1054 // CallList runInstance = new CallList();
1055 // getExecutor().execute(runInstance);
1056 // while (!runInstance.isDone()) {
1057 // Log.w(TAG, "Waiting for getAudioCodecList");
1058 // }
1059 // StringVect swigmap = (StringVect) runInstance.getVal();
1060 //
1061 // ArrayList<String> nativemap = new ArrayList<String>();
1062 // for (int i = 0; i < swigmap.size(); ++i) {
1063 //
1064 // String t = swigmap.get(i);
1065 // nativemap.add(t);
1066 // }
alision9f7a6ec2013-05-24 16:26:26 -04001067
alision2cb99562013-05-30 17:02:20 -04001068 return getCurrent_calls();
alision9f7a6ec2013-05-24 16:26:26 -04001069 }
1070
alision85704182013-05-29 15:23:03 -04001071 @Override
1072 public SipCall getCall(String callID) throws RemoteException {
alision2cb99562013-05-30 17:02:20 -04001073 return getCurrent_calls().get(callID);
1074 }
1075
1076 /***********************
1077 * Notification API
1078 ***********************/
1079 @Override
1080 public void createNotification() throws RemoteException {
1081 makeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001082
alision2cb99562013-05-30 17:02:20 -04001083 }
1084
1085 @Override
1086 public void destroyNotification() throws RemoteException {
1087 removeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001088
alision2cb99562013-05-30 17:02:20 -04001089 }
alisioncc7bb422013-06-06 15:31:39 -04001090
Adrien Béraud9360f242013-09-19 11:07:42 +10001091 private final int NOTIFICATION_ID = new Random().nextInt(1000);
alisioncc7bb422013-06-06 15:31:39 -04001092
alision2cb99562013-05-30 17:02:20 -04001093 private void makeNotification() {
alisioncc7bb422013-06-06 15:31:39 -04001094 if (current_calls.size() == 0) {
alision2cb99562013-05-30 17:02:20 -04001095 return;
1096 }
1097 Intent notificationIntent = new Intent(getApplicationContext(), SFLPhoneHomeActivity.class);
alisioncc7bb422013-06-06 15:31:39 -04001098 PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 007, notificationIntent,
1099 PendingIntent.FLAG_UPDATE_CURRENT);
alision2cb99562013-05-30 17:02:20 -04001100
1101 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
Adrien Béraud9360f242013-09-19 11:07:42 +10001102 nm.cancel(NOTIFICATION_ID); // clear previous notifications.
alision2cb99562013-05-30 17:02:20 -04001103
1104 NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext());
alisioncc7bb422013-06-06 15:31:39 -04001105 //
1106 // builder.setContent(view);
1107 builder.setContentIntent(contentIntent).setOngoing(true).setSmallIcon(R.drawable.ic_launcher)
Adrien Béraud9360f242013-09-19 11:07:42 +10001108 .setContentTitle(getCurrent_calls().size() + " ongoing calls").setTicker("Pending calls").setWhen(System.currentTimeMillis())
1109 .setAutoCancel(false);
alision2cb99562013-05-30 17:02:20 -04001110 builder.setPriority(NotificationCompat.PRIORITY_MAX);
1111 Notification n = builder.build();
1112
1113 nm.notify(NOTIFICATION_ID, n);
alision2cb99562013-05-30 17:02:20 -04001114 }
1115
1116 public void removeNotification() {
1117 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
1118 nm.cancel(NOTIFICATION_ID);
alision85704182013-05-29 15:23:03 -04001119 }
1120
alisiondf1dac92013-06-27 17:35:53 -04001121 @Override
1122 public Conference getCurrentCall() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -04001123 for (SipCall i : current_calls.values()) {
Adrien Béraud9360f242013-09-19 11:07:42 +10001124
Alexandre Lisionc51ccb12013-09-11 16:00:30 -04001125 // Incoming >> Ongoing
1126 if(i.isIncoming()){
1127 Conference tmp = new Conference("-1");
1128 tmp.getParticipants().add(i);
1129 return tmp;
1130 }
Adrien Béraud9360f242013-09-19 11:07:42 +10001131
Alexandre Lision67817192013-07-18 12:04:30 -04001132 if (i.isOngoing()) {
alisiondf1dac92013-06-27 17:35:53 -04001133 Conference tmp = new Conference("-1");
1134 tmp.getParticipants().add(i);
1135 return tmp;
1136 }
1137 }
Alexandre Lision67817192013-07-18 12:04:30 -04001138
1139 if (!current_confs.isEmpty()) {
alisiondf1dac92013-06-27 17:35:53 -04001140 return (Conference) current_confs.values().toArray()[0];
1141 }
1142 return null;
1143 }
1144
Emeric Vigier6119d782012-09-21 18:04:14 -04001145 };
Emeric Vigiereaf2c492012-09-19 14:38:20 -04001146}