blob: 9efc305133738835a70933fc011a4ef92bd8c009 [file] [log] [blame]
Alexandre Lision064e1e02013-10-01 16:18:42 -04001package org.sflphone.receivers;
alision2cb99562013-05-30 17:02:20 -04002
alision806e18e2013-06-21 15:30:17 -04003import java.util.ArrayList;
Alexandre Lisionebeb3662013-09-17 16:20:54 -04004import java.util.HashMap;
alision34673e62013-06-25 14:40:07 -04005import java.util.Iterator;
6import java.util.Map.Entry;
alision806e18e2013-06-21 15:30:17 -04007
Alexandre Lision47a72042013-12-10 10:43:02 -05008import org.sflphone.client.CallActivity;
Alexandre Lision3ee516e2013-10-07 17:32:15 -04009import org.sflphone.model.Account;
Alexandre Lision064e1e02013-10-01 16:18:42 -040010import org.sflphone.model.CallContact;
11import org.sflphone.model.Conference;
12import org.sflphone.model.SipCall;
Alexandre Lisiond5686032013-10-29 11:09:21 -040013import org.sflphone.model.SipMessage;
Alexandre Lision064e1e02013-10-01 16:18:42 -040014import org.sflphone.service.CallManagerCallBack;
15import org.sflphone.service.ConfigurationManagerCallback;
Alexandre Lision3b7148e2013-11-13 17:23:06 -050016import org.sflphone.service.ISipService.Stub;
Alexandre Lision064e1e02013-10-01 16:18:42 -040017import org.sflphone.service.ServiceConstants;
18import org.sflphone.service.SipService;
19
alision2cb99562013-05-30 17:02:20 -040020import android.content.BroadcastReceiver;
21import android.content.Context;
22import android.content.Intent;
23import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040024import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040025import android.util.Log;
alision2cb99562013-05-30 17:02:20 -040026
alision34673e62013-06-25 14:40:07 -040027public class IncomingReceiver extends BroadcastReceiver {
28
alision58356b72013-06-03 17:13:36 -040029 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040030
31 SipService callback;
alision806e18e2013-06-21 15:30:17 -040032 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040033
34 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040035 callback = client;
alision806e18e2013-06-21 15:30:17 -040036 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040037 }
alision34673e62013-06-25 14:40:07 -040038
Alexandre Lision80f0a7e2013-09-26 12:27:51 -040039 @SuppressWarnings("unchecked")
40 // Hashmap runtime cast
alision2cb99562013-05-30 17:02:20 -040041 @Override
42 public void onReceive(Context context, Intent intent) {
43
44 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040045
alision2cb99562013-05-30 17:02:20 -040046 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040047 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040048
alision2cb99562013-05-30 17:02:20 -040049 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040050
alision2cb99562013-05-30 17:02:20 -040051 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040052 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040053
alision2cb99562013-05-30 17:02:20 -040054 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040055
Alexandre Lisiond5686032013-10-29 11:09:21 -040056 Bundle extra = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
alision2cb99562013-05-30 17:02:20 -040057 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lisiond5545232013-10-29 11:24:02 -040058 if (callback.getCurrent_calls().get(extra.getString("CallID")) != null) {
59 callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
Alexandre Lision3b7148e2013-11-13 17:23:06 -050060 } else if (callback.getCurrent_confs().get(extra.getString("CallID")) != null) {
Alexandre Lisiond5545232013-10-29 11:24:02 -040061 callback.getCurrent_confs().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
Alexandre Lision3b7148e2013-11-13 17:23:06 -050062 } else
Alexandre Lisiond5545232013-10-29 11:24:02 -040063 return;
Alexandre Lision3b7148e2013-11-13 17:23:06 -050064
alision2cb99562013-05-30 17:02:20 -040065 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040066
alision2cb99562013-05-30 17:02:20 -040067 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
68 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
69
70 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
alision2cb99562013-05-30 17:02:20 -040071
Alexandre Lision3ee516e2013-10-07 17:32:15 -040072 Account acc;
alision2cb99562013-05-30 17:02:20 -040073 try {
Alexandre Lision3b7148e2013-11-13 17:23:06 -050074 HashMap<String, String> details = (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID"));
75 ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) mBinder
76 .getCredentials(b.getString("AccountID"));
77 acc = new Account(b.getString("AccountID"), details, credentials);
Alexandre Lision3ee516e2013-10-07 17:32:15 -040078 callBuilder.startCallCreation(b.getString("CallID")).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
79 .setCallType(SipCall.state.CALL_TYPE_INCOMING);
80 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
81
82 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
Alexandre Lision47a72042013-12-10 10:43:02 -050083 toSend.setClass(callback, CallActivity.class);
84 toSend.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Alexandre Lision3ee516e2013-10-07 17:32:15 -040085
alision2cb99562013-05-30 17:02:20 -040086 SipCall newCall = callBuilder.build();
87 toSend.putExtra("newcall", newCall);
Alexandre Lision3b7148e2013-11-13 17:23:06 -050088 HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
Alexandre Lision47a72042013-12-10 10:43:02 -050089
90 newCall.setTimestamp_start(Long.parseLong(callDetails.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040091 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
Alexandre Lision47a72042013-12-10 10:43:02 -050092// callback.sendBroadcast(toSend);
93 Bundle bundle = new Bundle();
94 Conference tmp = new Conference("-1");
95
96 tmp.getParticipants().add(newCall);
97
98 bundle.putParcelable("conference", tmp);
99 toSend.putExtra("resuming", false);
100 toSend.putExtras(bundle);
101 callback.startActivity(toSend);
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500102
Alexandre Lisionbaeeb212013-12-09 12:54:47 -0500103 callback.mediaManager.obtainAudioFocus(true);
Alexandre Lision3ee516e2013-10-07 17:32:15 -0400104 } catch (RemoteException e1) {
105 e1.printStackTrace();
alision2cb99562013-05-30 17:02:20 -0400106 } catch (Exception e) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400107 e.printStackTrace();
alision2cb99562013-05-30 17:02:20 -0400108 }
109
110 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
111
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400112 Log.i(TAG, "Received " + intent.getAction());
alision2cb99562013-05-30 17:02:20 -0400113 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
114 String newState = b.getString("State");
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400115
alisioncd8fb912013-06-28 14:43:51 -0400116 try {
117 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
118 callback.getCurrent_calls().remove(b.getString("CallID"));
119 }
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400120 } catch (RemoteException e1) {
121 e1.printStackTrace();
alisioncd8fb912013-06-28 14:43:51 -0400122 }
123
alision2cb99562013-05-30 17:02:20 -0400124 if (newState.equals("INCOMING")) {
125 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
126 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400127 try {
128 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
129 } catch (NullPointerException e) {
130 if (callback.getCurrent_calls() == null) {
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500131
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400132 return;
133 }
134 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
135 Log.e(TAG, "get(b.getString(callID)) null");
136 return;
137 }
138 }
139
alision2cb99562013-05-30 17:02:20 -0400140 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400141 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
142 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
143 } else {
144 // Check if call is in a conference
145 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
146 while (it.hasNext()) {
147 Conference tmp = it.next().getValue();
148 for (SipCall c : tmp.getParticipants()) {
149 if (c.getCallId().contentEquals(b.getString("CallID")))
150 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
151 }
152 }
153 }
154
alision2cb99562013-05-30 17:02:20 -0400155 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400156 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400157 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
158 callback.getCurrent_calls().remove(b.getString("CallID"));
159 } else {
160 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
161
162 boolean found = false;
163 int i = 0;
164 while (!found && i < it.size()) {
165 Conference tmp = it.get(i);
166
167 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
168 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
169 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
170 found = true;
171 }
172
173 }
174 ++i;
175
176 }
177 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400178
alisioncd8fb912013-06-28 14:43:51 -0400179 callback.sendBroadcast(intent);
180
alision2cb99562013-05-30 17:02:20 -0400181 } else if (newState.equals("BUSY")) {
182 callback.getCurrent_calls().remove(b.getString("CallID"));
183 } else if (newState.equals("FAILURE")) {
184 callback.getCurrent_calls().remove(b.getString("CallID"));
185 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400186 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
187 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
188 } else {
189 // Check if call is in a conference
190 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400191 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400192 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400193 for (SipCall c : tmp.getParticipants()) {
194 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400195 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400196 }
197 }
198 }
alision2cb99562013-05-30 17:02:20 -0400199 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400200
alision34673e62013-06-25 14:40:07 -0400201 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
202 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
203 } else {
204 // Check if call is in a conference
205 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400206 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400207 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400208 for (SipCall c : tmp.getParticipants()) {
209 if (c.getCallId().contentEquals(b.getString("CallID")))
Alexandre Lision40954dc2013-10-09 15:24:03 -0400210 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400211 }
212 }
213 }
alision2cb99562013-05-30 17:02:20 -0400214 } else {
215 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
216 }
217
218 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400219
alision2cb99562013-05-30 17:02:20 -0400220 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400221
alision2cb99562013-05-30 17:02:20 -0400222 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400223
alision806e18e2013-06-21 15:30:17 -0400224 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400225
alision806e18e2013-06-21 15:30:17 -0400226 Log.i(TAG, "Received" + intent.getAction());
227 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400228
alision806e18e2013-06-21 15:30:17 -0400229 try {
alisiondf1dac92013-06-27 17:35:53 -0400230 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400231 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400232 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400233 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400234 }
235 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
236 toSend.putExtra("newconf", created);
237 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
238 callback.sendBroadcast(toSend);
239 } catch (RemoteException e1) {
240 e1.printStackTrace();
241 }
242 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400243
alision806e18e2013-06-21 15:30:17 -0400244 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400245
alision806e18e2013-06-21 15:30:17 -0400246 Log.i(TAG, "Received" + intent.getAction());
247 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400248 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400249 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
250 }
251 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400252 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400253
alision806e18e2013-06-21 15:30:17 -0400254 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400255
alisiondf1dac92013-06-27 17:35:53 -0400256 ArrayList<String> all_participants;
257 try {
258 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
259 for (String participant : all_participants) {
260 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
261 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
262 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
263 .add(callback.getCurrent_calls().get(participant));
264 callback.getCurrent_calls().remove(participant);
265 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
266 callback.sendBroadcast(intent);
267 return;
268 }
269 }
270 } catch (RemoteException e) {
271 e.printStackTrace();
272 }
273
alision806e18e2013-06-21 15:30:17 -0400274 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lision40954dc2013-10-09 15:24:03 -0400275 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
276
277 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
278 callback.sendBroadcast(intent);
279 }
alisiondf1dac92013-06-27 17:35:53 -0400280
281 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
282
283 Log.i(TAG, "Received" + intent.getAction());
284
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500285 // try {
286 // if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
287 // callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
288 // } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
289 // callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
290 // } else {
291 // // A call in a conference has been put on hold
292 // Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
293 // while (it.hasNext()) {
294 // Conference c = it.next();
295 // if (c.getCall(intent.getStringExtra("id")) != null)
296 // c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
297 // }
298 // }
299 // // Re sending the same intent to the app
300 // callback.sendBroadcast(intent);
301 // ;
302 // } catch (RemoteException e) {
303 // // TODO Auto-generated catch block
304 // e.printStackTrace();
305 // }
alisiondf1dac92013-06-27 17:35:53 -0400306
alision2cb99562013-05-30 17:02:20 -0400307 }
308
309 }
310}