blob: f52012c65fcf90b85fc4d2f56eff061fbf289add [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;
alision34673e62013-06-25 14:40:07 -04004import java.util.Iterator;
5import java.util.Map.Entry;
alision806e18e2013-06-21 15:30:17 -04006
alision2cb99562013-05-30 17:02:20 -04007import android.content.BroadcastReceiver;
8import android.content.Context;
9import android.content.Intent;
10import android.os.Bundle;
alision806e18e2013-06-21 15:30:17 -040011import android.os.RemoteException;
alision2cb99562013-05-30 17:02:20 -040012import android.util.Log;
13
alision2cb99562013-05-30 17:02:20 -040014import com.savoirfairelinux.sflphone.model.CallContact;
alision806e18e2013-06-21 15:30:17 -040015import com.savoirfairelinux.sflphone.model.Conference;
alision2cb99562013-05-30 17:02:20 -040016import com.savoirfairelinux.sflphone.model.SipCall;
17import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
18import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
alision806e18e2013-06-21 15:30:17 -040019import com.savoirfairelinux.sflphone.service.ISipService.Stub;
alision2cb99562013-05-30 17:02:20 -040020import com.savoirfairelinux.sflphone.service.SipService;
21
alision34673e62013-06-25 14:40:07 -040022public class IncomingReceiver extends BroadcastReceiver {
23
alision58356b72013-06-03 17:13:36 -040024 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040025
26 SipService callback;
alision806e18e2013-06-21 15:30:17 -040027 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040028
29 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040030 callback = client;
alision806e18e2013-06-21 15:30:17 -040031 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040032 }
alision34673e62013-06-25 14:40:07 -040033
alision2cb99562013-05-30 17:02:20 -040034 @Override
35 public void onReceive(Context context, Intent intent) {
36
37 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040038
alision2cb99562013-05-30 17:02:20 -040039 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040040 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040041
alision2cb99562013-05-30 17:02:20 -040042 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_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(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040048
alision2cb99562013-05-30 17:02:20 -040049 Log.i(TAG, "Received" + intent.getAction());
50 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040051
alision2cb99562013-05-30 17:02:20 -040052 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
53 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
54
55 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
56 callBuilder.startCallCreation(b.getString("CallID")).setAccountID(b.getString("AccountID"))
57 .setCallState(SipCall.state.CALL_STATE_RINGING).setCallType(SipCall.state.CALL_TYPE_INCOMING);
alision907bde72013-06-20 14:40:37 -040058 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
alision2cb99562013-05-30 17:02:20 -040059
60 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
61 try {
62 SipCall newCall = callBuilder.build();
63 toSend.putExtra("newcall", newCall);
64 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
65 callback.sendBroadcast(toSend);
66 } catch (Exception e) {
67 Log.e(TAG, e.toString());
68 }
69
70 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
71
alisioncd8fb912013-06-28 14:43:51 -040072 Log.i(TAG, "Received" + intent.getAction());
alision2cb99562013-05-30 17:02:20 -040073 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
74 String newState = b.getString("State");
alisioncd8fb912013-06-28 14:43:51 -040075 try {
76 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
77 callback.getCurrent_calls().remove(b.getString("CallID"));
78 }
79 } catch (RemoteException e) {
80 e.printStackTrace();
81 }
82
alision2cb99562013-05-30 17:02:20 -040083 if (newState.equals("INCOMING")) {
84 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
85 } else if (newState.equals("RINGING")) {
86 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
87 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -040088 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
89 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
90 } else {
91 // Check if call is in a conference
92 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
93 while (it.hasNext()) {
94 Conference tmp = it.next().getValue();
95 for (SipCall c : tmp.getParticipants()) {
96 if (c.getCallId().contentEquals(b.getString("CallID")))
97 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
98 }
99 }
100 }
101
alision2cb99562013-05-30 17:02:20 -0400102 } else if (newState.equals("HUNGUP")) {
alisioncd8fb912013-06-28 14:43:51 -0400103 Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
104 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
105 callback.getCurrent_calls().remove(b.getString("CallID"));
106 } else {
107 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
108
109 boolean found = false;
110 int i = 0;
111 while (!found && i < it.size()) {
112 Conference tmp = it.get(i);
113
114 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
115 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
116 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
117 found = true;
118 }
119
120 }
121 ++i;
122
123 }
124 }
125
126 callback.sendBroadcast(intent);
127
alision2cb99562013-05-30 17:02:20 -0400128 } else if (newState.equals("BUSY")) {
129 callback.getCurrent_calls().remove(b.getString("CallID"));
130 } else if (newState.equals("FAILURE")) {
131 callback.getCurrent_calls().remove(b.getString("CallID"));
132 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400133 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
134 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
135 } else {
136 // Check if call is in a conference
137 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400138 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400139 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400140 for (SipCall c : tmp.getParticipants()) {
141 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400142 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400143 }
144 }
145 }
alision2cb99562013-05-30 17:02:20 -0400146 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400147
alision34673e62013-06-25 14:40:07 -0400148 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
149 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
150 } else {
151 // Check if call is in a conference
152 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400153 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400154 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400155 for (SipCall c : tmp.getParticipants()) {
156 if (c.getCallId().contentEquals(b.getString("CallID")))
157 ;
158 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400159 }
160 }
161 }
alision2cb99562013-05-30 17:02:20 -0400162 } else {
163 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
164 }
165
166 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400167
alision2cb99562013-05-30 17:02:20 -0400168 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400169
alision2cb99562013-05-30 17:02:20 -0400170 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400171
alision806e18e2013-06-21 15:30:17 -0400172 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400173
alision806e18e2013-06-21 15:30:17 -0400174 Log.i(TAG, "Received" + intent.getAction());
175 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400176
alision806e18e2013-06-21 15:30:17 -0400177 try {
alisiondf1dac92013-06-27 17:35:53 -0400178 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400179 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400180 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400181 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400182 }
183 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
184 toSend.putExtra("newconf", created);
185 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
186 callback.sendBroadcast(toSend);
187 } catch (RemoteException e1) {
188 e1.printStackTrace();
189 }
190 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400191
alision806e18e2013-06-21 15:30:17 -0400192 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400193
alision806e18e2013-06-21 15:30:17 -0400194 Log.i(TAG, "Received" + intent.getAction());
195 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400196 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400197 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
198 }
199 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400200 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400201
alision806e18e2013-06-21 15:30:17 -0400202 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400203
alisiondf1dac92013-06-27 17:35:53 -0400204 ArrayList<String> all_participants;
205 try {
206 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
207 for (String participant : all_participants) {
208 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
209 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
210 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
211 .add(callback.getCurrent_calls().get(participant));
212 callback.getCurrent_calls().remove(participant);
213 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
214 callback.sendBroadcast(intent);
215 return;
216 }
217 }
218 } catch (RemoteException e) {
219 e.printStackTrace();
220 }
221
alision806e18e2013-06-21 15:30:17 -0400222 Log.i(TAG, "Received" + intent.getAction());
223 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alisiondf1dac92013-06-27 17:35:53 -0400224 callback.sendBroadcast(intent);
225
226 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
227
228 Log.i(TAG, "Received" + intent.getAction());
229
230 try {
231 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
232 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400233 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400234 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
235 } else {
236 // A call in a conference has been put on hold
237 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400238 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400239 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400240 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400241 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
242 }
243 }
244 // Re sending the same intent to the app
245 callback.sendBroadcast(intent);
246 ;
247 } catch (RemoteException e) {
248 // TODO Auto-generated catch block
249 e.printStackTrace();
250 }
251
alision2cb99562013-05-30 17:02:20 -0400252 }
253
254 }
255}