blob: 1e2a63702829fdc853b84336e1ec0ddd83b6a049 [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;
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());
123
124 }
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
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400193 Log.w(TAG, "Sending to targeT");
alision43a9b362013-05-01 16:30:15 -0400194 Message.obtain(this, 0/* don't care */, task).sendToTarget();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400195 Log.w(TAG, "SenT!");
alision43a9b362013-05-01 16:30:15 -0400196 }
197
198 @Override
199 public void handleMessage(Message msg) {
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400200 Log.w(TAG, "handleMessage");
alision43a9b362013-05-01 16:30:15 -0400201 if (msg.obj instanceof Runnable) {
202 executeInternal((Runnable) msg.obj);
203 } else {
204 Log.w(TAG, "can't handle msg: " + msg);
205 }
206 }
207
208 private void executeInternal(Runnable task) {
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400209 Log.w(TAG, "executeInternal");
alision43a9b362013-05-01 16:30:15 -0400210 try {
211 task.run();
212 } catch (Throwable t) {
213 Log.e(TAG, "run task: " + task, t);
214 }
215 }
216 }
217
218 private void startPjSipStack() throws SameThreadException {
219 if (isPjSipStackStarted)
220 return;
221
222 try {
223 System.loadLibrary("gnustl_shared");
224 System.loadLibrary("expat");
225 System.loadLibrary("yaml");
226 System.loadLibrary("ccgnu2");
227 System.loadLibrary("crypto");
228 System.loadLibrary("ssl");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400229 System.loadLibrary("sndfile");
alision43a9b362013-05-01 16:30:15 -0400230 System.loadLibrary("ccrtp1");
alision43a9b362013-05-01 16:30:15 -0400231 System.loadLibrary("samplerate");
232 System.loadLibrary("codec_ulaw");
233 System.loadLibrary("codec_alaw");
234 System.loadLibrary("speexresampler");
235 System.loadLibrary("sflphone");
236 isPjSipStackStarted = true;
Alexandre Lision67817192013-07-18 12:04:30 -0400237
alision43a9b362013-05-01 16:30:15 -0400238 } catch (UnsatisfiedLinkError e) {
239 Log.e(TAG, "Problem with the current Pj stack...", e);
240 isPjSipStackStarted = false;
241 return;
242 } catch (Exception e) {
243 Log.e(TAG, "Problem with the current Pj stack...", e);
244 }
245
Alexandre Lision67817192013-07-18 12:04:30 -0400246 Log.i(TAG, "PjSIPStack started");
247 managerImpl = SFLPhoneservice.instance();
248
249 /* set static AppPath before calling manager.init */
250
251// managerImpl.setPath(sflphoneApp.getAppPath());
alision43a9b362013-05-01 16:30:15 -0400252
alision3ea8f3c2013-07-16 17:35:35 -0400253 callManagerJNI = new CallManager();
alision43a9b362013-05-01 16:30:15 -0400254 callManagerCallBack = new CallManagerCallBack(this);
255 SFLPhoneservice.setCallbackObject(callManagerCallBack);
256
alision3ea8f3c2013-07-16 17:35:35 -0400257 configurationManagerJNI = new ConfigurationManager();
alision43a9b362013-05-01 16:30:15 -0400258 configurationManagerCallback = new ConfigurationManagerCallback(this);
259 SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
Alexandre Lision67817192013-07-18 12:04:30 -0400260
261 Log.i(TAG, "before init");
262 managerImpl.init("");
263
264 Log.i(TAG, "->startPjSipStack");
alision43a9b362013-05-01 16:30:15 -0400265
alision43a9b362013-05-01 16:30:15 -0400266 }
267
alision2cb99562013-05-30 17:02:20 -0400268 public HashMap<String, SipCall> getCurrent_calls() {
269 return current_calls;
270 }
271
alision43a9b362013-05-01 16:30:15 -0400272 // Enforce same thread contract to ensure we do not call from somewhere else
273 public class SameThreadException extends Exception {
274 private static final long serialVersionUID = -905639124232613768L;
275
276 public SameThreadException() {
277 super("Should be launched from a single worker thread");
278 }
279 }
280
281 public abstract static class SipRunnable implements Runnable {
282 protected abstract void doRun() throws SameThreadException, RemoteException;
283
284 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
309 public void run() {
310 try {
311 obj = doRun();
312 done = true;
313 } catch (SameThreadException e) {
314 Log.e(TAG, "Not done from same thread");
315 }
316 }
317 }
318
319 class StartRunnable extends SipRunnable {
320 @Override
321 protected void doRun() throws SameThreadException {
322 startPjSipStack();
323 }
324 }
325
326 private class SipServiceThread extends Thread {
327
328 public SipServiceThread() {
329 super("sipServiceThread");
330 }
331
332 @Override
333 public void run() {
334 Log.i(TAG, "SipService thread running...");
335 SipService sipService = SipService.this;
336 while (sipService.runFlag) {
337 try {
338 Thread.sleep(DELAY);
339 } catch (InterruptedException e) {
340 sipService.runFlag = false;
341 Log.w(TAG, "service thread interrupted!");
342 }
343 }
344 }
345 }
346
347 /* ************************************
348 *
349 * Implement public interface for the service
350 *
Alexandre Lision67817192013-07-18 12:04:30 -0400351 * *********************************
352 */
353
Emeric Vigier6119d782012-09-21 18:04:14 -0400354 private final ISipService.Stub mBinder = new ISipService.Stub() {
355
356 @Override
alisionfde875f2013-05-28 17:01:54 -0400357 public void placeCall(final SipCall call) {
Emeric Vigier6119d782012-09-21 18:04:14 -0400358 getExecutor().execute(new SipRunnable() {
359 @Override
360 protected void doRun() throws SameThreadException {
361 Log.i(TAG, "SipService.placeCall() thread running...");
alision907bde72013-06-20 14:40:37 -0400362 callManagerJNI.placeCall(call.getAccountID(), call.getCallId(), call.getContact().getPhones().get(0).getNumber());
alision2cb99562013-05-30 17:02:20 -0400363 getCurrent_calls().put(call.getCallId(), call);
Emeric Vigier6119d782012-09-21 18:04:14 -0400364 }
365 });
366 }
367
368 @Override
369 public void refuse(final String callID) {
370 getExecutor().execute(new SipRunnable() {
371 @Override
372 protected void doRun() throws SameThreadException {
373 Log.i(TAG, "SipService.refuse() thread running...");
374 callManagerJNI.refuse(callID);
375 }
376 });
377 }
378
379 @Override
380 public void accept(final String callID) {
381 getExecutor().execute(new SipRunnable() {
382 @Override
383 protected void doRun() throws SameThreadException {
Tristan Matthews40cf25e2013-07-24 13:45:15 -0400384 Log.i(TAG, "SipService.accept() thread running...");
Emeric Vigier6119d782012-09-21 18:04:14 -0400385 callManagerJNI.accept(callID);
386 }
387 });
388 }
389
390 @Override
391 public void hangUp(final String callID) {
392 getExecutor().execute(new SipRunnable() {
393 @Override
394 protected void doRun() throws SameThreadException {
395 Log.i(TAG, "SipService.hangUp() thread running...");
396 callManagerJNI.hangUp(callID);
397 }
398 });
399 }
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400400
401 @Override
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400402 public void hold(final String callID) {
403 getExecutor().execute(new SipRunnable() {
404 @Override
405 protected void doRun() throws SameThreadException {
406 Log.i(TAG, "SipService.hold() thread running...");
407 callManagerJNI.hold(callID);
408 }
409 });
410 }
411
412 @Override
413 public void unhold(final String callID) {
414 getExecutor().execute(new SipRunnable() {
415 @Override
416 protected void doRun() throws SameThreadException {
417 Log.i(TAG, "SipService.unhold() thread running...");
418 callManagerJNI.unhold(callID);
419 }
420 });
421 }
422
423 @Override
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400424 public void setAudioPlugin(final String audioPlugin) {
425 getExecutor().execute(new SipRunnable() {
alision371b77e2013-04-23 14:51:26 -0400426 @Override
427 protected void doRun() throws SameThreadException {
428 Log.i(TAG, "SipService.setAudioPlugin() thread running...");
429 configurationManagerJNI.setAudioPlugin(audioPlugin);
430 }
Alexandre Savard31d27c62012-10-04 16:05:08 -0400431 });
432 }
433
434 @Override
435 public String getCurrentAudioOutputPlugin() {
436 class CurrentAudioPlugin extends SipRunnableWithReturn {
437 @Override
438 protected String doRun() throws SameThreadException {
439 Log.i(TAG, "SipService.getCurrentAudioOutputPlugin() thread running...");
440 return configurationManagerJNI.getCurrentAudioOutputPlugin();
441 }
alision371b77e2013-04-23 14:51:26 -0400442 }
443 ;
Alexandre Savard31d27c62012-10-04 16:05:08 -0400444
445 CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
446 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400447 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400448 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400449 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400450 return (String) runInstance.getVal();
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400451 }
Alexandre Savard713a34d2012-09-26 15:50:41 -0400452
453 @Override
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400454 public ArrayList<String> getAccountList() {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400455 class AccountList extends SipRunnableWithReturn {
456 @Override
457 protected StringVect doRun() throws SameThreadException {
458 Log.i(TAG, "SipService.getAccountList() thread running...");
459 return configurationManagerJNI.getAccountList();
460 }
alision371b77e2013-04-23 14:51:26 -0400461 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400462 AccountList runInstance = new AccountList();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400463 Log.i(TAG, "SipService.getAccountList() thread running...");
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400464 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400465 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400466 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400467 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400468 StringVect swigvect = (StringVect) runInstance.getVal();
469
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400470 ArrayList<String> nativelist = new ArrayList<String>();
Alexandre Savard52a72522012-09-27 16:40:13 -0400471
alision371b77e2013-04-23 14:51:26 -0400472 for (int i = 0; i < swigvect.size(); i++)
473 nativelist.add(swigvect.get(i));
Alexandre Savard52a72522012-09-27 16:40:13 -0400474
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400475 return nativelist;
alision371b77e2013-04-23 14:51:26 -0400476 }
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400477
478 @Override
alision371b77e2013-04-23 14:51:26 -0400479 public HashMap<String, String> getAccountDetails(final String accountID) {
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400480 class AccountDetails extends SipRunnableWithReturn {
481 private String id;
alision371b77e2013-04-23 14:51:26 -0400482
483 AccountDetails(String accountId) {
484 id = accountId;
485 }
486
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400487 @Override
488 protected StringMap doRun() throws SameThreadException {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400489 Log.i(TAG, "SipService.getAccountDetails() thread running...");
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400490 return configurationManagerJNI.getAccountDetails(id);
491 }
alision371b77e2013-04-23 14:51:26 -0400492 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400493
494 AccountDetails runInstance = new AccountDetails(accountID);
495 getExecutor().execute(runInstance);
alisionfde875f2013-05-28 17:01:54 -0400496
alision371b77e2013-04-23 14:51:26 -0400497 while (!runInstance.isDone()) {
498 }
499 StringMap swigmap = (StringMap) runInstance.getVal();
Alexandre Savard713a34d2012-09-26 15:50:41 -0400500
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400501 HashMap<String, String> nativemap = AccountDetailsHandler.convertSwigToNative(swigmap);
Alexandre Savard713a34d2012-09-26 15:50:41 -0400502
503 return nativemap;
504 }
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400505
506 @Override
alisioncc7bb422013-06-06 15:31:39 -0400507 public void setAccountDetails(final String accountId, final Map map) {
alision371b77e2013-04-23 14:51:26 -0400508 HashMap<String, String> nativemap = (HashMap<String, String>) map;
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400509
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400510 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig(nativemap);
Alexandre Savard718d49f2012-10-02 15:17:13 -0400511
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400512 getExecutor().execute(new SipRunnable() {
513 @Override
514 protected void doRun() throws SameThreadException {
alisioncc7bb422013-06-06 15:31:39 -0400515
516 configurationManagerJNI.setCredentials(accountId, extractCredentials(map));
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400517 configurationManagerJNI.setAccountDetails(accountId, swigmap);
alisioncc7bb422013-06-06 15:31:39 -0400518
519 convertSwigToNative(configurationManagerJNI.getCredentials(accountId));
520 Log.i(TAG, "SipService.setAccountDetails() thread running...");
521 }
522
523 private VectMap extractCredentials(Map map) {
524 VectMap swigmap = new VectMap();
525 StringMap entry = new StringMap();
alision5cfc35d2013-07-11 15:11:39 -0400526 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
527 if ((String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM) != null)
528 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM));
alisioncc7bb422013-06-06 15:31:39 -0400529 else
alision5cfc35d2013-07-11 15:11:39 -0400530 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, "*");
531 entry.set(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, (String) map.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400532 swigmap.add(entry);
533 return swigmap;
534
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400535 }
536 });
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400537 }
538
alisioncc7bb422013-06-06 15:31:39 -0400539 public ArrayList<HashMap<String, String>> convertSwigToNative(VectMap swigmap) {
540
541 ArrayList<HashMap<String, String>> nativemap = new ArrayList<HashMap<String, String>>();
542 Log.i(TAG, "swigmap size " + swigmap.size());
543 for (int i = 0; i < swigmap.size(); ++i) {
544 Log.i(TAG, "Entry " + i);
545 StringMap tmp = swigmap.get(i);
alision5cfc35d2013-07-11 15:11:39 -0400546 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
alision806e18e2013-06-21 15:30:17 -0400547 // Log.i(TAG, tmp.get(ServiceConstants.CONFIG_ACCOUNT_REALM));
alision5cfc35d2013-07-11 15:11:39 -0400548 Log.i(TAG, tmp.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
alisioncc7bb422013-06-06 15:31:39 -0400549 }
550
551 return nativemap;
552 }
553
Alexandre Savard46036572012-10-05 13:56:49 -0400554 @Override
555 public String addAccount(Map map) {
556 class AddAccount extends SipRunnableWithReturn {
557 StringMap map;
alision371b77e2013-04-23 14:51:26 -0400558
559 AddAccount(StringMap m) {
560 map = m;
561 }
562
Alexandre Savard46036572012-10-05 13:56:49 -0400563 @Override
564 protected String doRun() throws SameThreadException {
565 Log.i(TAG, "SipService.getAccountDetails() thread running...");
566 return configurationManagerJNI.addAccount(map);
567 }
alision371b77e2013-04-23 14:51:26 -0400568 }
Alexandre Savard46036572012-10-05 13:56:49 -0400569
alision371b77e2013-04-23 14:51:26 -0400570 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
Alexandre Savard46036572012-10-05 13:56:49 -0400571
572 AddAccount runInstance = new AddAccount(swigmap);
573 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400574 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400575 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400576 }
Alexandre Savard46036572012-10-05 13:56:49 -0400577 String accountId = (String) runInstance.getVal();
578
579 return accountId;
580 }
581
582 @Override
583 public void removeAccount(final String accountId) {
584 getExecutor().execute(new SipRunnable() {
585 @Override
586 protected void doRun() throws SameThreadException {
587 Log.i(TAG, "SipService.setAccountDetails() thread running...");
588 configurationManagerJNI.removeAccount(accountId);
589 }
590 });
591 }
alision5f899632013-04-22 17:26:56 -0400592
alisione2a38e12013-04-25 14:20:20 -0400593 @Override
594 public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
595 class History extends SipRunnableWithReturn {
596
597 @Override
598 protected VectMap doRun() throws SameThreadException {
599 Log.i(TAG, "SipService.getHistory() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400600
alisione2a38e12013-04-25 14:20:20 -0400601 return configurationManagerJNI.getHistory();
602 }
603 }
604
605 History runInstance = new History();
606 getExecutor().execute(runInstance);
607 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400608 // Log.w(TAG, "Waiting for getHistory");
alisione2a38e12013-04-25 14:20:20 -0400609 }
alision1005ba12013-06-19 13:52:44 -0400610 Log.i(TAG, "SipService.getHistory() DONE");
alisione2a38e12013-04-25 14:20:20 -0400611 VectMap swigmap = (VectMap) runInstance.getVal();
612
613 ArrayList<HashMap<String, String>> nativemap = HistoryHandler.convertSwigToNative(swigmap);
614
615 return nativemap;
616 }
alision7f18fc82013-05-01 09:37:33 -0400617
alision43a9b362013-05-01 16:30:15 -0400618 /*************************
619 * Transfer related API
620 *************************/
621
alision7f18fc82013-05-01 09:37:33 -0400622 @Override
623 public void transfer(final String callID, final String to) throws RemoteException {
624 getExecutor().execute(new SipRunnable() {
625 @Override
626 protected void doRun() throws SameThreadException, RemoteException {
627 Log.i(TAG, "SipService.transfer() thread running...");
628 if (callManagerJNI.transfer(callID, to)) {
629 Bundle bundle = new Bundle();
630 bundle.putString("CallID", callID);
631 bundle.putString("State", "HUNGUP");
632 Intent intent = new Intent(CallManagerCallBack.CALL_STATE_CHANGED);
alision7f18fc82013-05-01 09:37:33 -0400633 intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
alision84813a12013-05-27 17:40:39 -0400634 sendBroadcast(intent);
alision7f18fc82013-05-01 09:37:33 -0400635 } else
636 Log.i(TAG, "NOT OK");
637 }
638 });
639
640 }
alision43a9b362013-05-01 16:30:15 -0400641
alision7f18fc82013-05-01 09:37:33 -0400642 @Override
643 public void attendedTransfer(final String transferID, final String targetID) throws RemoteException {
644 getExecutor().execute(new SipRunnable() {
645 @Override
646 protected void doRun() throws SameThreadException, RemoteException {
alision43a9b362013-05-01 16:30:15 -0400647 Log.i(TAG, "SipService.attendedTransfer() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400648 if (callManagerJNI.attendedTransfer(transferID, targetID)) {
649 Log.i(TAG, "OK");
alision7f18fc82013-05-01 09:37:33 -0400650 } else
651 Log.i(TAG, "NOT OK");
652 }
653 });
alision43a9b362013-05-01 16:30:15 -0400654
655 }
656
657 /*************************
658 * Conference related API
659 *************************/
660
661 @Override
662 public void removeConference(final String confID) throws RemoteException {
663 getExecutor().execute(new SipRunnable() {
664 @Override
665 protected void doRun() throws SameThreadException, RemoteException {
666 Log.i(TAG, "SipService.createConference() thread running...");
667 callManagerJNI.removeConference(confID);
668 }
669 });
670
alision7f18fc82013-05-01 09:37:33 -0400671 }
672
673 @Override
alision43a9b362013-05-01 16:30:15 -0400674 public void joinParticipant(final String sel_callID, final String drag_callID) throws RemoteException {
675 getExecutor().execute(new SipRunnable() {
676 @Override
677 protected void doRun() throws SameThreadException, RemoteException {
678 Log.i(TAG, "SipService.joinParticipant() thread running...");
679 callManagerJNI.joinParticipant(sel_callID, drag_callID);
alision806e18e2013-06-21 15:30:17 -0400680 // Generate a CONF_CREATED callback
alision43a9b362013-05-01 16:30:15 -0400681 }
682 });
683
alision7f18fc82013-05-01 09:37:33 -0400684 }
685
alision7f18fc82013-05-01 09:37:33 -0400686 @Override
alision806e18e2013-06-21 15:30:17 -0400687 public void addParticipant(final SipCall call, final String confID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400688 getExecutor().execute(new SipRunnable() {
689 @Override
690 protected void doRun() throws SameThreadException, RemoteException {
691 Log.i(TAG, "SipService.addParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400692 callManagerJNI.addParticipant(call.getCallId(), confID);
693 current_confs.get(confID).getParticipants().add(call);
alision43a9b362013-05-01 16:30:15 -0400694 }
695 });
696
alision7f18fc82013-05-01 09:37:33 -0400697 }
698
699 @Override
alision43a9b362013-05-01 16:30:15 -0400700 public void addMainParticipant(final String confID) throws RemoteException {
701 getExecutor().execute(new SipRunnable() {
702 @Override
703 protected void doRun() throws SameThreadException, RemoteException {
704 Log.i(TAG, "SipService.addMainParticipant() thread running...");
705 callManagerJNI.addMainParticipant(confID);
706 }
707 });
708
alision7f18fc82013-05-01 09:37:33 -0400709 }
710
711 @Override
alision43a9b362013-05-01 16:30:15 -0400712 public void detachParticipant(final String callID) throws RemoteException {
713 getExecutor().execute(new SipRunnable() {
714 @Override
715 protected void doRun() throws SameThreadException, RemoteException {
716 Log.i(TAG, "SipService.detachParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400717 Log.i(TAG, "Detaching " + callID);
718 Iterator<Entry<String, Conference>> it = current_confs.entrySet().iterator();
719 Log.i(TAG, "current_confs size " + current_confs.size());
720 while (it.hasNext()) {
721 Conference tmp = it.next().getValue();
722 Log.i(TAG, "conf has " + tmp.getParticipants().size() + " participants");
723 if (tmp.contains(callID)) {
724 current_calls.put(callID, tmp.getCall(callID));
725 Log.i(TAG, "Call found and put in current_calls");
726 }
727 }
alision43a9b362013-05-01 16:30:15 -0400728 callManagerJNI.detachParticipant(callID);
729 }
730 });
731
alision7f18fc82013-05-01 09:37:33 -0400732 }
733
734 @Override
alision43a9b362013-05-01 16:30:15 -0400735 public void joinConference(final String sel_confID, final String drag_confID) throws RemoteException {
736 getExecutor().execute(new SipRunnable() {
737 @Override
738 protected void doRun() throws SameThreadException, RemoteException {
739 Log.i(TAG, "SipService.joinConference() thread running...");
740 callManagerJNI.joinConference(sel_confID, drag_confID);
741 }
742 });
743
alision7f18fc82013-05-01 09:37:33 -0400744 }
745
746 @Override
alision43a9b362013-05-01 16:30:15 -0400747 public void hangUpConference(final String confID) throws RemoteException {
748 getExecutor().execute(new SipRunnable() {
749 @Override
750 protected void doRun() throws SameThreadException, RemoteException {
751 Log.i(TAG, "SipService.joinConference() thread running...");
752 callManagerJNI.hangUpConference(confID);
753 }
754 });
755
alision7f18fc82013-05-01 09:37:33 -0400756 }
757
758 @Override
alision43a9b362013-05-01 16:30:15 -0400759 public void holdConference(final String confID) throws RemoteException {
760 getExecutor().execute(new SipRunnable() {
761 @Override
762 protected void doRun() throws SameThreadException, RemoteException {
763 Log.i(TAG, "SipService.holdConference() thread running...");
764 callManagerJNI.holdConference(confID);
765 }
766 });
767
alision7f18fc82013-05-01 09:37:33 -0400768 }
769
770 @Override
alision43a9b362013-05-01 16:30:15 -0400771 public void unholdConference(final String confID) throws RemoteException {
772 getExecutor().execute(new SipRunnable() {
773 @Override
774 protected void doRun() throws SameThreadException, RemoteException {
775 Log.i(TAG, "SipService.unholdConference() thread running...");
776 callManagerJNI.unholdConference(confID);
777 }
778 });
779
alision7f18fc82013-05-01 09:37:33 -0400780 }
Alexandre Lision67817192013-07-18 12:04:30 -0400781
alisioncd8fb912013-06-28 14:43:51 -0400782 @Override
783 public boolean isConferenceParticipant(final String callID) throws RemoteException {
784 class IsParticipant extends SipRunnableWithReturn {
785
786 @Override
787 protected Boolean doRun() throws SameThreadException {
788 Log.i(TAG, "SipService.isRecording() thread running...");
789 return callManagerJNI.isConferenceParticipant(callID);
790 }
791 }
792
793 IsParticipant runInstance = new IsParticipant();
794 getExecutor().execute(runInstance);
795 while (!runInstance.isDone()) {
796 }
797
798 return (Boolean) runInstance.getVal();
799 }
alision7f18fc82013-05-01 09:37:33 -0400800
801 @Override
alisiondf1dac92013-06-27 17:35:53 -0400802 public HashMap<String, Conference> getConferenceList() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -0400803 // class ConfList extends SipRunnableWithReturn {
804 // @Override
805 // protected StringVect doRun() throws SameThreadException {
806 // Log.i(TAG, "SipService.getConferenceList() thread running...");
807 // return callManagerJNI.getConferenceList();
808 // }
809 // }
810 // ;
811 // ConfList runInstance = new ConfList();
812 // getExecutor().execute(runInstance);
813 // while (!runInstance.isDone()) {
814 // // Log.w(TAG, "Waiting for getConferenceList");
815 // }
816 // StringVect swigvect = (StringVect) runInstance.getVal();
817 //
818 // ArrayList<String> nativelist = new ArrayList<String>();
819 //
820 // for (int i = 0; i < swigvect.size(); i++)
821 // nativelist.add(swigvect.get(i));
822 //
823 // return nativelist;
alisiondf1dac92013-06-27 17:35:53 -0400824 return current_confs;
alision7f18fc82013-05-01 09:37:33 -0400825 }
826
827 @Override
alision907bde72013-06-20 14:40:37 -0400828 public List getParticipantList(final String confID) throws RemoteException {
829 class PartList extends SipRunnableWithReturn {
830 @Override
831 protected StringVect doRun() throws SameThreadException {
832 Log.i(TAG, "SipService.getAccountList() thread running...");
833 return callManagerJNI.getParticipantList(confID);
834 }
835 }
836 ;
837 PartList runInstance = new PartList();
838 getExecutor().execute(runInstance);
839 while (!runInstance.isDone()) {
840 // Log.w(TAG, "Waiting for getConferenceList");
841 }
842 StringVect swigvect = (StringVect) runInstance.getVal();
843
844 ArrayList<String> nativelist = new ArrayList<String>();
845
846 for (int i = 0; i < swigvect.size(); i++)
847 nativelist.add(swigvect.get(i));
848
849 return nativelist;
alision7f18fc82013-05-01 09:37:33 -0400850 }
alision806e18e2013-06-21 15:30:17 -0400851
alision1005ba12013-06-19 13:52:44 -0400852 @Override
alision7f18fc82013-05-01 09:37:33 -0400853 public String getConferenceId(String callID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400854 Log.e(TAG, "getConferenceList not implemented");
alision7f18fc82013-05-01 09:37:33 -0400855 return null;
856 }
857
858 @Override
alision806e18e2013-06-21 15:30:17 -0400859 public String getConferenceDetails(final String callID) throws RemoteException {
860 class ConfDetails extends SipRunnableWithReturn {
861 @Override
862 protected StringMap doRun() throws SameThreadException {
863 Log.i(TAG, "SipService.getAccountList() thread running...");
864 return callManagerJNI.getConferenceDetails(callID);
865 }
866 }
867 ;
868 ConfDetails runInstance = new ConfDetails();
869 getExecutor().execute(runInstance);
870 while (!runInstance.isDone()) {
871 // Log.w(TAG, "Waiting for getConferenceList");
872 }
873 StringMap swigvect = (StringMap) runInstance.getVal();
874
875 return swigvect.get("CONF_STATE");
alision7f18fc82013-05-01 09:37:33 -0400876 }
877
alision04a00182013-05-10 17:05:29 -0400878 @Override
879 public String getRecordPath() throws RemoteException {
880 class RecordPath extends SipRunnableWithReturn {
881
882 @Override
883 protected String doRun() throws SameThreadException {
884 Log.i(TAG, "SipService.getRecordPath() thread running...");
Alexandre Lisiona764c682013-09-09 10:02:07 -0400885 return configurationManagerJNI.getRecordPath();
alision04a00182013-05-10 17:05:29 -0400886 }
887 }
888
889 RecordPath runInstance = new RecordPath();
890 getExecutor().execute(runInstance);
891 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400892 // Log.w(TAG, "Waiting for getRecordPath");
alision04a00182013-05-10 17:05:29 -0400893 }
894 String path = (String) runInstance.getVal();
895
896 return path;
897 }
898
899 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400900 public boolean toggleRecordingCall(final String id) throws RemoteException {
901
902 class ToggleRecording extends SipRunnableWithReturn {
903
alision04a00182013-05-10 17:05:29 -0400904 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400905 protected Boolean doRun() throws SameThreadException {
906 Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
907 return callManagerJNI.toggleRecording(id);
alision04a00182013-05-10 17:05:29 -0400908 }
Alexandre Lisiona764c682013-09-09 10:02:07 -0400909 }
910
911 ToggleRecording runInstance = new ToggleRecording();
912 getExecutor().execute(runInstance);
913 while (!runInstance.isDone()) {
914 }
915
916 return (Boolean) runInstance.getVal();
alision04a00182013-05-10 17:05:29 -0400917
918 }
Alexandre Lision67817192013-07-18 12:04:30 -0400919
alision50fa0722013-06-25 17:29:44 -0400920 @Override
alisiondf1dac92013-06-27 17:35:53 -0400921 public boolean isRecording(final String id) throws RemoteException {
922 class IsRecording extends SipRunnableWithReturn {
923
924 @Override
925 protected Boolean doRun() throws SameThreadException {
926 Log.i(TAG, "SipService.isRecording() thread running...");
927 return callManagerJNI.getIsRecording(id);
928 }
929 }
930
931 IsRecording runInstance = new IsRecording();
932 getExecutor().execute(runInstance);
933 while (!runInstance.isDone()) {
934 }
935
936 return (Boolean) runInstance.getVal();
Alexandre Lision67817192013-07-18 12:04:30 -0400937
alisiondf1dac92013-06-27 17:35:53 -0400938 }
Alexandre Lision67817192013-07-18 12:04:30 -0400939
alisiondf1dac92013-06-27 17:35:53 -0400940 @Override
alision50fa0722013-06-25 17:29:44 -0400941 public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
942 getExecutor().execute(new SipRunnable() {
943 @Override
944 protected void doRun() throws SameThreadException, RemoteException {
945 Log.i(TAG, "SipService.setRecordingCall() thread running...");
946 callManagerJNI.startRecordedFilePlayback(filepath);
947 }
948 });
949 return false;
950 }
951
952 @Override
953 public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
954 getExecutor().execute(new SipRunnable() {
955 @Override
956 protected void doRun() throws SameThreadException, RemoteException {
957 Log.i(TAG, "SipService.stopRecordedFilePlayback() thread running...");
958 callManagerJNI.stopRecordedFilePlayback(filepath);
959 }
960 });
961 }
alision04a00182013-05-10 17:05:29 -0400962
963 @Override
964 public void setRecordPath(final String path) throws RemoteException {
965 getExecutor().execute(new SipRunnable() {
966 @Override
967 protected void doRun() throws SameThreadException, RemoteException {
Alexandre Lisiona764c682013-09-09 10:02:07 -0400968 Log.i(TAG, "SipService.setRecordPath() "+path+" thread running...");
969 configurationManagerJNI.setRecordPath(path);
alision04a00182013-05-10 17:05:29 -0400970 }
971 });
972 }
973
974 @Override
975 public void sendTextMessage(final String callID, final String message, final String from) throws RemoteException {
976 getExecutor().execute(new SipRunnable() {
977 @Override
978 protected void doRun() throws SameThreadException, RemoteException {
979 Log.i(TAG, "SipService.sendTextMessage() thread running...");
Alexandre Lision10314352013-07-17 15:06:56 -0400980 callManagerJNI.sendTextMessage(callID, message);
alision04a00182013-05-10 17:05:29 -0400981 }
982 });
983
984 }
985
alisiond295ec22013-05-17 10:12:13 -0400986 @Override
987 public List getAudioCodecList(String accountID) throws RemoteException {
alision806e18e2013-06-21 15:30:17 -0400988 // class AudioCodecList extends SipRunnableWithReturn {
989 //
990 // @Override
991 // protected IntVect doRun() throws SameThreadException {
992 // Log.i(TAG, "SipService.getAudioCodecList() thread running...");
993 // return configurationManagerJNI.getAudioCodecList();
994 // }
995 // }
996 //
997 // AudioCodecList runInstance = new AudioCodecList();
998 // getExecutor().execute(runInstance);
999 // while (!runInstance.isDone()) {
1000 // Log.w(TAG, "Waiting for getAudioCodecList");
1001 // }
1002 // IntVect swigmap = (IntVect) runInstance.getVal();
1003 //
1004 // ArrayList<Integer> codecs = AudioHandler.convertSwigToNative(swigmap);
1005 //
1006 // return codecs;
alision907bde72013-06-20 14:40:37 -04001007 return null;
alisiond295ec22013-05-17 10:12:13 -04001008 }
1009
alision9f7a6ec2013-05-24 16:26:26 -04001010 @Override
alisionfde875f2013-05-28 17:01:54 -04001011 public HashMap<String, SipCall> getCallList() throws RemoteException {
alision85704182013-05-29 15:23:03 -04001012 // class CallList extends SipRunnableWithReturn {
1013 //
1014 // @Override
1015 // protected StringVect doRun() throws SameThreadException {
1016 // Log.i(TAG, "SipService.getCallList() thread running...");
1017 // return callManagerJNI.getCallList();
1018 // }
1019 // }
1020 //
1021 // CallList runInstance = new CallList();
1022 // getExecutor().execute(runInstance);
1023 // while (!runInstance.isDone()) {
1024 // Log.w(TAG, "Waiting for getAudioCodecList");
1025 // }
1026 // StringVect swigmap = (StringVect) runInstance.getVal();
1027 //
1028 // ArrayList<String> nativemap = new ArrayList<String>();
1029 // for (int i = 0; i < swigmap.size(); ++i) {
1030 //
1031 // String t = swigmap.get(i);
1032 // nativemap.add(t);
1033 // }
alision9f7a6ec2013-05-24 16:26:26 -04001034
alision2cb99562013-05-30 17:02:20 -04001035 return getCurrent_calls();
alision9f7a6ec2013-05-24 16:26:26 -04001036 }
1037
alision85704182013-05-29 15:23:03 -04001038 @Override
1039 public SipCall getCall(String callID) throws RemoteException {
alision2cb99562013-05-30 17:02:20 -04001040 return getCurrent_calls().get(callID);
1041 }
1042
1043 /***********************
1044 * Notification API
1045 ***********************/
1046 @Override
1047 public void createNotification() throws RemoteException {
1048 makeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001049
alision2cb99562013-05-30 17:02:20 -04001050 }
1051
1052 @Override
1053 public void destroyNotification() throws RemoteException {
1054 removeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001055
alision2cb99562013-05-30 17:02:20 -04001056 }
alisioncc7bb422013-06-06 15:31:39 -04001057
alision2cb99562013-05-30 17:02:20 -04001058 private int NOTIFICATION_ID = new Random().nextInt(1000);
alisioncc7bb422013-06-06 15:31:39 -04001059
alision2cb99562013-05-30 17:02:20 -04001060 private void makeNotification() {
alisioncc7bb422013-06-06 15:31:39 -04001061 if (current_calls.size() == 0) {
alision2cb99562013-05-30 17:02:20 -04001062 return;
1063 }
1064 Intent notificationIntent = new Intent(getApplicationContext(), SFLPhoneHomeActivity.class);
alisioncc7bb422013-06-06 15:31:39 -04001065 PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 007, notificationIntent,
1066 PendingIntent.FLAG_UPDATE_CURRENT);
alision2cb99562013-05-30 17:02:20 -04001067
1068 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
1069
1070 NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext());
alisioncc7bb422013-06-06 15:31:39 -04001071 //
1072 // builder.setContent(view);
1073 builder.setContentIntent(contentIntent).setOngoing(true).setSmallIcon(R.drawable.ic_launcher)
1074 .setContentTitle(getCurrent_calls().size() + " ongoing calls").setTicker("Pending calls").setWhen(System.currentTimeMillis())
1075 .setAutoCancel(false);
alision2cb99562013-05-30 17:02:20 -04001076 builder.setPriority(NotificationCompat.PRIORITY_MAX);
1077 Notification n = builder.build();
1078
1079 nm.notify(NOTIFICATION_ID, n);
alisioncc7bb422013-06-06 15:31:39 -04001080
alision2cb99562013-05-30 17:02:20 -04001081 }
1082
1083 public void removeNotification() {
1084 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
1085 nm.cancel(NOTIFICATION_ID);
alision85704182013-05-29 15:23:03 -04001086 }
1087
alisiondf1dac92013-06-27 17:35:53 -04001088 @Override
1089 public Conference getCurrentCall() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -04001090 for (SipCall i : current_calls.values()) {
1091 if (i.isOngoing()) {
alisiondf1dac92013-06-27 17:35:53 -04001092 Conference tmp = new Conference("-1");
1093 tmp.getParticipants().add(i);
1094 return tmp;
1095 }
1096 }
Alexandre Lision67817192013-07-18 12:04:30 -04001097
1098 if (!current_confs.isEmpty()) {
alisiondf1dac92013-06-27 17:35:53 -04001099 return (Conference) current_confs.values().toArray()[0];
1100 }
1101 return null;
1102 }
1103
Emeric Vigier6119d782012-09-21 18:04:14 -04001104 };
Emeric Vigiereaf2c492012-09-19 14:38:20 -04001105}