blob: f15f5b6df4d99ec343791accc59f248cf4c4c647 [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;
Alexandre Lision35577132013-12-06 15:21:15 -050024import android.os.SystemClock;
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);
83
alision2cb99562013-05-30 17:02:20 -040084 SipCall newCall = callBuilder.build();
85 toSend.putExtra("newcall", newCall);
Alexandre Lision3b7148e2013-11-13 17:23:06 -050086 HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
Alexandre Lision35577132013-12-06 15:21:15 -050087
88 String stamp = callDetails.get(ServiceConstants.call.TIMESTAMP_START);
89
90 if(stamp.length() > 0)
91 newCall.setTimestamp_start(Long.parseLong(stamp));
92 else
93 newCall.setTimestamp_start(System.currentTimeMillis() / 1000);
alision2cb99562013-05-30 17:02:20 -040094 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
95 callback.sendBroadcast(toSend);
Alexandre Lision3b7148e2013-11-13 17:23:06 -050096
Alexandre Lisionbaeeb212013-12-09 12:54:47 -050097 callback.mediaManager.obtainAudioFocus(true);
Alexandre Lision3ee516e2013-10-07 17:32:15 -040098 } catch (RemoteException e1) {
99 e1.printStackTrace();
alision2cb99562013-05-30 17:02:20 -0400100 } catch (Exception e) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400101 e.printStackTrace();
alision2cb99562013-05-30 17:02:20 -0400102 }
103
104 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
105
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400106 Log.i(TAG, "Received " + intent.getAction());
alision2cb99562013-05-30 17:02:20 -0400107 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
108 String newState = b.getString("State");
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400109
alisioncd8fb912013-06-28 14:43:51 -0400110 try {
111 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
112 callback.getCurrent_calls().remove(b.getString("CallID"));
113 }
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400114 } catch (RemoteException e1) {
115 e1.printStackTrace();
alisioncd8fb912013-06-28 14:43:51 -0400116 }
117
alision2cb99562013-05-30 17:02:20 -0400118 if (newState.equals("INCOMING")) {
119 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
120 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400121 try {
122 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
123 } catch (NullPointerException e) {
124 if (callback.getCurrent_calls() == null) {
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500125
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400126 return;
127 }
128 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
129 Log.e(TAG, "get(b.getString(callID)) null");
130 return;
131 }
132 }
133
alision2cb99562013-05-30 17:02:20 -0400134 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400135 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
136 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
137 } else {
138 // Check if call is in a conference
139 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
140 while (it.hasNext()) {
141 Conference tmp = it.next().getValue();
142 for (SipCall c : tmp.getParticipants()) {
143 if (c.getCallId().contentEquals(b.getString("CallID")))
144 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
145 }
146 }
147 }
148
alision2cb99562013-05-30 17:02:20 -0400149 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400150 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400151 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
152 callback.getCurrent_calls().remove(b.getString("CallID"));
153 } else {
154 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
155
156 boolean found = false;
157 int i = 0;
158 while (!found && i < it.size()) {
159 Conference tmp = it.get(i);
160
161 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
162 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
163 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
164 found = true;
165 }
166
167 }
168 ++i;
169
170 }
171 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400172
alisioncd8fb912013-06-28 14:43:51 -0400173 callback.sendBroadcast(intent);
174
alision2cb99562013-05-30 17:02:20 -0400175 } else if (newState.equals("BUSY")) {
176 callback.getCurrent_calls().remove(b.getString("CallID"));
177 } else if (newState.equals("FAILURE")) {
178 callback.getCurrent_calls().remove(b.getString("CallID"));
179 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400180 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
181 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
182 } else {
183 // Check if call is in a conference
184 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400185 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400186 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400187 for (SipCall c : tmp.getParticipants()) {
188 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400189 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400190 }
191 }
192 }
alision2cb99562013-05-30 17:02:20 -0400193 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400194
alision34673e62013-06-25 14:40:07 -0400195 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
196 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
197 } else {
198 // Check if call is in a conference
199 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400200 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400201 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400202 for (SipCall c : tmp.getParticipants()) {
203 if (c.getCallId().contentEquals(b.getString("CallID")))
Alexandre Lision40954dc2013-10-09 15:24:03 -0400204 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400205 }
206 }
207 }
alision2cb99562013-05-30 17:02:20 -0400208 } else {
209 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
210 }
211
212 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400213
alision2cb99562013-05-30 17:02:20 -0400214 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400215
alision2cb99562013-05-30 17:02:20 -0400216 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400217
alision806e18e2013-06-21 15:30:17 -0400218 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400219
alision806e18e2013-06-21 15:30:17 -0400220 Log.i(TAG, "Received" + intent.getAction());
221 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400222
alision806e18e2013-06-21 15:30:17 -0400223 try {
alisiondf1dac92013-06-27 17:35:53 -0400224 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400225 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400226 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400227 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400228 }
229 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
230 toSend.putExtra("newconf", created);
231 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
232 callback.sendBroadcast(toSend);
233 } catch (RemoteException e1) {
234 e1.printStackTrace();
235 }
236 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400237
alision806e18e2013-06-21 15:30:17 -0400238 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400239
alision806e18e2013-06-21 15:30:17 -0400240 Log.i(TAG, "Received" + intent.getAction());
241 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400242 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400243 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
244 }
245 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400246 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400247
alision806e18e2013-06-21 15:30:17 -0400248 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400249
alisiondf1dac92013-06-27 17:35:53 -0400250 ArrayList<String> all_participants;
251 try {
252 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
253 for (String participant : all_participants) {
254 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
255 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
256 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
257 .add(callback.getCurrent_calls().get(participant));
258 callback.getCurrent_calls().remove(participant);
259 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
260 callback.sendBroadcast(intent);
261 return;
262 }
263 }
264 } catch (RemoteException e) {
265 e.printStackTrace();
266 }
267
alision806e18e2013-06-21 15:30:17 -0400268 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lision40954dc2013-10-09 15:24:03 -0400269 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
270
271 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
272 callback.sendBroadcast(intent);
273 }
alisiondf1dac92013-06-27 17:35:53 -0400274
275 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
276
277 Log.i(TAG, "Received" + intent.getAction());
278
Alexandre Lision3b7148e2013-11-13 17:23:06 -0500279 // try {
280 // if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
281 // callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
282 // } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
283 // callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
284 // } else {
285 // // A call in a conference has been put on hold
286 // Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
287 // while (it.hasNext()) {
288 // Conference c = it.next();
289 // if (c.getCall(intent.getStringExtra("id")) != null)
290 // c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
291 // }
292 // }
293 // // Re sending the same intent to the app
294 // callback.sendBroadcast(intent);
295 // ;
296 // } catch (RemoteException e) {
297 // // TODO Auto-generated catch block
298 // e.printStackTrace();
299 // }
alisiondf1dac92013-06-27 17:35:53 -0400300
alision2cb99562013-05-30 17:02:20 -0400301 }
302
303 }
304}