blob: 1c81e82e296ca4a5fd27eb97a149f62447e5d736 [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;
12import org.sflphone.service.CallManagerCallBack;
13import org.sflphone.service.ConfigurationManagerCallback;
14import org.sflphone.service.ServiceConstants;
15import org.sflphone.service.SipService;
16
alision2cb99562013-05-30 17:02:20 -040017import android.content.BroadcastReceiver;
18import android.content.Context;
19import android.content.Intent;
20import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040021import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040022import android.util.Log;
Alexandre Lision5ed2c972013-10-11 15:36:33 -040023import android.widget.Toast;
alision2cb99562013-05-30 17:02:20 -040024
Alexandre Lision064e1e02013-10-01 16:18:42 -040025import org.sflphone.service.ISipService.Stub;
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
alision2cb99562013-05-30 17:02:20 -040056 Log.i(TAG, "Received" + intent.getAction());
57 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040058
alision2cb99562013-05-30 17:02:20 -040059 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
60 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
61
62 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
alision2cb99562013-05-30 17:02:20 -040063
Alexandre Lision3ee516e2013-10-07 17:32:15 -040064 Account acc;
alision2cb99562013-05-30 17:02:20 -040065 try {
Alexandre Lision3ee516e2013-10-07 17:32:15 -040066 acc = new Account(b.getString("AccountID"), (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID")));
67 callBuilder.startCallCreation(b.getString("CallID")).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
68 .setCallType(SipCall.state.CALL_TYPE_INCOMING);
69 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
70
71 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
72
alision2cb99562013-05-30 17:02:20 -040073 SipCall newCall = callBuilder.build();
74 toSend.putExtra("newcall", newCall);
Alexandre Lisionebeb3662013-09-17 16:20:54 -040075 HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
76 newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040077 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
78 callback.sendBroadcast(toSend);
Alexandre Lision3ee516e2013-10-07 17:32:15 -040079 } catch (RemoteException e1) {
80 e1.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040081 } catch (Exception e) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -040082 e.printStackTrace();
alision2cb99562013-05-30 17:02:20 -040083 }
84
85 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
86
Alexandre Lision5ed2c972013-10-11 15:36:33 -040087 Log.i(TAG, "Received " + intent.getAction());
alision2cb99562013-05-30 17:02:20 -040088 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
89 String newState = b.getString("State");
Alexandre Lision5ed2c972013-10-11 15:36:33 -040090
alisioncd8fb912013-06-28 14:43:51 -040091 try {
92 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
93 callback.getCurrent_calls().remove(b.getString("CallID"));
94 }
Alexandre Lision5ed2c972013-10-11 15:36:33 -040095 } catch (RemoteException e1) {
96 e1.printStackTrace();
alisioncd8fb912013-06-28 14:43:51 -040097 }
98
alision2cb99562013-05-30 17:02:20 -040099 if (newState.equals("INCOMING")) {
100 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
101 } else if (newState.equals("RINGING")) {
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400102 try {
103 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
104 } catch (NullPointerException e) {
105 if (callback.getCurrent_calls() == null) {
Alexandre Lision5ed2c972013-10-11 15:36:33 -0400106
Alexandre Lision80f0a7e2013-09-26 12:27:51 -0400107 return;
108 }
109 if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
110 Log.e(TAG, "get(b.getString(callID)) null");
111 return;
112 }
113 }
114
alision2cb99562013-05-30 17:02:20 -0400115 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -0400116 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
117 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
118 } else {
119 // Check if call is in a conference
120 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
121 while (it.hasNext()) {
122 Conference tmp = it.next().getValue();
123 for (SipCall c : tmp.getParticipants()) {
124 if (c.getCallId().contentEquals(b.getString("CallID")))
125 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
126 }
127 }
128 }
129
alision2cb99562013-05-30 17:02:20 -0400130 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400131 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400132 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
133 callback.getCurrent_calls().remove(b.getString("CallID"));
134 } else {
135 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
136
137 boolean found = false;
138 int i = 0;
139 while (!found && i < it.size()) {
140 Conference tmp = it.get(i);
141
142 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
143 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
144 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
145 found = true;
146 }
147
148 }
149 ++i;
150
151 }
152 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400153
alisioncd8fb912013-06-28 14:43:51 -0400154 callback.sendBroadcast(intent);
155
alision2cb99562013-05-30 17:02:20 -0400156 } else if (newState.equals("BUSY")) {
157 callback.getCurrent_calls().remove(b.getString("CallID"));
158 } else if (newState.equals("FAILURE")) {
159 callback.getCurrent_calls().remove(b.getString("CallID"));
160 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400161 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
162 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
163 } else {
164 // Check if call is in a conference
165 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400166 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400167 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400168 for (SipCall c : tmp.getParticipants()) {
169 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400170 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400171 }
172 }
173 }
alision2cb99562013-05-30 17:02:20 -0400174 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400175
alision34673e62013-06-25 14:40:07 -0400176 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
177 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
178 } else {
179 // Check if call is in a conference
180 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400181 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400182 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400183 for (SipCall c : tmp.getParticipants()) {
184 if (c.getCallId().contentEquals(b.getString("CallID")))
Alexandre Lision40954dc2013-10-09 15:24:03 -0400185 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400186 }
187 }
188 }
alision2cb99562013-05-30 17:02:20 -0400189 } else {
190 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
191 }
192
193 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400194
alision2cb99562013-05-30 17:02:20 -0400195 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400196
alision2cb99562013-05-30 17:02:20 -0400197 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400198
alision806e18e2013-06-21 15:30:17 -0400199 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400200
alision806e18e2013-06-21 15:30:17 -0400201 Log.i(TAG, "Received" + intent.getAction());
202 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400203
alision806e18e2013-06-21 15:30:17 -0400204 try {
alisiondf1dac92013-06-27 17:35:53 -0400205 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400206 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400207 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400208 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400209 }
210 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
211 toSend.putExtra("newconf", created);
212 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
213 callback.sendBroadcast(toSend);
214 } catch (RemoteException e1) {
215 e1.printStackTrace();
216 }
217 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400218
alision806e18e2013-06-21 15:30:17 -0400219 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400220
alision806e18e2013-06-21 15:30:17 -0400221 Log.i(TAG, "Received" + intent.getAction());
222 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400223 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400224 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
225 }
226 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400227 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400228
alision806e18e2013-06-21 15:30:17 -0400229 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400230
alisiondf1dac92013-06-27 17:35:53 -0400231 ArrayList<String> all_participants;
232 try {
233 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
234 for (String participant : all_participants) {
235 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
236 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
237 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
238 .add(callback.getCurrent_calls().get(participant));
239 callback.getCurrent_calls().remove(participant);
240 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
241 callback.sendBroadcast(intent);
242 return;
243 }
244 }
245 } catch (RemoteException e) {
246 e.printStackTrace();
247 }
248
alision806e18e2013-06-21 15:30:17 -0400249 Log.i(TAG, "Received" + intent.getAction());
Alexandre Lision40954dc2013-10-09 15:24:03 -0400250 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")) != null) {
251
252 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
253 callback.sendBroadcast(intent);
254 }
alisiondf1dac92013-06-27 17:35:53 -0400255
256 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
257
258 Log.i(TAG, "Received" + intent.getAction());
259
260 try {
261 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
262 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400263 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400264 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
265 } else {
266 // A call in a conference has been put on hold
267 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400268 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400269 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400270 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400271 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
272 }
273 }
274 // Re sending the same intent to the app
275 callback.sendBroadcast(intent);
276 ;
277 } catch (RemoteException e) {
278 // TODO Auto-generated catch block
279 e.printStackTrace();
280 }
281
alision2cb99562013-05-30 17:02:20 -0400282 }
283
284 }
285}