blob: 77c96ba2a0753dadf1d9712ab388916ea99ce292 [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;
15import org.sflphone.service.ServiceConstants;
16import org.sflphone.service.SipService;
17
alision2cb99562013-05-30 17:02:20 -040018import android.content.BroadcastReceiver;
19import android.content.Context;
20import android.content.Intent;
21import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040022import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040023import android.util.Log;
Alexandre Lision5ed2c972013-10-11 15:36:33 -040024import android.widget.Toast;
alision2cb99562013-05-30 17:02:20 -040025
Alexandre Lision064e1e02013-10-01 16:18:42 -040026import org.sflphone.service.ISipService.Stub;
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040027import org.sflphone.service.ServiceConstants.call;
alision2cb99562013-05-30 17:02:20 -040028
alision34673e62013-06-25 14:40:07 -040029public class IncomingReceiver extends BroadcastReceiver {
30
alision58356b72013-06-03 17:13:36 -040031 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040032
33 SipService callback;
alision806e18e2013-06-21 15:30:17 -040034 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040035
36 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040037 callback = client;
alision806e18e2013-06-21 15:30:17 -040038 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040039 }
alision34673e62013-06-25 14:40:07 -040040
Alexandre Lision80f0a7e2013-09-26 12:27:51 -040041 @SuppressWarnings("unchecked")
42 // Hashmap runtime cast
alision2cb99562013-05-30 17:02:20 -040043 @Override
44 public void onReceive(Context context, Intent intent) {
45
46 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040047
alision2cb99562013-05-30 17:02:20 -040048 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040049 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040050
alision2cb99562013-05-30 17:02:20 -040051 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040052
alision2cb99562013-05-30 17:02:20 -040053 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040054 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040055
alision2cb99562013-05-30 17:02:20 -040056 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040057
Alexandre Lisiond5686032013-10-29 11:09:21 -040058 Bundle extra = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newtext");
alision2cb99562013-05-30 17:02:20 -040059 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lisiond5545232013-10-29 11:24:02 -040060 if (callback.getCurrent_calls().get(extra.getString("CallID")) != null) {
61 callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
62 } else if(callback.getCurrent_confs().get(extra.getString("CallID")) != null){
63 callback.getCurrent_confs().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
64 } else
65 return;
66
67
alision2cb99562013-05-30 17:02:20 -040068 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040069
alision2cb99562013-05-30 17:02:20 -040070 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
71 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
72
73 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
alision2cb99562013-05-30 17:02:20 -040074
Alexandre Lision3ee516e2013-10-07 17:32:15 -040075 Account acc;
alision2cb99562013-05-30 17:02:20 -040076 try {
Alexandre Lision3ee516e2013-10-07 17:32:15 -040077 acc = new Account(b.getString("AccountID"), (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID")));
78 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 Lisionebeb3662013-09-17 16:20:54 -040086 HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
87 newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040088 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
89 callback.sendBroadcast(toSend);
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040090
91 callback.mediaManager.obtainAudioFocus();
Alexandre Lision3ee516e2013-10-07 17:32:15 -040092 } catch (RemoteException e1) {
93 e1.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040094 } catch (Exception e) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -040095 e.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040096 }
97
98 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
99
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400100 Log.i(TAG, "Received " + intent.getAction());
alision2cb99562013-05-30 17:02:20 -0400101 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
102 String newState = b.getString("State");
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400103
alisioncd8fb912013-06-28 14:43:51 -0400104 try {
105 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
106 callback.getCurrent_calls().remove(b.getString("CallID"));
107 }
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400108 } catch (RemoteException e1) {
109 e1.printStackTrace();
alisioncd8fb912013-06-28 14:43:51 -0400110 }
111
alision2cb99562013-05-30 17:02:20 -0400112 if (newState.equals("INCOMING")) {
113 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
114 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400115 try {
116 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
117 } catch (NullPointerException e) {
118 if (callback.getCurrent_calls() == null) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400119
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400120 return;
121 }
122 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
123 Log.e(TAG, "get(b.getString(callID)) null");
124 return;
125 }
126 }
127
alision2cb99562013-05-30 17:02:20 -0400128 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400129 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
130 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
131 } else {
132 // Check if call is in a conference
133 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
134 while (it.hasNext()) {
135 Conference tmp = it.next().getValue();
136 for (SipCall c : tmp.getParticipants()) {
137 if (c.getCallId().contentEquals(b.getString("CallID")))
138 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
139 }
140 }
141 }
142
alision2cb99562013-05-30 17:02:20 -0400143 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400144 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400145 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
146 callback.getCurrent_calls().remove(b.getString("CallID"));
147 } else {
148 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
149
150 boolean found = false;
151 int i = 0;
152 while (!found && i < it.size()) {
153 Conference tmp = it.get(i);
154
155 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
156 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
157 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
158 found = true;
159 }
160
161 }
162 ++i;
163
164 }
165 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400166
alisioncd8fb912013-06-28 14:43:51 -0400167 callback.sendBroadcast(intent);
168
alision2cb99562013-05-30 17:02:20 -0400169 } else if (newState.equals("BUSY")) {
170 callback.getCurrent_calls().remove(b.getString("CallID"));
171 } else if (newState.equals("FAILURE")) {
172 callback.getCurrent_calls().remove(b.getString("CallID"));
173 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400174 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
175 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
176 } else {
177 // Check if call is in a conference
178 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400179 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400180 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400181 for (SipCall c : tmp.getParticipants()) {
182 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400183 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400184 }
185 }
186 }
alision2cb99562013-05-30 17:02:20 -0400187 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400188
alision34673e62013-06-25 14:40:07 -0400189 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
190 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
191 } else {
192 // Check if call is in a conference
193 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400194 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400195 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400196 for (SipCall c : tmp.getParticipants()) {
197 if (c.getCallId().contentEquals(b.getString("CallID")))
Alexandre Lision40954dc2013-10-09 15:24:03 -0400198 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400199 }
200 }
201 }
alision2cb99562013-05-30 17:02:20 -0400202 } else {
203 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
204 }
205
206 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400207
alision2cb99562013-05-30 17:02:20 -0400208 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400209
alision2cb99562013-05-30 17:02:20 -0400210 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400211
alision806e18e2013-06-21 15:30:17 -0400212 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400213
alision806e18e2013-06-21 15:30:17 -0400214 Log.i(TAG, "Received" + intent.getAction());
215 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400216
alision806e18e2013-06-21 15:30:17 -0400217 try {
alisiondf1dac92013-06-27 17:35:53 -0400218 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400219 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400220 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400221 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400222 }
223 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
224 toSend.putExtra("newconf", created);
225 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
226 callback.sendBroadcast(toSend);
227 } catch (RemoteException e1) {
228 e1.printStackTrace();
229 }
230 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400231
alision806e18e2013-06-21 15:30:17 -0400232 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400233
alision806e18e2013-06-21 15:30:17 -0400234 Log.i(TAG, "Received" + intent.getAction());
235 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400236 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400237 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
238 }
239 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400240 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400241
alision806e18e2013-06-21 15:30:17 -0400242 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400243
alisiondf1dac92013-06-27 17:35:53 -0400244 ArrayList<String> all_participants;
245 try {
246 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
247 for (String participant : all_participants) {
248 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
249 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
250 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
251 .add(callback.getCurrent_calls().get(participant));
252 callback.getCurrent_calls().remove(participant);
253 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
254 callback.sendBroadcast(intent);
255 return;
256 }
257 }
258 } catch (RemoteException e) {
259 e.printStackTrace();
260 }
261
alision806e18e2013-06-21 15:30:17 -0400262 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lision40954dc2013-10-09 15:24:03 -0400263 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
264
265 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
266 callback.sendBroadcast(intent);
267 }
alisiondf1dac92013-06-27 17:35:53 -0400268
269 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
270
271 Log.i(TAG, "Received" + intent.getAction());
272
273 try {
274 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
275 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400276 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400277 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
278 } else {
279 // A call in a conference has been put on hold
280 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400281 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400282 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400283 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400284 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
285 }
286 }
287 // Re sending the same intent to the app
288 callback.sendBroadcast(intent);
289 ;
290 } catch (RemoteException e) {
291 // TODO Auto-generated catch block
292 e.printStackTrace();
293 }
294
alision2cb99562013-05-30 17:02:20 -0400295 }
296
297 }
298}