blob: b55da8de461e91d8266376481d221a6cc0926c87 [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 Lision064e1e02013-10-01 16:18:42 -04008import org.sflphone.model.CallContact;
9import org.sflphone.model.Conference;
10import org.sflphone.model.SipCall;
11import org.sflphone.service.CallManagerCallBack;
12import org.sflphone.service.ConfigurationManagerCallback;
13import org.sflphone.service.ServiceConstants;
14import org.sflphone.service.SipService;
15
alision2cb99562013-05-30 17:02:20 -040016import android.content.BroadcastReceiver;
17import android.content.Context;
18import android.content.Intent;
19import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040020import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040021import android.util.Log;
22
Alexandre Lision064e1e02013-10-01 16:18:42 -040023import org.sflphone.service.ISipService.Stub;
alision2cb99562013-05-30 17:02:20 -040024
alision34673e62013-06-25 14:40:07 -040025public class IncomingReceiver extends BroadcastReceiver {
26
alision58356b72013-06-03 17:13:36 -040027 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040028
29 SipService callback;
alision806e18e2013-06-21 15:30:17 -040030 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040031
32 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040033 callback = client;
alision806e18e2013-06-21 15:30:17 -040034 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040035 }
alision34673e62013-06-25 14:40:07 -040036
Alexandre Lision80f0a7e2013-09-26 12:27:51 -040037 @SuppressWarnings("unchecked")
38 // Hashmap runtime cast
alision2cb99562013-05-30 17:02:20 -040039 @Override
40 public void onReceive(Context context, Intent intent) {
41
42 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040043
alision2cb99562013-05-30 17:02:20 -040044 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040045 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040046
alision2cb99562013-05-30 17:02:20 -040047 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040048
alision2cb99562013-05-30 17:02:20 -040049 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040050 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040051
alision2cb99562013-05-30 17:02:20 -040052 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040053
alision2cb99562013-05-30 17:02:20 -040054 Log.i(TAG, "Received" + intent.getAction());
55 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040056
alision2cb99562013-05-30 17:02:20 -040057 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
58 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
59
60 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
61 callBuilder.startCallCreation(b.getString("CallID")).setAccountID(b.getString("AccountID"))
62 .setCallState(SipCall.state.CALL_STATE_RINGING).setCallType(SipCall.state.CALL_TYPE_INCOMING);
alision907bde72013-06-20 14:40:37 -040063 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
alision2cb99562013-05-30 17:02:20 -040064
65 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
66 try {
67 SipCall newCall = callBuilder.build();
68 toSend.putExtra("newcall", newCall);
Alexandre Lisionebeb3662013-09-17 16:20:54 -040069 HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
70 newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040071 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
72 callback.sendBroadcast(toSend);
73 } catch (Exception e) {
74 Log.e(TAG, e.toString());
75 }
76
77 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
78
alisioncd8fb912013-06-28 14:43:51 -040079 Log.i(TAG, "Received" + intent.getAction());
alision2cb99562013-05-30 17:02:20 -040080 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
81 String newState = b.getString("State");
alisioncd8fb912013-06-28 14:43:51 -040082 try {
83 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
84 callback.getCurrent_calls().remove(b.getString("CallID"));
85 }
86 } catch (RemoteException e) {
87 e.printStackTrace();
88 }
89
alision2cb99562013-05-30 17:02:20 -040090 if (newState.equals("INCOMING")) {
91 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
92 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -040093 try {
94 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
95 } catch (NullPointerException e) {
96 if (callback.getCurrent_calls() == null) {
97 Log.e(TAG, "Current calls null");
98 return;
99 }
100 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
101 Log.e(TAG, "get(b.getString(callID)) null");
102 return;
103 }
104 }
105
alision2cb99562013-05-30 17:02:20 -0400106 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400107 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
108 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
109 } else {
110 // Check if call is in a conference
111 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
112 while (it.hasNext()) {
113 Conference tmp = it.next().getValue();
114 for (SipCall c : tmp.getParticipants()) {
115 if (c.getCallId().contentEquals(b.getString("CallID")))
116 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
117 }
118 }
119 }
120
alision2cb99562013-05-30 17:02:20 -0400121 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400122 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400123 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
124 callback.getCurrent_calls().remove(b.getString("CallID"));
125 } else {
126 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
127
128 boolean found = false;
129 int i = 0;
130 while (!found && i < it.size()) {
131 Conference tmp = it.get(i);
132
133 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
134 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
135 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
136 found = true;
137 }
138
139 }
140 ++i;
141
142 }
143 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400144
alisioncd8fb912013-06-28 14:43:51 -0400145 callback.sendBroadcast(intent);
146
alision2cb99562013-05-30 17:02:20 -0400147 } else if (newState.equals("BUSY")) {
148 callback.getCurrent_calls().remove(b.getString("CallID"));
149 } else if (newState.equals("FAILURE")) {
150 callback.getCurrent_calls().remove(b.getString("CallID"));
151 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400152 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
153 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
154 } else {
155 // Check if call is in a conference
156 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400157 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400158 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400159 for (SipCall c : tmp.getParticipants()) {
160 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400161 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400162 }
163 }
164 }
alision2cb99562013-05-30 17:02:20 -0400165 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400166
alision34673e62013-06-25 14:40:07 -0400167 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
168 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
169 } else {
170 // Check if call is in a conference
171 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400172 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400173 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400174 for (SipCall c : tmp.getParticipants()) {
175 if (c.getCallId().contentEquals(b.getString("CallID")))
176 ;
177 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400178 }
179 }
180 }
alision2cb99562013-05-30 17:02:20 -0400181 } else {
182 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
183 }
184
185 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400186
alision2cb99562013-05-30 17:02:20 -0400187 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400188
alision2cb99562013-05-30 17:02:20 -0400189 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400190
alision806e18e2013-06-21 15:30:17 -0400191 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400192
alision806e18e2013-06-21 15:30:17 -0400193 Log.i(TAG, "Received" + intent.getAction());
194 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400195
alision806e18e2013-06-21 15:30:17 -0400196 try {
alisiondf1dac92013-06-27 17:35:53 -0400197 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400198 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400199 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400200 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400201 }
202 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
203 toSend.putExtra("newconf", created);
204 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
205 callback.sendBroadcast(toSend);
206 } catch (RemoteException e1) {
207 e1.printStackTrace();
208 }
209 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400210
alision806e18e2013-06-21 15:30:17 -0400211 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400212
alision806e18e2013-06-21 15:30:17 -0400213 Log.i(TAG, "Received" + intent.getAction());
214 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400215 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400216 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
217 }
218 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400219 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400220
alision806e18e2013-06-21 15:30:17 -0400221 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400222
alisiondf1dac92013-06-27 17:35:53 -0400223 ArrayList<String> all_participants;
224 try {
225 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
226 for (String participant : all_participants) {
227 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
228 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
229 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
230 .add(callback.getCurrent_calls().get(participant));
231 callback.getCurrent_calls().remove(participant);
232 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
233 callback.sendBroadcast(intent);
234 return;
235 }
236 }
237 } catch (RemoteException e) {
238 e.printStackTrace();
239 }
240
alision806e18e2013-06-21 15:30:17 -0400241 Log.i(TAG, "Received" + intent.getAction());
242 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alisiondf1dac92013-06-27 17:35:53 -0400243 callback.sendBroadcast(intent);
244
245 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
246
247 Log.i(TAG, "Received" + intent.getAction());
248
249 try {
250 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
251 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400252 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400253 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
254 } else {
255 // A call in a conference has been put on hold
256 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400257 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400258 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400259 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400260 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
261 }
262 }
263 // Re sending the same intent to the app
264 callback.sendBroadcast(intent);
265 ;
266 } catch (RemoteException e) {
267 // TODO Auto-generated catch block
268 e.printStackTrace();
269 }
270
alision2cb99562013-05-30 17:02:20 -0400271 }
272
273 }
274}