blob: 0ff4350ed6511ef5e5c42d59ef298639619b1814 [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 */
Alexandre Lision064e1e02013-10-01 16:18:42 -040025package org.sflphone.service;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040026
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
Alexandre Lision3ccccf02013-10-07 14:10:46 -040036import org.sflphone.R;
Alexandre Lision3cefec22013-11-14 17:26:35 -050037import org.sflphone.account.AccountCredentials;
Alexandre Lision064e1e02013-10-01 16:18:42 -040038import org.sflphone.account.AccountDetailsHandler;
39import org.sflphone.account.CallDetailsHandler;
40import org.sflphone.account.HistoryHandler;
Alexandre Lision4ab53972013-11-04 16:59:18 -050041import org.sflphone.client.HomeActivity;
Alexandre Lision933ef0a2013-10-15 17:28:40 -040042import org.sflphone.model.Codec;
Alexandre Lision064e1e02013-10-01 16:18:42 -040043import org.sflphone.model.Conference;
44import org.sflphone.model.SipCall;
Alexandre Lisiond5686032013-10-29 11:09:21 -040045import org.sflphone.model.SipMessage;
Alexandre Lision064e1e02013-10-01 16:18:42 -040046import org.sflphone.receivers.IncomingReceiver;
Alexandre Lision6d867b92013-10-25 15:36:28 -040047import org.sflphone.utils.MediaManager;
Alexandre Lisione0045442013-10-25 09:16:19 -040048import org.sflphone.utils.SipNotifications;
Alexandre Lision064e1e02013-10-01 16:18:42 -040049
alision2cb99562013-05-30 17:02:20 -040050import android.app.Notification;
51import android.app.NotificationManager;
52import android.app.PendingIntent;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040053import android.app.Service;
alision17052d42013-04-22 10:39:38 -040054import android.content.Context;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040055import android.content.Intent;
alision17052d42013-04-22 10:39:38 -040056import android.content.IntentFilter;
alision7f18fc82013-05-01 09:37:33 -040057import android.os.Bundle;
Emeric Vigier6119d782012-09-21 18:04:14 -040058import android.os.Handler;
59import android.os.HandlerThread;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040060import android.os.IBinder;
Emeric Vigier6119d782012-09-21 18:04:14 -040061import android.os.Looper;
62import android.os.Message;
alision5f899632013-04-22 17:26:56 -040063import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040064import android.support.v4.app.NotificationCompat;
alision17052d42013-04-22 10:39:38 -040065import android.support.v4.content.LocalBroadcastManager;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040066import android.util.Log;
Emeric Vigiereaf2c492012-09-19 14:38:20 -040067
Emeric Vigiereaf2c492012-09-19 14:38:20 -040068public class SipService extends Service {
69
70 static final String TAG = "SipService";
71 static final int DELAY = 5000; /* 5 sec */
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
Alexandre Lisione0045442013-10-25 09:16:19 -040081 public SipNotifications notificationManager;
Alexandre Lision6d867b92013-10-25 15:36:28 -040082 public MediaManager mediaManager;
Alexandre Lisione0045442013-10-25 09:16:19 -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)");
Alexandre Lision0f550ee2013-10-25 15:34:38 -040096 return true;
97 }
Alexandre Lisiondd68f652013-10-28 11:00:12 -040098
Alexandre Lision0f550ee2013-10-25 15:34:38 -040099 @Override
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400100 public void onRebind(Intent i) {
Alexandre Lision0f550ee2013-10-25 15:34:38 -0400101 super.onRebind(i);
alision43a9b362013-05-01 16:30:15 -0400102 }
103
104 /* called once by startService() */
105 @Override
106 public void onCreate() {
107 Log.i(TAG, "onCreated");
108 super.onCreate();
109
alision43a9b362013-05-01 16:30:15 -0400110 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());
Alexandre Lisione0045442013-10-25 09:16:19 -0400124
125 notificationManager = new SipNotifications(this);
Alexandre Lision6d867b92013-10-25 15:36:28 -0400126 mediaManager = new MediaManager(this);
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400127
Alexandre Lisione0045442013-10-25 09:16:19 -0400128 notificationManager.onServiceCreate();
Alexandre Lision6d867b92013-10-25 15:36:28 -0400129 mediaManager.startService();
Alexandre Lision3e2a1d02013-11-19 17:23:00 -0500130
131
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400132
alisioncc7bb422013-06-06 15:31:39 -0400133 }
alision43a9b362013-05-01 16:30:15 -0400134
135 /* called for each startService() */
136 @Override
137 public int onStartCommand(Intent intent, int flags, int startId) {
138 Log.i(TAG, "onStarted");
139 super.onStartCommand(intent, flags, startId);
140
alision806e18e2013-06-21 15:30:17 -0400141 receiver = new IncomingReceiver(this, mBinder);
Alexandre Lisione0045442013-10-25 09:16:19 -0400142
Alexandre Lision0f550ee2013-10-25 15:34:38 -0400143 return START_STICKY; /* started and stopped explicitly */
alision43a9b362013-05-01 16:30:15 -0400144 }
145
146 @Override
147 public void onDestroy() {
Alexandre Lision52214992013-10-28 17:41:23 -0400148 Log.i(TAG, "onDestroy");
alision43a9b362013-05-01 16:30:15 -0400149 /* called once by stopService() */
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400150
Alexandre Lision0a300ff2013-09-23 14:22:34 -0400151 LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
Alexandre Lisione0045442013-10-25 09:16:19 -0400152 notificationManager.onServiceDestroy();
Alexandre Lisionafbe8f62013-10-25 15:52:44 -0400153
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400154 getExecutor().execute(new FinalizeRunnable());
alision43a9b362013-05-01 16:30:15 -0400155 super.onDestroy();
156
alision43a9b362013-05-01 16:30:15 -0400157 }
158
159 @Override
160 public IBinder onBind(Intent arg0) {
161 Log.i(TAG, "onBound");
162 return mBinder;
163 }
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400164
alision43a9b362013-05-01 16:30:15 -0400165 private static Looper createLooper() {
166 if (executorThread == null) {
167 Log.d(TAG, "Creating new handler thread");
168 // ADT gives a fake warning due to bad parse rule.
169 executorThread = new HandlerThread("SipService.Executor");
170 executorThread.start();
171 }
172 return executorThread.getLooper();
173 }
174
175 public SipServiceExecutor getExecutor() {
176 // create mExecutor lazily
177 if (mExecutor == null) {
178 mExecutor = new SipServiceExecutor(this);
179 }
180 return mExecutor;
181 }
182
183 // Executes immediate tasks in a single executorThread.
184 public static class SipServiceExecutor extends Handler {
185 WeakReference<SipService> handlerService;
186
187 SipServiceExecutor(SipService s) {
188 super(createLooper());
189 handlerService = new WeakReference<SipService>(s);
190 }
191
192 public void execute(Runnable task) {
193 // TODO: add wakelock
194 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) {
200 if (msg.obj instanceof Runnable) {
201 executeInternal((Runnable) msg.obj);
202 } else {
203 Log.w(TAG, "can't handle msg: " + msg);
204 }
205 }
206
207 private void executeInternal(Runnable task) {
208 try {
209 task.run();
210 } catch (Throwable t) {
211 Log.e(TAG, "run task: " + task, t);
212 }
213 }
214 }
Alexandre Lision63870a72013-10-28 16:33:47 -0400215
216 private void stopDaemon() {
217 if (managerImpl != null) {
218 managerImpl.finish();
219 isPjSipStackStarted = false;
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400220 }
221 }
alision43a9b362013-05-01 16:30:15 -0400222
223 private void startPjSipStack() throws SameThreadException {
224 if (isPjSipStackStarted)
225 return;
226
227 try {
228 System.loadLibrary("gnustl_shared");
229 System.loadLibrary("expat");
230 System.loadLibrary("yaml");
231 System.loadLibrary("ccgnu2");
232 System.loadLibrary("crypto");
233 System.loadLibrary("ssl");
Alexandre Lision7c6f4a62013-09-05 13:27:01 -0400234 System.loadLibrary("sndfile");
alision43a9b362013-05-01 16:30:15 -0400235 System.loadLibrary("ccrtp1");
Alexandre Lision3cefec22013-11-14 17:26:35 -0500236 System.loadLibrary("pcre");
alision43a9b362013-05-01 16:30:15 -0400237 System.loadLibrary("samplerate");
alision43a9b362013-05-01 16:30:15 -0400238 System.loadLibrary("speexresampler");
239 System.loadLibrary("sflphone");
240 isPjSipStackStarted = true;
Adrien Béraud9360f242013-09-19 11:07:42 +1000241
alision43a9b362013-05-01 16:30:15 -0400242 } catch (UnsatisfiedLinkError e) {
243 Log.e(TAG, "Problem with the current Pj stack...", e);
244 isPjSipStackStarted = false;
245 return;
246 } catch (Exception e) {
247 Log.e(TAG, "Problem with the current Pj stack...", e);
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400248 isPjSipStackStarted = false;
alision43a9b362013-05-01 16:30:15 -0400249 }
250
Alexandre Lision67817192013-07-18 12:04:30 -0400251 Log.i(TAG, "PjSIPStack started");
252 managerImpl = SFLPhoneservice.instance();
253
254 /* set static AppPath before calling manager.init */
Alexandre Lision63870a72013-10-28 16:33:47 -0400255 // managerImpl.setPath(getApplication().getFilesDir().getAbsolutePath());
alision43a9b362013-05-01 16:30:15 -0400256
alision3ea8f3c2013-07-16 17:35:35 -0400257 callManagerJNI = new CallManager();
alision43a9b362013-05-01 16:30:15 -0400258 callManagerCallBack = new CallManagerCallBack(this);
259 SFLPhoneservice.setCallbackObject(callManagerCallBack);
260
alision3ea8f3c2013-07-16 17:35:35 -0400261 configurationManagerJNI = new ConfigurationManager();
alision43a9b362013-05-01 16:30:15 -0400262 configurationManagerCallback = new ConfigurationManagerCallback(this);
263 SFLPhoneservice.setConfigurationCallbackObject(configurationManagerCallback);
Alexandre Lision67817192013-07-18 12:04:30 -0400264 managerImpl.init("");
Adrien Béraud9360f242013-09-19 11:07:42 +1000265
Alexandre Lision67817192013-07-18 12:04:30 -0400266 Log.i(TAG, "->startPjSipStack");
alision43a9b362013-05-01 16:30:15 -0400267 }
268
Adrien Béraud9360f242013-09-19 11:07:42 +1000269 public HashMap<String, SipCall> getCurrent_calls() {
alision2cb99562013-05-30 17:02:20 -0400270 return current_calls;
271 }
272
alision43a9b362013-05-01 16:30:15 -0400273 // Enforce same thread contract to ensure we do not call from somewhere else
274 public class SameThreadException extends Exception {
275 private static final long serialVersionUID = -905639124232613768L;
276
277 public SameThreadException() {
278 super("Should be launched from a single worker thread");
279 }
280 }
281
282 public abstract static class SipRunnable implements Runnable {
283 protected abstract void doRun() throws SameThreadException, RemoteException;
284
Adrien Béraud9360f242013-09-19 11:07:42 +1000285 @Override
alision43a9b362013-05-01 16:30:15 -0400286 public void run() {
287 try {
288 doRun();
289 } catch (SameThreadException e) {
290 Log.e(TAG, "Not done from same thread");
291 } catch (RemoteException e) {
292 Log.e(TAG, e.toString());
293 }
294 }
295 }
296
Alexandre Lisionfab23f82013-11-01 11:22:30 -0400297 public abstract class SipRunnableWithReturn implements Runnable {
alision43a9b362013-05-01 16:30:15 -0400298 Object obj = null;
299 boolean done = false;
300
301 protected abstract Object doRun() throws SameThreadException;
302
303 public Object getVal() {
304 return obj;
305 }
306
307 public boolean isDone() {
308 return done;
309 }
310
Adrien Béraud9360f242013-09-19 11:07:42 +1000311 @Override
alision43a9b362013-05-01 16:30:15 -0400312 public void run() {
313 try {
Alexandre Lisionfab23f82013-11-01 11:22:30 -0400314 if(isPjSipStackStarted)
315 obj = doRun();
alision43a9b362013-05-01 16:30:15 -0400316 done = true;
317 } catch (SameThreadException e) {
318 Log.e(TAG, "Not done from same thread");
319 }
320 }
321 }
322
323 class StartRunnable extends SipRunnable {
324 @Override
325 protected void doRun() throws SameThreadException {
326 startPjSipStack();
327 }
328 }
Alexandre Lision63870a72013-10-28 16:33:47 -0400329
Alexandre Lisiondd68f652013-10-28 11:00:12 -0400330 class FinalizeRunnable extends SipRunnable {
331 @Override
332 protected void doRun() throws SameThreadException {
333 stopDaemon();
334 }
335 }
alision43a9b362013-05-01 16:30:15 -0400336
alision43a9b362013-05-01 16:30:15 -0400337 /* ************************************
338 *
339 * Implement public interface for the service
340 *
Alexandre Lision67817192013-07-18 12:04:30 -0400341 * *********************************
342 */
343
Emeric Vigier6119d782012-09-21 18:04:14 -0400344 private final ISipService.Stub mBinder = new ISipService.Stub() {
345
346 @Override
alisionfde875f2013-05-28 17:01:54 -0400347 public void placeCall(final SipCall call) {
Emeric Vigier6119d782012-09-21 18:04:14 -0400348 getExecutor().execute(new SipRunnable() {
349 @Override
350 protected void doRun() throws SameThreadException {
351 Log.i(TAG, "SipService.placeCall() thread running...");
Alexandre Lision3ee516e2013-10-07 17:32:15 -0400352 callManagerJNI.placeCall(call.getAccount().getAccountID(), call.getCallId(), call.getContact().getPhones().get(0).getNumber());
Adrien Béraud9360f242013-09-19 11:07:42 +1000353
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400354 HashMap<String, String> details = CallDetailsHandler.convertSwigToNative(callManagerJNI.getCallDetails(call.getCallId()));
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400355 // watchout timestamp stored by sflphone is in seconds
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400356 call.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -0400357 getCurrent_calls().put(call.getCallId(), call);
Alexandre Lision6e9c7e52013-10-29 15:54:11 -0400358 mediaManager.obtainAudioFocus();
Emeric Vigier6119d782012-09-21 18:04:14 -0400359 }
360 });
361 }
362
363 @Override
364 public void refuse(final String callID) {
365 getExecutor().execute(new SipRunnable() {
366 @Override
367 protected void doRun() throws SameThreadException {
368 Log.i(TAG, "SipService.refuse() thread running...");
369 callManagerJNI.refuse(callID);
370 }
371 });
372 }
373
374 @Override
375 public void accept(final String callID) {
376 getExecutor().execute(new SipRunnable() {
377 @Override
378 protected void doRun() throws SameThreadException {
Tristan Matthews40cf25e2013-07-24 13:45:15 -0400379 Log.i(TAG, "SipService.accept() thread running...");
Emeric Vigier6119d782012-09-21 18:04:14 -0400380 callManagerJNI.accept(callID);
381 }
382 });
383 }
384
385 @Override
386 public void hangUp(final String callID) {
387 getExecutor().execute(new SipRunnable() {
388 @Override
389 protected void doRun() throws SameThreadException {
390 Log.i(TAG, "SipService.hangUp() thread running...");
391 callManagerJNI.hangUp(callID);
392 }
393 });
394 }
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400395
396 @Override
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400397 public void hold(final String callID) {
398 getExecutor().execute(new SipRunnable() {
399 @Override
400 protected void doRun() throws SameThreadException {
401 Log.i(TAG, "SipService.hold() thread running...");
402 callManagerJNI.hold(callID);
403 }
404 });
405 }
406
407 @Override
408 public void unhold(final String callID) {
409 getExecutor().execute(new SipRunnable() {
410 @Override
411 protected void doRun() throws SameThreadException {
412 Log.i(TAG, "SipService.unhold() thread running...");
413 callManagerJNI.unhold(callID);
414 }
415 });
416 }
Adrien Béraud9360f242013-09-19 11:07:42 +1000417
Alexandre Lision6711ab22013-09-16 15:15:38 -0400418 @Override
419 public HashMap<String, String> getCallDetails(String callID) throws RemoteException {
420 class CallDetails extends SipRunnableWithReturn {
421 private String id;
422
423 CallDetails(String callID) {
424 id = callID;
425 }
426
427 @Override
428 protected StringMap doRun() throws SameThreadException {
Alexandre Lision3c6b7102013-09-16 16:56:46 -0400429 Log.i(TAG, "SipService.getCallDetails() thread running...");
Alexandre Lision6711ab22013-09-16 15:15:38 -0400430 return callManagerJNI.getCallDetails(id);
431 }
432 }
433
434 CallDetails runInstance = new CallDetails(callID);
435 getExecutor().execute(runInstance);
436
437 while (!runInstance.isDone()) {
438 }
439 StringMap swigmap = (StringMap) runInstance.getVal();
440
441 HashMap<String, String> nativemap = CallDetailsHandler.convertSwigToNative(swigmap);
442
443 return nativemap;
Adrien Béraud9360f242013-09-19 11:07:42 +1000444
Alexandre Lision6711ab22013-09-16 15:15:38 -0400445 }
Alexandre Savarde9dc8992012-10-26 12:12:27 -0400446
447 @Override
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400448 public void setAudioPlugin(final String audioPlugin) {
449 getExecutor().execute(new SipRunnable() {
alision371b77e2013-04-23 14:51:26 -0400450 @Override
451 protected void doRun() throws SameThreadException {
452 Log.i(TAG, "SipService.setAudioPlugin() thread running...");
453 configurationManagerJNI.setAudioPlugin(audioPlugin);
454 }
Alexandre Savard31d27c62012-10-04 16:05:08 -0400455 });
456 }
457
458 @Override
459 public String getCurrentAudioOutputPlugin() {
460 class CurrentAudioPlugin extends SipRunnableWithReturn {
461 @Override
462 protected String doRun() throws SameThreadException {
463 Log.i(TAG, "SipService.getCurrentAudioOutputPlugin() thread running...");
464 return configurationManagerJNI.getCurrentAudioOutputPlugin();
465 }
alision371b77e2013-04-23 14:51:26 -0400466 }
467 ;
Alexandre Savard31d27c62012-10-04 16:05:08 -0400468
469 CurrentAudioPlugin runInstance = new CurrentAudioPlugin();
470 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400471 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400472 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400473 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400474 return (String) runInstance.getVal();
Alexandre Savardc1b08fe2012-09-25 16:24:47 -0400475 }
Alexandre Savard713a34d2012-09-26 15:50:41 -0400476
477 @Override
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400478 public ArrayList<String> getAccountList() {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400479 class AccountList extends SipRunnableWithReturn {
480 @Override
481 protected StringVect doRun() throws SameThreadException {
482 Log.i(TAG, "SipService.getAccountList() thread running...");
483 return configurationManagerJNI.getAccountList();
484 }
alision371b77e2013-04-23 14:51:26 -0400485 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400486 AccountList runInstance = new AccountList();
Alexandre Lisioncdec5952013-07-17 14:18:22 -0400487 Log.i(TAG, "SipService.getAccountList() thread running...");
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400488 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400489 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400490 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400491 }
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400492 StringVect swigvect = (StringVect) runInstance.getVal();
493
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400494 ArrayList<String> nativelist = new ArrayList<String>();
Alexandre Savard52a72522012-09-27 16:40:13 -0400495
alision371b77e2013-04-23 14:51:26 -0400496 for (int i = 0; i < swigvect.size(); i++)
497 nativelist.add(swigvect.get(i));
Alexandre Savard52a72522012-09-27 16:40:13 -0400498
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400499 return nativelist;
alision371b77e2013-04-23 14:51:26 -0400500 }
Alexandre Lision4b4233a2013-10-16 17:24:17 -0400501
Alexandre Lision4cf78702013-10-16 13:43:23 -0400502 @Override
Alexandre Lision4b4233a2013-10-16 17:24:17 -0400503 public void setAccountOrder(final String order) {
Alexandre Lision4cf78702013-10-16 13:43:23 -0400504 getExecutor().execute(new SipRunnable() {
505 @Override
506 protected void doRun() throws SameThreadException {
507 Log.i(TAG, "SipService.setAccountsOrder() thread running...");
508 configurationManagerJNI.setAccountsOrder(order);
509 }
510 });
511 }
Alexandre Savard6b85e7e2012-09-27 15:43:14 -0400512
513 @Override
alision371b77e2013-04-23 14:51:26 -0400514 public HashMap<String, String> getAccountDetails(final String accountID) {
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400515 class AccountDetails extends SipRunnableWithReturn {
516 private String id;
alision371b77e2013-04-23 14:51:26 -0400517
518 AccountDetails(String accountId) {
519 id = accountId;
520 }
521
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400522 @Override
523 protected StringMap doRun() throws SameThreadException {
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400524 Log.i(TAG, "SipService.getAccountDetails() thread running...");
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400525 return configurationManagerJNI.getAccountDetails(id);
526 }
alision371b77e2013-04-23 14:51:26 -0400527 }
Alexandre Savard7a902bc2012-10-04 16:32:35 -0400528
529 AccountDetails runInstance = new AccountDetails(accountID);
530 getExecutor().execute(runInstance);
alisionfde875f2013-05-28 17:01:54 -0400531
alision371b77e2013-04-23 14:51:26 -0400532 while (!runInstance.isDone()) {
533 }
534 StringMap swigmap = (StringMap) runInstance.getVal();
Alexandre Savard713a34d2012-09-26 15:50:41 -0400535
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400536 HashMap<String, String> nativemap = AccountDetailsHandler.convertSwigToNative(swigmap);
Alexandre Savard713a34d2012-09-26 15:50:41 -0400537
538 return nativemap;
539 }
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400540
Alexandre Lisionb4a9e392013-10-01 14:39:43 -0400541 @SuppressWarnings("unchecked")
542 // Hashmap runtime cast
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400543 @Override
alisioncc7bb422013-06-06 15:31:39 -0400544 public void setAccountDetails(final String accountId, final Map map) {
alision371b77e2013-04-23 14:51:26 -0400545 HashMap<String, String> nativemap = (HashMap<String, String>) map;
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400546
Alexandre Savard3bbb4792012-10-05 11:30:01 -0400547 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig(nativemap);
Alexandre Savard718d49f2012-10-02 15:17:13 -0400548
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400549 getExecutor().execute(new SipRunnable() {
550 @Override
551 protected void doRun() throws SameThreadException {
alisioncc7bb422013-06-06 15:31:39 -0400552
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400553 configurationManagerJNI.setAccountDetails(accountId, swigmap);
alisioncc7bb422013-06-06 15:31:39 -0400554 Log.i(TAG, "SipService.setAccountDetails() thread running...");
555 }
556
Alexandre Savard7a2b2202012-10-04 17:07:33 -0400557 });
Alexandre Savard8b7d4332012-09-30 20:02:11 -0400558 }
559
Alexandre Lision451f2a82013-11-12 12:55:55 -0500560 @Override
561 public Map getAccountTemplate() throws RemoteException {
562 class AccountTemplate extends SipRunnableWithReturn {
563
564 @Override
565 protected StringMap doRun() throws SameThreadException {
566 Log.i(TAG, "SipService.getAccountTemplate() thread running...");
567 return configurationManagerJNI.getAccountTemplate();
568 }
569 }
570
571 AccountTemplate runInstance = new AccountTemplate();
572 getExecutor().execute(runInstance);
573
574 while (!runInstance.isDone()) {
575 }
576 StringMap swigmap = (StringMap) runInstance.getVal();
577
578 HashMap<String, String> nativemap = AccountDetailsHandler.convertSwigToNative(swigmap);
579
580 return nativemap;
581 }
alisioncc7bb422013-06-06 15:31:39 -0400582
Alexandre Lisionb4a9e392013-10-01 14:39:43 -0400583 @SuppressWarnings("unchecked")
584 // Hashmap runtime cast
Alexandre Savard46036572012-10-05 13:56:49 -0400585 @Override
586 public String addAccount(Map map) {
587 class AddAccount extends SipRunnableWithReturn {
588 StringMap map;
alision371b77e2013-04-23 14:51:26 -0400589
590 AddAccount(StringMap m) {
591 map = m;
592 }
593
Alexandre Savard46036572012-10-05 13:56:49 -0400594 @Override
595 protected String doRun() throws SameThreadException {
596 Log.i(TAG, "SipService.getAccountDetails() thread running...");
597 return configurationManagerJNI.addAccount(map);
598 }
alision371b77e2013-04-23 14:51:26 -0400599 }
Alexandre Savard46036572012-10-05 13:56:49 -0400600
alision371b77e2013-04-23 14:51:26 -0400601 final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig((HashMap<String, String>) map);
Alexandre Savard46036572012-10-05 13:56:49 -0400602
603 AddAccount runInstance = new AddAccount(swigmap);
604 getExecutor().execute(runInstance);
alision371b77e2013-04-23 14:51:26 -0400605 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400606 // Log.e(TAG, "Waiting for Nofing");
alision371b77e2013-04-23 14:51:26 -0400607 }
Alexandre Savard46036572012-10-05 13:56:49 -0400608 String accountId = (String) runInstance.getVal();
609
610 return accountId;
611 }
612
613 @Override
614 public void removeAccount(final String accountId) {
615 getExecutor().execute(new SipRunnable() {
616 @Override
617 protected void doRun() throws SameThreadException {
618 Log.i(TAG, "SipService.setAccountDetails() thread running...");
619 configurationManagerJNI.removeAccount(accountId);
620 }
621 });
622 }
alision5f899632013-04-22 17:26:56 -0400623
alisione2a38e12013-04-25 14:20:20 -0400624 @Override
625 public ArrayList<HashMap<String, String>> getHistory() throws RemoteException {
626 class History extends SipRunnableWithReturn {
627
628 @Override
629 protected VectMap doRun() throws SameThreadException {
630 Log.i(TAG, "SipService.getHistory() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400631
alisione2a38e12013-04-25 14:20:20 -0400632 return configurationManagerJNI.getHistory();
633 }
634 }
635
636 History runInstance = new History();
637 getExecutor().execute(runInstance);
638 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400639 // Log.w(TAG, "Waiting for getHistory");
alisione2a38e12013-04-25 14:20:20 -0400640 }
alision1005ba12013-06-19 13:52:44 -0400641 Log.i(TAG, "SipService.getHistory() DONE");
alisione2a38e12013-04-25 14:20:20 -0400642 VectMap swigmap = (VectMap) runInstance.getVal();
643
644 ArrayList<HashMap<String, String>> nativemap = HistoryHandler.convertSwigToNative(swigmap);
645
646 return nativemap;
647 }
alision7f18fc82013-05-01 09:37:33 -0400648
alision43a9b362013-05-01 16:30:15 -0400649 /*************************
650 * Transfer related API
651 *************************/
652
alision7f18fc82013-05-01 09:37:33 -0400653 @Override
654 public void transfer(final String callID, final String to) throws RemoteException {
655 getExecutor().execute(new SipRunnable() {
656 @Override
657 protected void doRun() throws SameThreadException, RemoteException {
658 Log.i(TAG, "SipService.transfer() thread running...");
659 if (callManagerJNI.transfer(callID, to)) {
660 Bundle bundle = new Bundle();
661 bundle.putString("CallID", callID);
662 bundle.putString("State", "HUNGUP");
663 Intent intent = new Intent(CallManagerCallBack.CALL_STATE_CHANGED);
alision7f18fc82013-05-01 09:37:33 -0400664 intent.putExtra("com.savoirfairelinux.sflphone.service.newstate", bundle);
alision84813a12013-05-27 17:40:39 -0400665 sendBroadcast(intent);
alision7f18fc82013-05-01 09:37:33 -0400666 } else
667 Log.i(TAG, "NOT OK");
668 }
669 });
670
671 }
alision43a9b362013-05-01 16:30:15 -0400672
alision7f18fc82013-05-01 09:37:33 -0400673 @Override
674 public void attendedTransfer(final String transferID, final String targetID) throws RemoteException {
675 getExecutor().execute(new SipRunnable() {
676 @Override
677 protected void doRun() throws SameThreadException, RemoteException {
alision43a9b362013-05-01 16:30:15 -0400678 Log.i(TAG, "SipService.attendedTransfer() thread running...");
alision7f18fc82013-05-01 09:37:33 -0400679 if (callManagerJNI.attendedTransfer(transferID, targetID)) {
680 Log.i(TAG, "OK");
alision7f18fc82013-05-01 09:37:33 -0400681 } else
682 Log.i(TAG, "NOT OK");
683 }
684 });
alision43a9b362013-05-01 16:30:15 -0400685
686 }
687
688 /*************************
689 * Conference related API
690 *************************/
691
692 @Override
693 public void removeConference(final String confID) throws RemoteException {
694 getExecutor().execute(new SipRunnable() {
695 @Override
696 protected void doRun() throws SameThreadException, RemoteException {
697 Log.i(TAG, "SipService.createConference() thread running...");
698 callManagerJNI.removeConference(confID);
699 }
700 });
701
alision7f18fc82013-05-01 09:37:33 -0400702 }
703
704 @Override
alision43a9b362013-05-01 16:30:15 -0400705 public void joinParticipant(final String sel_callID, final String drag_callID) throws RemoteException {
706 getExecutor().execute(new SipRunnable() {
707 @Override
708 protected void doRun() throws SameThreadException, RemoteException {
709 Log.i(TAG, "SipService.joinParticipant() thread running...");
710 callManagerJNI.joinParticipant(sel_callID, drag_callID);
alision806e18e2013-06-21 15:30:17 -0400711 // Generate a CONF_CREATED callback
alision43a9b362013-05-01 16:30:15 -0400712 }
713 });
714
alision7f18fc82013-05-01 09:37:33 -0400715 }
716
alision7f18fc82013-05-01 09:37:33 -0400717 @Override
alision806e18e2013-06-21 15:30:17 -0400718 public void addParticipant(final SipCall call, final String confID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400719 getExecutor().execute(new SipRunnable() {
720 @Override
721 protected void doRun() throws SameThreadException, RemoteException {
722 Log.i(TAG, "SipService.addParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400723 callManagerJNI.addParticipant(call.getCallId(), confID);
724 current_confs.get(confID).getParticipants().add(call);
alision43a9b362013-05-01 16:30:15 -0400725 }
726 });
727
alision7f18fc82013-05-01 09:37:33 -0400728 }
729
730 @Override
alision43a9b362013-05-01 16:30:15 -0400731 public void addMainParticipant(final String confID) throws RemoteException {
732 getExecutor().execute(new SipRunnable() {
733 @Override
734 protected void doRun() throws SameThreadException, RemoteException {
735 Log.i(TAG, "SipService.addMainParticipant() thread running...");
736 callManagerJNI.addMainParticipant(confID);
737 }
738 });
739
alision7f18fc82013-05-01 09:37:33 -0400740 }
741
742 @Override
alision43a9b362013-05-01 16:30:15 -0400743 public void detachParticipant(final String callID) throws RemoteException {
744 getExecutor().execute(new SipRunnable() {
745 @Override
746 protected void doRun() throws SameThreadException, RemoteException {
747 Log.i(TAG, "SipService.detachParticipant() thread running...");
alision806e18e2013-06-21 15:30:17 -0400748 Log.i(TAG, "Detaching " + callID);
749 Iterator<Entry<String, Conference>> it = current_confs.entrySet().iterator();
750 Log.i(TAG, "current_confs size " + current_confs.size());
751 while (it.hasNext()) {
752 Conference tmp = it.next().getValue();
753 Log.i(TAG, "conf has " + tmp.getParticipants().size() + " participants");
754 if (tmp.contains(callID)) {
755 current_calls.put(callID, tmp.getCall(callID));
756 Log.i(TAG, "Call found and put in current_calls");
757 }
758 }
alision43a9b362013-05-01 16:30:15 -0400759 callManagerJNI.detachParticipant(callID);
760 }
761 });
762
alision7f18fc82013-05-01 09:37:33 -0400763 }
764
765 @Override
alision43a9b362013-05-01 16:30:15 -0400766 public void joinConference(final String sel_confID, final String drag_confID) throws RemoteException {
767 getExecutor().execute(new SipRunnable() {
768 @Override
769 protected void doRun() throws SameThreadException, RemoteException {
770 Log.i(TAG, "SipService.joinConference() thread running...");
771 callManagerJNI.joinConference(sel_confID, drag_confID);
772 }
773 });
774
alision7f18fc82013-05-01 09:37:33 -0400775 }
776
777 @Override
alision43a9b362013-05-01 16:30:15 -0400778 public void hangUpConference(final String confID) throws RemoteException {
779 getExecutor().execute(new SipRunnable() {
780 @Override
781 protected void doRun() throws SameThreadException, RemoteException {
782 Log.i(TAG, "SipService.joinConference() thread running...");
783 callManagerJNI.hangUpConference(confID);
784 }
785 });
786
alision7f18fc82013-05-01 09:37:33 -0400787 }
788
789 @Override
alision43a9b362013-05-01 16:30:15 -0400790 public void holdConference(final String confID) throws RemoteException {
791 getExecutor().execute(new SipRunnable() {
792 @Override
793 protected void doRun() throws SameThreadException, RemoteException {
794 Log.i(TAG, "SipService.holdConference() thread running...");
795 callManagerJNI.holdConference(confID);
796 }
797 });
798
alision7f18fc82013-05-01 09:37:33 -0400799 }
800
801 @Override
alision43a9b362013-05-01 16:30:15 -0400802 public void unholdConference(final String confID) throws RemoteException {
803 getExecutor().execute(new SipRunnable() {
804 @Override
805 protected void doRun() throws SameThreadException, RemoteException {
806 Log.i(TAG, "SipService.unholdConference() thread running...");
807 callManagerJNI.unholdConference(confID);
808 }
809 });
810
alision7f18fc82013-05-01 09:37:33 -0400811 }
Alexandre Lision67817192013-07-18 12:04:30 -0400812
alisioncd8fb912013-06-28 14:43:51 -0400813 @Override
814 public boolean isConferenceParticipant(final String callID) throws RemoteException {
815 class IsParticipant extends SipRunnableWithReturn {
816
817 @Override
818 protected Boolean doRun() throws SameThreadException {
819 Log.i(TAG, "SipService.isRecording() thread running...");
820 return callManagerJNI.isConferenceParticipant(callID);
821 }
822 }
823
824 IsParticipant runInstance = new IsParticipant();
825 getExecutor().execute(runInstance);
826 while (!runInstance.isDone()) {
827 }
828
829 return (Boolean) runInstance.getVal();
830 }
alision7f18fc82013-05-01 09:37:33 -0400831
832 @Override
alisiondf1dac92013-06-27 17:35:53 -0400833 public HashMap<String, Conference> getConferenceList() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -0400834 // class ConfList extends SipRunnableWithReturn {
835 // @Override
836 // protected StringVect doRun() throws SameThreadException {
837 // Log.i(TAG, "SipService.getConferenceList() thread running...");
838 // return callManagerJNI.getConferenceList();
839 // }
840 // }
841 // ;
842 // ConfList runInstance = new ConfList();
843 // getExecutor().execute(runInstance);
844 // while (!runInstance.isDone()) {
845 // // Log.w(TAG, "Waiting for getConferenceList");
846 // }
847 // StringVect swigvect = (StringVect) runInstance.getVal();
848 //
849 // ArrayList<String> nativelist = new ArrayList<String>();
850 //
851 // for (int i = 0; i < swigvect.size(); i++)
852 // nativelist.add(swigvect.get(i));
853 //
854 // return nativelist;
alisiondf1dac92013-06-27 17:35:53 -0400855 return current_confs;
alision7f18fc82013-05-01 09:37:33 -0400856 }
857
858 @Override
alision907bde72013-06-20 14:40:37 -0400859 public List getParticipantList(final String confID) throws RemoteException {
860 class PartList extends SipRunnableWithReturn {
861 @Override
862 protected StringVect doRun() throws SameThreadException {
863 Log.i(TAG, "SipService.getAccountList() thread running...");
864 return callManagerJNI.getParticipantList(confID);
865 }
866 }
867 ;
868 PartList runInstance = new PartList();
869 getExecutor().execute(runInstance);
870 while (!runInstance.isDone()) {
871 // Log.w(TAG, "Waiting for getConferenceList");
872 }
873 StringVect swigvect = (StringVect) runInstance.getVal();
874
875 ArrayList<String> nativelist = new ArrayList<String>();
876
877 for (int i = 0; i < swigvect.size(); i++)
878 nativelist.add(swigvect.get(i));
879
880 return nativelist;
alision7f18fc82013-05-01 09:37:33 -0400881 }
alision806e18e2013-06-21 15:30:17 -0400882
alision1005ba12013-06-19 13:52:44 -0400883 @Override
alision7f18fc82013-05-01 09:37:33 -0400884 public String getConferenceId(String callID) throws RemoteException {
alision43a9b362013-05-01 16:30:15 -0400885 Log.e(TAG, "getConferenceList not implemented");
alision7f18fc82013-05-01 09:37:33 -0400886 return null;
887 }
888
889 @Override
alision806e18e2013-06-21 15:30:17 -0400890 public String getConferenceDetails(final String callID) throws RemoteException {
891 class ConfDetails extends SipRunnableWithReturn {
892 @Override
893 protected StringMap doRun() throws SameThreadException {
894 Log.i(TAG, "SipService.getAccountList() thread running...");
895 return callManagerJNI.getConferenceDetails(callID);
896 }
897 }
898 ;
899 ConfDetails runInstance = new ConfDetails();
900 getExecutor().execute(runInstance);
901 while (!runInstance.isDone()) {
902 // Log.w(TAG, "Waiting for getConferenceList");
903 }
904 StringMap swigvect = (StringMap) runInstance.getVal();
905
906 return swigvect.get("CONF_STATE");
alision7f18fc82013-05-01 09:37:33 -0400907 }
908
alision04a00182013-05-10 17:05:29 -0400909 @Override
910 public String getRecordPath() throws RemoteException {
911 class RecordPath extends SipRunnableWithReturn {
912
913 @Override
914 protected String doRun() throws SameThreadException {
915 Log.i(TAG, "SipService.getRecordPath() thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +1000916 return configurationManagerJNI.getRecordPath();
alision04a00182013-05-10 17:05:29 -0400917 }
918 }
919
920 RecordPath runInstance = new RecordPath();
921 getExecutor().execute(runInstance);
922 while (!runInstance.isDone()) {
alision84813a12013-05-27 17:40:39 -0400923 // Log.w(TAG, "Waiting for getRecordPath");
alision04a00182013-05-10 17:05:29 -0400924 }
925 String path = (String) runInstance.getVal();
926
927 return path;
928 }
929
930 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400931 public boolean toggleRecordingCall(final String id) throws RemoteException {
Adrien Béraud9360f242013-09-19 11:07:42 +1000932
Alexandre Lisiona764c682013-09-09 10:02:07 -0400933 class ToggleRecording extends SipRunnableWithReturn {
934
alision04a00182013-05-10 17:05:29 -0400935 @Override
Alexandre Lisiona764c682013-09-09 10:02:07 -0400936 protected Boolean doRun() throws SameThreadException {
937 Log.i(TAG, "SipService.toggleRecordingCall() thread running...");
Alexandre Lision3874e552013-11-04 17:20:12 -0500938 boolean result = callManagerJNI.toggleRecording(id);
939
940 if(getCurrent_calls().containsKey(id)){
941 getCurrent_calls().get(id).setRecording(result);
942 } else if(getCurrent_confs().containsKey(id)){
943 getCurrent_confs().get(id).setRecording(result);
944 } else {
945 // A call in a conference has been put on hold
946 Iterator<Conference> it = getCurrent_confs().values().iterator();
947 while (it.hasNext()) {
948 Conference c = it.next();
949 if (c.getCall(id) != null)
950 c.getCall(id).setRecording(result);
951 }
952 }
953 return result;
alision04a00182013-05-10 17:05:29 -0400954 }
Alexandre Lisiona764c682013-09-09 10:02:07 -0400955 }
956
957 ToggleRecording runInstance = new ToggleRecording();
958 getExecutor().execute(runInstance);
959 while (!runInstance.isDone()) {
960 }
961
962 return (Boolean) runInstance.getVal();
alision04a00182013-05-10 17:05:29 -0400963
964 }
Alexandre Lision67817192013-07-18 12:04:30 -0400965
alision50fa0722013-06-25 17:29:44 -0400966 @Override
967 public boolean startRecordedFilePlayback(final String filepath) throws RemoteException {
968 getExecutor().execute(new SipRunnable() {
969 @Override
970 protected void doRun() throws SameThreadException, RemoteException {
971 Log.i(TAG, "SipService.setRecordingCall() thread running...");
972 callManagerJNI.startRecordedFilePlayback(filepath);
973 }
974 });
975 return false;
976 }
977
978 @Override
979 public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
980 getExecutor().execute(new SipRunnable() {
981 @Override
982 protected void doRun() throws SameThreadException, RemoteException {
983 Log.i(TAG, "SipService.stopRecordedFilePlayback() thread running...");
984 callManagerJNI.stopRecordedFilePlayback(filepath);
985 }
986 });
987 }
alision04a00182013-05-10 17:05:29 -0400988
989 @Override
990 public void setRecordPath(final String path) throws RemoteException {
991 getExecutor().execute(new SipRunnable() {
992 @Override
993 protected void doRun() throws SameThreadException, RemoteException {
Alexandre Lisionb4a9e392013-10-01 14:39:43 -0400994 Log.i(TAG, "SipService.setRecordPath() " + path + " thread running...");
Adrien Béraud9360f242013-09-19 11:07:42 +1000995 configurationManagerJNI.setRecordPath(path);
alision04a00182013-05-10 17:05:29 -0400996 }
997 });
998 }
999
1000 @Override
Alexandre Lisiond5686032013-10-29 11:09:21 -04001001 public void sendTextMessage(final String callID, final SipMessage message) throws RemoteException {
alision04a00182013-05-10 17:05:29 -04001002 getExecutor().execute(new SipRunnable() {
1003 @Override
1004 protected void doRun() throws SameThreadException, RemoteException {
1005 Log.i(TAG, "SipService.sendTextMessage() thread running...");
Alexandre Lisiond5686032013-10-29 11:09:21 -04001006 callManagerJNI.sendTextMessage(callID, message.comment);
Alexandre Lisiond5545232013-10-29 11:24:02 -04001007 if(getCurrent_calls().get(callID) != null)
1008 getCurrent_calls().get(callID).addSipMessage(message);
1009 else if(getCurrent_confs().get(callID) != null)
1010 getCurrent_confs().get(callID).addSipMessage(message);
alision04a00182013-05-10 17:05:29 -04001011 }
1012 });
1013
1014 }
1015
alisiond295ec22013-05-17 10:12:13 -04001016 @Override
Alexandre Lision4cf78702013-10-16 13:43:23 -04001017 public List getAudioCodecList(final String accountID) throws RemoteException {
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001018 class AudioCodecList extends SipRunnableWithReturn {
1019
1020 @Override
Alexandre Lision933ef0a2013-10-15 17:28:40 -04001021 protected ArrayList<Codec> doRun() throws SameThreadException {
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001022 Log.i(TAG, "SipService.getAudioCodecList() thread running...");
Alexandre Lision4b4233a2013-10-16 17:24:17 -04001023 ArrayList<Codec> results = new ArrayList<Codec>();
Alexandre Lision4cf78702013-10-16 13:43:23 -04001024
Alexandre Lision4b4233a2013-10-16 17:24:17 -04001025 IntVect active_payloads = configurationManagerJNI.getActiveAudioCodecList(accountID);
1026 for (int i = 0; i < active_payloads.size(); ++i) {
1027
Alexandre Lision039a3cf2013-10-16 17:44:57 -04001028 results.add(new Codec(active_payloads.get(i), configurationManagerJNI.getAudioCodecDetails(active_payloads.get(i)), true));
Alexandre Lisione0045442013-10-25 09:16:19 -04001029
Alexandre Lision4cf78702013-10-16 13:43:23 -04001030 }
Alexandre Lision4b4233a2013-10-16 17:24:17 -04001031
Alexandre Lision039a3cf2013-10-16 17:44:57 -04001032 // if (results.get(active_payloads.get(i)) != null) {
1033 // results.get(active_payloads.get(i)).setEnabled(true);
Alexandre Lision451f2a82013-11-12 12:55:55 -05001034
Alexandre Lision039a3cf2013-10-16 17:44:57 -04001035 IntVect payloads = configurationManagerJNI.getAudioCodecList();
1036
1037 for (int i = 0; i < payloads.size(); ++i) {
1038 boolean isActive = false;
1039 for (Codec co : results) {
1040 if (co.getPayload().toString().contentEquals(String.valueOf(payloads.get(i))))
1041 isActive = true;
1042
1043 }
1044 if (isActive)
1045 continue;
1046 else
1047 results.add(new Codec(payloads.get(i), configurationManagerJNI.getAudioCodecDetails(payloads.get(i)), false));
1048
1049 }
1050
1051 // if (!results.containsKey(payloads.get(i))) {
1052 // results.put(payloads.get(i), new Codec(payloads.get(i), configurationManagerJNI.getAudioCodecDetails(payloads.get(i)), false));
1053 // Log.i(TAG, "Other, Adding:" + results.get((payloads.get(i))).getName());
1054 // }
1055
Alexandre Lision4b4233a2013-10-16 17:24:17 -04001056 return results;
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001057 }
1058 }
1059
1060 AudioCodecList runInstance = new AudioCodecList();
1061 getExecutor().execute(runInstance);
1062 while (!runInstance.isDone()) {
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001063 }
Alexandre Lision933ef0a2013-10-15 17:28:40 -04001064 ArrayList<Codec> codecs = (ArrayList<Codec>) runInstance.getVal();
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001065 return codecs;
alisiond295ec22013-05-17 10:12:13 -04001066 }
1067
alision9f7a6ec2013-05-24 16:26:26 -04001068 @Override
Alexandre Lision4cf78702013-10-16 13:43:23 -04001069 public Map getRingtoneList() throws RemoteException {
1070 class RingtoneList extends SipRunnableWithReturn {
1071
1072 @Override
1073 protected StringMap doRun() throws SameThreadException {
1074 Log.i(TAG, "SipService.getRingtoneList() thread running...");
1075 return configurationManagerJNI.getRingtoneList();
1076 }
1077 }
1078
1079 RingtoneList runInstance = new RingtoneList();
1080 getExecutor().execute(runInstance);
1081 while (!runInstance.isDone()) {
1082 }
Alexandre Lision4b4233a2013-10-16 17:24:17 -04001083 StringMap ringtones = (StringMap) runInstance.getVal();
1084
1085 for (int i = 0; i < ringtones.size(); ++i) {
1086 // Log.i(TAG,"ringtones "+i+" "+ ringtones.);
1087 }
1088
Alexandre Lision4cf78702013-10-16 13:43:23 -04001089 return null;
1090 }
1091
1092 @Override
1093 public void setActiveCodecList(final List codecs, final String accountID) throws RemoteException {
1094 getExecutor().execute(new SipRunnable() {
1095 @Override
1096 protected void doRun() throws SameThreadException, RemoteException {
1097 Log.i(TAG, "SipService.setActiveAudioCodecList() thread running...");
1098 StringVect list = new StringVect();
1099 for (int i = 0; i < codecs.size(); ++i) {
1100 list.add((String) codecs.get(i));
1101 }
1102 configurationManagerJNI.setActiveAudioCodecList(list, accountID);
1103 }
1104 });
1105 }
1106
1107 @Override
alisionfde875f2013-05-28 17:01:54 -04001108 public HashMap<String, SipCall> getCallList() throws RemoteException {
alision85704182013-05-29 15:23:03 -04001109 // class CallList extends SipRunnableWithReturn {
1110 //
1111 // @Override
1112 // protected StringVect doRun() throws SameThreadException {
1113 // Log.i(TAG, "SipService.getCallList() thread running...");
1114 // return callManagerJNI.getCallList();
1115 // }
1116 // }
1117 //
1118 // CallList runInstance = new CallList();
1119 // getExecutor().execute(runInstance);
1120 // while (!runInstance.isDone()) {
1121 // Log.w(TAG, "Waiting for getAudioCodecList");
1122 // }
1123 // StringVect swigmap = (StringVect) runInstance.getVal();
1124 //
1125 // ArrayList<String> nativemap = new ArrayList<String>();
1126 // for (int i = 0; i < swigmap.size(); ++i) {
1127 //
1128 // String t = swigmap.get(i);
1129 // nativemap.add(t);
1130 // }
Alexandre Lisionafd40e42013-10-15 13:48:37 -04001131 // if(callManagerJNI == null)
1132 // return new HashMap<String, SipCall>();
1133 //
1134 //
1135 // HashMap<String, SipCall> results = new HashMap<String, SipCall>();
1136 // StringVect calls = callManagerJNI.getCallList();
1137 // for(int i = 0 ; i < calls.size(); ++i){
1138 // results.put(calls.get(i), new SipCall(calls.get(i), callManagerJNI.getCallDetails(calls.get(i))));
1139 // }
alision9f7a6ec2013-05-24 16:26:26 -04001140
alision2cb99562013-05-30 17:02:20 -04001141 return getCurrent_calls();
alision9f7a6ec2013-05-24 16:26:26 -04001142 }
1143
alision85704182013-05-29 15:23:03 -04001144 @Override
1145 public SipCall getCall(String callID) throws RemoteException {
alision2cb99562013-05-30 17:02:20 -04001146 return getCurrent_calls().get(callID);
1147 }
1148
1149 /***********************
1150 * Notification API
1151 ***********************/
1152 @Override
1153 public void createNotification() throws RemoteException {
1154 makeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001155
alision2cb99562013-05-30 17:02:20 -04001156 }
1157
1158 @Override
1159 public void destroyNotification() throws RemoteException {
1160 removeNotification();
alisioncc7bb422013-06-06 15:31:39 -04001161
alision2cb99562013-05-30 17:02:20 -04001162 }
alisioncc7bb422013-06-06 15:31:39 -04001163
Adrien Béraud9360f242013-09-19 11:07:42 +10001164 private final int NOTIFICATION_ID = new Random().nextInt(1000);
alisioncc7bb422013-06-06 15:31:39 -04001165
alision2cb99562013-05-30 17:02:20 -04001166 private void makeNotification() {
alisioncc7bb422013-06-06 15:31:39 -04001167 if (current_calls.size() == 0) {
alision2cb99562013-05-30 17:02:20 -04001168 return;
1169 }
Alexandre Lision4ab53972013-11-04 16:59:18 -05001170 Intent notificationIntent = new Intent(getApplicationContext(), HomeActivity.class);
alisioncc7bb422013-06-06 15:31:39 -04001171 PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 007, notificationIntent,
1172 PendingIntent.FLAG_UPDATE_CURRENT);
alision2cb99562013-05-30 17:02:20 -04001173
1174 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
Adrien Béraud9360f242013-09-19 11:07:42 +10001175 nm.cancel(NOTIFICATION_ID); // clear previous notifications.
alision2cb99562013-05-30 17:02:20 -04001176
1177 NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext());
alisioncc7bb422013-06-06 15:31:39 -04001178 //
1179 // builder.setContent(view);
1180 builder.setContentIntent(contentIntent).setOngoing(true).setSmallIcon(R.drawable.ic_launcher)
Alexandre Lisionb4a9e392013-10-01 14:39:43 -04001181 .setContentTitle(getCurrent_calls().size() + " ongoing calls").setTicker("Pending calls").setWhen(System.currentTimeMillis())
1182 .setAutoCancel(false);
alision2cb99562013-05-30 17:02:20 -04001183 builder.setPriority(NotificationCompat.PRIORITY_MAX);
1184 Notification n = builder.build();
1185
1186 nm.notify(NOTIFICATION_ID, n);
alision2cb99562013-05-30 17:02:20 -04001187 }
1188
1189 public void removeNotification() {
1190 NotificationManager nm = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
1191 nm.cancel(NOTIFICATION_ID);
alision85704182013-05-29 15:23:03 -04001192 }
1193
alisiondf1dac92013-06-27 17:35:53 -04001194 @Override
1195 public Conference getCurrentCall() throws RemoteException {
Alexandre Lision67817192013-07-18 12:04:30 -04001196 for (SipCall i : current_calls.values()) {
Adrien Béraud9360f242013-09-19 11:07:42 +10001197
Alexandre Lisionc51ccb12013-09-11 16:00:30 -04001198 // Incoming >> Ongoing
Alexandre Lisionb4a9e392013-10-01 14:39:43 -04001199 if (i.isIncoming()) {
Alexandre Lisionc51ccb12013-09-11 16:00:30 -04001200 Conference tmp = new Conference("-1");
1201 tmp.getParticipants().add(i);
1202 return tmp;
1203 }
Adrien Béraud9360f242013-09-19 11:07:42 +10001204
Alexandre Lision67817192013-07-18 12:04:30 -04001205 if (i.isOngoing()) {
alisiondf1dac92013-06-27 17:35:53 -04001206 Conference tmp = new Conference("-1");
1207 tmp.getParticipants().add(i);
1208 return tmp;
1209 }
1210 }
Alexandre Lision67817192013-07-18 12:04:30 -04001211
1212 if (!current_confs.isEmpty()) {
alisiondf1dac92013-06-27 17:35:53 -04001213 return (Conference) current_confs.values().toArray()[0];
1214 }
1215 return null;
1216 }
1217
Alexandre Lision64dc8c02013-09-25 15:32:25 -04001218 @Override
1219 public void playDtmf(final String key) throws RemoteException {
1220 getExecutor().execute(new SipRunnable() {
1221 @Override
1222 protected void doRun() throws SameThreadException, RemoteException {
1223 Log.i(TAG, "SipService.playDtmf() thread running...");
1224 callManagerJNI.playDTMF(key);
1225 }
1226 });
1227 }
1228
Alexandre Lision6ae652d2013-09-26 16:39:20 -04001229 @Override
1230 public List getConcurrentCalls() throws RemoteException {
1231 ArrayList<Conference> toReturn = new ArrayList<Conference>();
Alexandre Lisionb4a9e392013-10-01 14:39:43 -04001232
1233 for (SipCall sip : current_calls.values()) {
1234 if (!sip.isCurrent()) {
Alexandre Lision6ae652d2013-09-26 16:39:20 -04001235 Conference tmp = new Conference("-1");
1236 tmp.getParticipants().add(sip);
1237 toReturn.add(tmp);
1238 }
1239 }
Alexandre Lisionb4a9e392013-10-01 14:39:43 -04001240
1241 Log.i(TAG, "toReturn SIZE " + toReturn.size());
1242
Alexandre Lision6ae652d2013-09-26 16:39:20 -04001243 return toReturn;
1244 }
1245
Alexandre Lision4fb22622013-10-21 16:26:33 -04001246 @Override
1247 public String getCurrentAudioCodecName(String callID) throws RemoteException {
1248 return callManagerJNI.getCurrentAudioCodecName(callID);
1249 }
1250
Alexandre Lision31e30902013-11-08 15:16:59 -05001251 @Override
1252 public void setMuted(final boolean mute) throws RemoteException {
1253 getExecutor().execute(new SipRunnable() {
1254 @Override
1255 protected void doRun() throws SameThreadException, RemoteException {
1256 Log.i(TAG, "SipService.setMuted() thread running...");
1257 configurationManagerJNI.muteCapture(mute);
1258 }
1259 });
1260 }
1261
1262 @Override
1263 public boolean isCaptureMuted() throws RemoteException {
1264 class IsMuted extends SipRunnableWithReturn {
1265
1266 @Override
1267 protected Boolean doRun() throws SameThreadException {
1268 Log.i(TAG, "SipService.isCaptureMuted() thread running...");
1269 return configurationManagerJNI.isCaptureMuted();
1270 }
1271 }
1272
1273 IsMuted runInstance = new IsMuted();
1274 getExecutor().execute(runInstance);
1275 while (!runInstance.isDone()) {
1276 }
1277
1278 return (Boolean) runInstance.getVal();
1279 }
1280
Alexandre Lision3b7148e2013-11-13 17:23:06 -05001281 @Override
1282 public List getCredentials(final String accountID) throws RemoteException {
1283 class Credentials extends SipRunnableWithReturn {
1284
1285 @Override
1286 protected List doRun() throws SameThreadException {
1287 Log.i(TAG, "SipService.getCredentials() thread running...");
1288 VectMap map = configurationManagerJNI.getCredentials(accountID);
1289 ArrayList<HashMap<String, String>> result = AccountDetailsHandler.convertCredentialsToNative(map);
Alexandre Lision3cefec22013-11-14 17:26:35 -05001290 Log.i("CREDS","----------------- GET CREDENTIALS:");
1291 for (HashMap<String, String> test : result) {
1292 Log.i("CREDS","CONFIG_ACCOUNT_USERNAME:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_USERNAME));
1293 Log.i("CREDS","CONFIG_ACCOUNT_PASSWORD:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
1294 Log.i("CREDS","CONFIG_ACCOUNT_REALM:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_REALM));
1295 }
Alexandre Lision3b7148e2013-11-13 17:23:06 -05001296 return result;
1297 }
1298 }
1299
1300 Credentials runInstance = new Credentials();
1301 getExecutor().execute(runInstance);
1302 while (!runInstance.isDone()) {
1303 }
1304 return (List) runInstance.getVal();
1305 }
1306
1307 @Override
1308 public void setCredentials(final String accountID, final List creds) throws RemoteException {
1309 getExecutor().execute(new SipRunnable() {
1310 @Override
1311 protected void doRun() throws SameThreadException, RemoteException {
1312 Log.i(TAG, "SipService.setCredentials() thread running...");
Alexandre Lision3cefec22013-11-14 17:26:35 -05001313 Log.i("CREDS","----------------- GET CREDENTIALS:");
1314 ArrayList<HashMap<String, String>> list = (ArrayList<HashMap<String, String>>) creds;
1315 for (HashMap<String, String> test : list) {
1316 Log.i("CREDS","CONFIG_ACCOUNT_USERNAME:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_USERNAME));
1317 Log.i("CREDS","CONFIG_ACCOUNT_PASSWORD:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
1318 Log.i("CREDS","CONFIG_ACCOUNT_REALM:"+ test.get(AccountCredentials.CONFIG_ACCOUNT_REALM));
1319 }
Alexandre Lision3b7148e2013-11-13 17:23:06 -05001320 configurationManagerJNI.setCredentials(accountID, AccountDetailsHandler.convertCredentialsToSwig(creds));;
1321 }
1322 });
1323 }
1324
Alexandre Lision3e2a1d02013-11-19 17:23:00 -05001325 @Override
1326 public void registerAllAccounts() throws RemoteException {
1327 getExecutor().execute(new SipRunnable() {
1328 @Override
1329 protected void doRun() throws SameThreadException, RemoteException {
1330 Log.i(TAG, "SipService.registerAllAccounts() thread running...");
1331 configurationManagerJNI.registerAllAccounts();
1332 }
1333 });
1334 }
1335
Alexandre Lision451f2a82013-11-12 12:55:55 -05001336
1337
Emeric Vigier6119d782012-09-21 18:04:14 -04001338 };
Alexandre Lision63870a72013-10-28 16:33:47 -04001339}