blob: 6c9b8d2b8ef7c2aa9ae4bda052a681e0063ece34 [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 Lision3ee516e2013-10-07 17:32:15 -04008import org.sflphone.model.Account;
Alexandre Lision064e1e02013-10-01 16:18:42 -04009import org.sflphone.model.CallContact;
10import org.sflphone.model.Conference;
11import org.sflphone.model.SipCall;
Alexandre Lisiond5686032013-10-29 11:09:21 -040012import org.sflphone.model.SipMessage;
Alexandre Lision064e1e02013-10-01 16:18:42 -040013import org.sflphone.service.CallManagerCallBack;
14import org.sflphone.service.ConfigurationManagerCallback;
Alexandre Lision3b7148e2013-11-13 17:23:06 -050015import org.sflphone.service.ISipService.Stub;
Alexandre Lision064e1e02013-10-01 16:18:42 -040016import org.sflphone.service.ServiceConstants;
17import org.sflphone.service.SipService;
18
alision2cb99562013-05-30 17:02:20 -040019import android.content.BroadcastReceiver;
20import android.content.Context;
21import android.content.Intent;
22import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040023import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040024import android.util.Log;
alision2cb99562013-05-30 17:02:20 -040025
alision34673e62013-06-25 14:40:07 -040026public class IncomingReceiver extends BroadcastReceiver {
27
alision58356b72013-06-03 17:13:36 -040028 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040029
30 SipService callback;
alision806e18e2013-06-21 15:30:17 -040031 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040032
33 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040034 callback = client;
alision806e18e2013-06-21 15:30:17 -040035 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040036 }
alision34673e62013-06-25 14:40:07 -040037
Alexandre Lision80f0a7e2013-09-26 12:27:51 -040038 @SuppressWarnings("unchecked")
39 // Hashmap runtime cast
alision2cb99562013-05-30 17:02:20 -040040 @Override
41 public void onReceive(Context context, Intent intent) {
42
43 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040044
alision2cb99562013-05-30 17:02:20 -040045 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040046 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040047
alision2cb99562013-05-30 17:02:20 -040048 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040049
alision2cb99562013-05-30 17:02:20 -040050 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040051 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040052
alision2cb99562013-05-30 17:02:20 -040053 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040054
Alexandre Lisiond5686032013-10-29 11:09:21 -040055 Bundle extra = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
alision2cb99562013-05-30 17:02:20 -040056 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lisiond5545232013-10-29 11:24:02 -040057 if (callback.getCurrent_calls().get(extra.getString("CallID")) != null) {
58 callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
Alexandre Lision3b7148e2013-11-13 17:23:06 -050059 } else if (callback.getCurrent_confs().get(extra.getString("CallID")) != null) {
Alexandre Lisiond5545232013-10-29 11:24:02 -040060 callback.getCurrent_confs().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
Alexandre Lision3b7148e2013-11-13 17:23:06 -050061 } else
Alexandre Lisiond5545232013-10-29 11:24:02 -040062 return;
Alexandre Lision3b7148e2013-11-13 17:23:06 -050063
alision2cb99562013-05-30 17:02:20 -040064 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040065
alision2cb99562013-05-30 17:02:20 -040066 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
67 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
68
69 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
alision2cb99562013-05-30 17:02:20 -040070
Alexandre Lision3ee516e2013-10-07 17:32:15 -040071 Account acc;
alision2cb99562013-05-30 17:02:20 -040072 try {
Alexandre Lision3b7148e2013-11-13 17:23:06 -050073 HashMap<String, String> details = (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID"));
74 ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) mBinder
75 .getCredentials(b.getString("AccountID"));
76 acc = new Account(b.getString("AccountID"), details, credentials);
Alexandre Lision3ee516e2013-10-07 17:32:15 -040077 callBuilder.startCallCreation(b.getString("CallID")).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
78 .setCallType(SipCall.state.CALL_TYPE_INCOMING);
79 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
80
81 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
82
alision2cb99562013-05-30 17:02:20 -040083 SipCall newCall = callBuilder.build();
84 toSend.putExtra("newcall", newCall);
Alexandre Lision3b7148e2013-11-13 17:23:06 -050085 HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
86 newCall.setTimestamp_start(Long.parseLong(callDetails.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040087 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
88 callback.sendBroadcast(toSend);
Alexandre Lision3b7148e2013-11-13 17:23:06 -050089
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040090 callback.mediaManager.obtainAudioFocus();
Alexandre Lision3ee516e2013-10-07 17:32:15 -040091 } catch (RemoteException e1) {
92 e1.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040093 } catch (Exception e) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -040094 e.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040095 }
96
97 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
98
Alexandre Lision5ed2c972013-10-11 15:36:33 -040099 Log.i(TAG, "Received " + intent.getAction());
alision2cb99562013-05-30 17:02:20 -0400100 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
101 String newState = b.getString("State");
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400102
alisioncd8fb912013-06-28 14:43:51 -0400103 try {
104 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
105 callback.getCurrent_calls().remove(b.getString("CallID"));
106 }
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400107 } catch (RemoteException e1) {
108 e1.printStackTrace();
alisioncd8fb912013-06-28 14:43:51 -0400109 }
110
alision2cb99562013-05-30 17:02:20 -0400111 if (newState.equals("INCOMING")) {
112 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
113 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400114 try {
115 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
116 } catch (NullPointerException e) {
117 if (callback.getCurrent_calls() == null) {
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500118
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400119 return;
120 }
121 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
122 Log.e(TAG, "get(b.getString(callID)) null");
123 return;
124 }
125 }
126
alision2cb99562013-05-30 17:02:20 -0400127 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400128 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
129 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
130 } else {
131 // Check if call is in a conference
132 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
133 while (it.hasNext()) {
134 Conference tmp = it.next().getValue();
135 for (SipCall c : tmp.getParticipants()) {
136 if (c.getCallId().contentEquals(b.getString("CallID")))
137 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
138 }
139 }
140 }
141
alision2cb99562013-05-30 17:02:20 -0400142 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400143 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400144 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
145 callback.getCurrent_calls().remove(b.getString("CallID"));
146 } else {
147 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
148
149 boolean found = false;
150 int i = 0;
151 while (!found && i < it.size()) {
152 Conference tmp = it.get(i);
153
154 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
155 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
156 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
157 found = true;
158 }
159
160 }
161 ++i;
162
163 }
164 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400165
alisioncd8fb912013-06-28 14:43:51 -0400166 callback.sendBroadcast(intent);
167
alision2cb99562013-05-30 17:02:20 -0400168 } else if (newState.equals("BUSY")) {
169 callback.getCurrent_calls().remove(b.getString("CallID"));
170 } else if (newState.equals("FAILURE")) {
171 callback.getCurrent_calls().remove(b.getString("CallID"));
172 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400173 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
174 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
175 } else {
176 // Check if call is in a conference
177 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400178 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400179 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400180 for (SipCall c : tmp.getParticipants()) {
181 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400182 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400183 }
184 }
185 }
alision2cb99562013-05-30 17:02:20 -0400186 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400187
alision34673e62013-06-25 14:40:07 -0400188 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
189 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
190 } else {
191 // Check if call is in a conference
192 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400193 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400194 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400195 for (SipCall c : tmp.getParticipants()) {
196 if (c.getCallId().contentEquals(b.getString("CallID")))
Alexandre Lision40954dc2013-10-09 15:24:03 -0400197 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400198 }
199 }
200 }
alision2cb99562013-05-30 17:02:20 -0400201 } else {
202 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
203 }
204
205 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400206
alision2cb99562013-05-30 17:02:20 -0400207 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400208
alision2cb99562013-05-30 17:02:20 -0400209 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400210
alision806e18e2013-06-21 15:30:17 -0400211 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400212
alision806e18e2013-06-21 15:30:17 -0400213 Log.i(TAG, "Received" + intent.getAction());
214 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400215
alision806e18e2013-06-21 15:30:17 -0400216 try {
alisiondf1dac92013-06-27 17:35:53 -0400217 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400218 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400219 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400220 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400221 }
222 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
223 toSend.putExtra("newconf", created);
224 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
225 callback.sendBroadcast(toSend);
226 } catch (RemoteException e1) {
227 e1.printStackTrace();
228 }
229 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400230
alision806e18e2013-06-21 15:30:17 -0400231 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400232
alision806e18e2013-06-21 15:30:17 -0400233 Log.i(TAG, "Received" + intent.getAction());
234 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400235 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400236 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
237 }
238 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400239 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400240
alision806e18e2013-06-21 15:30:17 -0400241 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400242
alisiondf1dac92013-06-27 17:35:53 -0400243 ArrayList<String> all_participants;
244 try {
245 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
246 for (String participant : all_participants) {
247 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
248 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
249 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
250 .add(callback.getCurrent_calls().get(participant));
251 callback.getCurrent_calls().remove(participant);
252 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
253 callback.sendBroadcast(intent);
254 return;
255 }
256 }
257 } catch (RemoteException e) {
258 e.printStackTrace();
259 }
260
alision806e18e2013-06-21 15:30:17 -0400261 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lision40954dc2013-10-09 15:24:03 -0400262 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
263
264 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
265 callback.sendBroadcast(intent);
266 }
alisiondf1dac92013-06-27 17:35:53 -0400267
268 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
269
270 Log.i(TAG, "Received" + intent.getAction());
271
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500272 // try {
273 // if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
274 // callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
275 // } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
276 // callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
277 // } else {
278 // // A call in a conference has been put on hold
279 // Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
280 // while (it.hasNext()) {
281 // Conference c = it.next();
282 // if (c.getCall(intent.getStringExtra("id")) != null)
283 // c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
284 // }
285 // }
286 // // Re sending the same intent to the app
287 // callback.sendBroadcast(intent);
288 // ;
289 // } catch (RemoteException e) {
290 // // TODO Auto-generated catch block
291 // e.printStackTrace();
292 // }
alisiondf1dac92013-06-27 17:35:53 -0400293
alision2cb99562013-05-30 17:02:20 -0400294 }
295
296 }
297}