blob: 60b91f3b1484adda1eb71dd68bf96f98bc110e0d [file] [log] [blame]
alisioncc7bb422013-06-06 15:31:39 -04001package com.savoirfairelinux.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
alision2cb99562013-05-30 17:02:20 -04008import android.content.BroadcastReceiver;
9import android.content.Context;
10import android.content.Intent;
11import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040012import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040013import android.util.Log;
14
alision2cb99562013-05-30 17:02:20 -040015import com.savoirfairelinux.sflphone.model.CallContact;
alision806e18e2013-06-21 15:30:17 -040016import com.savoirfairelinux.sflphone.model.Conference;
alision2cb99562013-05-30 17:02:20 -040017import com.savoirfairelinux.sflphone.model.SipCall;
18import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
19import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
alision806e18e2013-06-21 15:30:17 -040020import com.savoirfairelinux.sflphone.service.ISipService.Stub;
Alexandre Lision6e8931e2013-09-19 16:49:34 -040021import com.savoirfairelinux.sflphone.service.ServiceConstants;
alision2cb99562013-05-30 17:02:20 -040022import com.savoirfairelinux.sflphone.service.SipService;
23
alision34673e62013-06-25 14:40:07 -040024public class IncomingReceiver extends BroadcastReceiver {
25
alision58356b72013-06-03 17:13:36 -040026 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040027
28 SipService callback;
alision806e18e2013-06-21 15:30:17 -040029 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040030
31 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040032 callback = client;
alision806e18e2013-06-21 15:30:17 -040033 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040034 }
alision34673e62013-06-25 14:40:07 -040035
Alexandre Lision6e8931e2013-09-19 16:49:34 -040036 @SuppressWarnings("unchecked") // Hashmap runtime cast
alision2cb99562013-05-30 17:02:20 -040037 @Override
38 public void onReceive(Context context, Intent intent) {
39
40 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040041
alision2cb99562013-05-30 17:02:20 -040042 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040043 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040044
alision2cb99562013-05-30 17:02:20 -040045 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040046
alision2cb99562013-05-30 17:02:20 -040047 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040048 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040049
alision2cb99562013-05-30 17:02:20 -040050 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040051
alision2cb99562013-05-30 17:02:20 -040052 Log.i(TAG, "Received" + intent.getAction());
53 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040054
alision2cb99562013-05-30 17:02:20 -040055 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
56 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
57
58 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
59 callBuilder.startCallCreation(b.getString("CallID")).setAccountID(b.getString("AccountID"))
60 .setCallState(SipCall.state.CALL_STATE_RINGING).setCallType(SipCall.state.CALL_TYPE_INCOMING);
alision907bde72013-06-20 14:40:37 -040061 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
alision2cb99562013-05-30 17:02:20 -040062
63 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
64 try {
65 SipCall newCall = callBuilder.build();
66 toSend.putExtra("newcall", newCall);
Alexandre Lisionebeb3662013-09-17 16:20:54 -040067 HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
68 newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040069 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
70 callback.sendBroadcast(toSend);
71 } catch (Exception e) {
72 Log.e(TAG, e.toString());
73 }
74
75 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
76
alisioncd8fb912013-06-28 14:43:51 -040077 Log.i(TAG, "Received" + intent.getAction());
alision2cb99562013-05-30 17:02:20 -040078 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
79 String newState = b.getString("State");
alisioncd8fb912013-06-28 14:43:51 -040080 try {
81 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
82 callback.getCurrent_calls().remove(b.getString("CallID"));
83 }
84 } catch (RemoteException e) {
85 e.printStackTrace();
86 }
87
alision2cb99562013-05-30 17:02:20 -040088 if (newState.equals("INCOMING")) {
89 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
90 } else if (newState.equals("RINGING")) {
91 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
92 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -040093 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
94 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
95 } else {
96 // Check if call is in a conference
97 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
98 while (it.hasNext()) {
99 Conference tmp = it.next().getValue();
100 for (SipCall c : tmp.getParticipants()) {
101 if (c.getCallId().contentEquals(b.getString("CallID")))
102 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
103 }
104 }
105 }
106
alision2cb99562013-05-30 17:02:20 -0400107 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400108 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400109 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
110 callback.getCurrent_calls().remove(b.getString("CallID"));
111 } else {
112 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
113
114 boolean found = false;
115 int i = 0;
116 while (!found && i < it.size()) {
117 Conference tmp = it.get(i);
118
119 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
120 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
121 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
122 found = true;
123 }
124
125 }
126 ++i;
127
128 }
129 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400130
alisioncd8fb912013-06-28 14:43:51 -0400131 callback.sendBroadcast(intent);
132
alision2cb99562013-05-30 17:02:20 -0400133 } else if (newState.equals("BUSY")) {
134 callback.getCurrent_calls().remove(b.getString("CallID"));
135 } else if (newState.equals("FAILURE")) {
136 callback.getCurrent_calls().remove(b.getString("CallID"));
137 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400138 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
139 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
140 } else {
141 // Check if call is in a conference
142 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400143 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400144 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400145 for (SipCall c : tmp.getParticipants()) {
146 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400147 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400148 }
149 }
150 }
alision2cb99562013-05-30 17:02:20 -0400151 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400152
alision34673e62013-06-25 14:40:07 -0400153 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
154 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
155 } else {
156 // Check if call is in a conference
157 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400158 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400159 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400160 for (SipCall c : tmp.getParticipants()) {
161 if (c.getCallId().contentEquals(b.getString("CallID")))
162 ;
163 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400164 }
165 }
166 }
alision2cb99562013-05-30 17:02:20 -0400167 } else {
168 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
169 }
170
171 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400172
alision2cb99562013-05-30 17:02:20 -0400173 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400174
alision2cb99562013-05-30 17:02:20 -0400175 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400176
alision806e18e2013-06-21 15:30:17 -0400177 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400178
alision806e18e2013-06-21 15:30:17 -0400179 Log.i(TAG, "Received" + intent.getAction());
180 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400181
alision806e18e2013-06-21 15:30:17 -0400182 try {
alisiondf1dac92013-06-27 17:35:53 -0400183 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400184 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400185 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400186 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400187 }
188 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
189 toSend.putExtra("newconf", created);
190 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
191 callback.sendBroadcast(toSend);
192 } catch (RemoteException e1) {
193 e1.printStackTrace();
194 }
195 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400196
alision806e18e2013-06-21 15:30:17 -0400197 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400198
alision806e18e2013-06-21 15:30:17 -0400199 Log.i(TAG, "Received" + intent.getAction());
200 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400201 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400202 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
203 }
204 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400205 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400206
alision806e18e2013-06-21 15:30:17 -0400207 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400208
alisiondf1dac92013-06-27 17:35:53 -0400209 ArrayList<String> all_participants;
210 try {
211 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
212 for (String participant : all_participants) {
213 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
214 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
215 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
216 .add(callback.getCurrent_calls().get(participant));
217 callback.getCurrent_calls().remove(participant);
218 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
219 callback.sendBroadcast(intent);
220 return;
221 }
222 }
223 } catch (RemoteException e) {
224 e.printStackTrace();
225 }
226
alision806e18e2013-06-21 15:30:17 -0400227 Log.i(TAG, "Received" + intent.getAction());
228 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alisiondf1dac92013-06-27 17:35:53 -0400229 callback.sendBroadcast(intent);
230
231 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
232
233 Log.i(TAG, "Received" + intent.getAction());
234
235 try {
236 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
237 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400238 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400239 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
240 } else {
241 // A call in a conference has been put on hold
242 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400243 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400244 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400245 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400246 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
247 }
248 }
249 // Re sending the same intent to the app
250 callback.sendBroadcast(intent);
251 ;
252 } catch (RemoteException e) {
253 // TODO Auto-generated catch block
254 e.printStackTrace();
255 }
256
alision2cb99562013-05-30 17:02:20 -0400257 }
258
259 }
260}