blob: 64769b884886c5525d8d78fd9a538d6c30e6792d [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
Alexandre Lisionebeb3662013-09-17 16:20:54 -040015import com.savoirfairelinux.sflphone.account.CallDetailsHandler;
alision2cb99562013-05-30 17:02:20 -040016import com.savoirfairelinux.sflphone.model.CallContact;
alision806e18e2013-06-21 15:30:17 -040017import com.savoirfairelinux.sflphone.model.Conference;
alision2cb99562013-05-30 17:02:20 -040018import com.savoirfairelinux.sflphone.model.SipCall;
19import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
20import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
Alexandre Lisionebeb3662013-09-17 16:20:54 -040021import com.savoirfairelinux.sflphone.service.ServiceConstants;
alision806e18e2013-06-21 15:30:17 -040022import com.savoirfairelinux.sflphone.service.ISipService.Stub;
alision2cb99562013-05-30 17:02:20 -040023import com.savoirfairelinux.sflphone.service.SipService;
Alexandre Lisionebeb3662013-09-17 16:20:54 -040024import com.savoirfairelinux.sflphone.service.StringMap;
alision2cb99562013-05-30 17:02:20 -040025
alision34673e62013-06-25 14:40:07 -040026public class IncomingReceiver extends BroadcastReceiver {
27
alision58356b72013-06-03 17:13:36 -040028 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040029
30 SipService callback;
alision806e18e2013-06-21 15:30:17 -040031 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040032
33 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040034 callback = client;
alision806e18e2013-06-21 15:30:17 -040035 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040036 }
alision34673e62013-06-25 14:40:07 -040037
alision2cb99562013-05-30 17:02:20 -040038 @Override
39 public void onReceive(Context context, Intent intent) {
40
41 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040042
alision2cb99562013-05-30 17:02:20 -040043 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040044 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040045
alision2cb99562013-05-30 17:02:20 -040046 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_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(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040052
alision2cb99562013-05-30 17:02:20 -040053 Log.i(TAG, "Received" + intent.getAction());
54 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040055
alision2cb99562013-05-30 17:02:20 -040056 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
57 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
58
59 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
60 callBuilder.startCallCreation(b.getString("CallID")).setAccountID(b.getString("AccountID"))
61 .setCallState(SipCall.state.CALL_STATE_RINGING).setCallType(SipCall.state.CALL_TYPE_INCOMING);
alision907bde72013-06-20 14:40:37 -040062 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
alision2cb99562013-05-30 17:02:20 -040063
64 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
65 try {
66 SipCall newCall = callBuilder.build();
67 toSend.putExtra("newcall", newCall);
Alexandre Lisionebeb3662013-09-17 16:20:54 -040068 HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
69 newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
alision2cb99562013-05-30 17:02:20 -040070 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
71 callback.sendBroadcast(toSend);
72 } catch (Exception e) {
73 Log.e(TAG, e.toString());
74 }
75
76 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
77
alisioncd8fb912013-06-28 14:43:51 -040078 Log.i(TAG, "Received" + intent.getAction());
alision2cb99562013-05-30 17:02:20 -040079 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
80 String newState = b.getString("State");
alisioncd8fb912013-06-28 14:43:51 -040081 try {
82 if (callback.getCurrent_calls().get(b.getString("CallID")) != null && mBinder.isConferenceParticipant(b.getString("CallID"))) {
83 callback.getCurrent_calls().remove(b.getString("CallID"));
84 }
85 } catch (RemoteException e) {
86 e.printStackTrace();
87 }
88
alision2cb99562013-05-30 17:02:20 -040089 if (newState.equals("INCOMING")) {
90 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
91 } else if (newState.equals("RINGING")) {
92 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
93 } else if (newState.equals("CURRENT")) {
alisioncd8fb912013-06-28 14:43:51 -040094 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
95 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
96 } else {
97 // Check if call is in a conference
98 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
99 while (it.hasNext()) {
100 Conference tmp = it.next().getValue();
101 for (SipCall c : tmp.getParticipants()) {
102 if (c.getCallId().contentEquals(b.getString("CallID")))
103 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
104 }
105 }
106 }
107
alision2cb99562013-05-30 17:02:20 -0400108 } else if (newState.equals("HUNGUP")) {
Alexandre Lisiona405b6c2013-09-12 13:01:54 -0400109 // Log.e(TAG, "HUNGUP call:" + b.getString("CallID"));
alisioncd8fb912013-06-28 14:43:51 -0400110 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
111 callback.getCurrent_calls().remove(b.getString("CallID"));
112 } else {
113 ArrayList<Conference> it = new ArrayList<Conference>(callback.getCurrent_confs().values());
114
115 boolean found = false;
116 int i = 0;
117 while (!found && i < it.size()) {
118 Conference tmp = it.get(i);
119
120 for (int j = 0; j < tmp.getParticipants().size(); ++j) {
121 if (tmp.getParticipants().get(j).getCallId().contentEquals(b.getString("CallID"))) {
122 callback.getCurrent_confs().get(tmp.getId()).getParticipants().remove(tmp.getParticipants().get(j));
123 found = true;
124 }
125
126 }
127 ++i;
128
129 }
130 }
Alexandre Lisionebeb3662013-09-17 16:20:54 -0400131
alisioncd8fb912013-06-28 14:43:51 -0400132 callback.sendBroadcast(intent);
133
alision2cb99562013-05-30 17:02:20 -0400134 } else if (newState.equals("BUSY")) {
135 callback.getCurrent_calls().remove(b.getString("CallID"));
136 } else if (newState.equals("FAILURE")) {
137 callback.getCurrent_calls().remove(b.getString("CallID"));
138 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -0400139 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
140 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
141 } else {
142 // Check if call is in a conference
143 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400144 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400145 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400146 for (SipCall c : tmp.getParticipants()) {
147 if (c.getCallId().contentEquals(b.getString("CallID")))
alisioncd8fb912013-06-28 14:43:51 -0400148 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -0400149 }
150 }
151 }
alision2cb99562013-05-30 17:02:20 -0400152 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400153
alision34673e62013-06-25 14:40:07 -0400154 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
155 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
156 } else {
157 // Check if call is in a conference
158 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400159 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400160 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400161 for (SipCall c : tmp.getParticipants()) {
162 if (c.getCallId().contentEquals(b.getString("CallID")))
163 ;
164 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400165 }
166 }
167 }
alision2cb99562013-05-30 17:02:20 -0400168 } else {
169 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
170 }
171
172 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400173
alision2cb99562013-05-30 17:02:20 -0400174 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400175
alision2cb99562013-05-30 17:02:20 -0400176 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400177
alision806e18e2013-06-21 15:30:17 -0400178 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400179
alision806e18e2013-06-21 15:30:17 -0400180 Log.i(TAG, "Received" + intent.getAction());
181 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400182
alision806e18e2013-06-21 15:30:17 -0400183 try {
alisiondf1dac92013-06-27 17:35:53 -0400184 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400185 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400186 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400187 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400188 }
189 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
190 toSend.putExtra("newconf", created);
191 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
192 callback.sendBroadcast(toSend);
193 } catch (RemoteException e1) {
194 e1.printStackTrace();
195 }
196 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400197
alision806e18e2013-06-21 15:30:17 -0400198 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400199
alision806e18e2013-06-21 15:30:17 -0400200 Log.i(TAG, "Received" + intent.getAction());
201 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400202 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400203 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
204 }
205 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400206 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400207
alision806e18e2013-06-21 15:30:17 -0400208 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400209
alisiondf1dac92013-06-27 17:35:53 -0400210 ArrayList<String> all_participants;
211 try {
212 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
213 for (String participant : all_participants) {
214 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
215 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
216 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
217 .add(callback.getCurrent_calls().get(participant));
218 callback.getCurrent_calls().remove(participant);
219 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
220 callback.sendBroadcast(intent);
221 return;
222 }
223 }
224 } catch (RemoteException e) {
225 e.printStackTrace();
226 }
227
alision806e18e2013-06-21 15:30:17 -0400228 Log.i(TAG, "Received" + intent.getAction());
229 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alisiondf1dac92013-06-27 17:35:53 -0400230 callback.sendBroadcast(intent);
231
232 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
233
234 Log.i(TAG, "Received" + intent.getAction());
235
236 try {
237 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
238 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
alisioncd8fb912013-06-28 14:43:51 -0400239 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
alisiondf1dac92013-06-27 17:35:53 -0400240 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
241 } else {
242 // A call in a conference has been put on hold
243 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
alisioncd8fb912013-06-28 14:43:51 -0400244 while (it.hasNext()) {
alisiondf1dac92013-06-27 17:35:53 -0400245 Conference c = it.next();
alisioncd8fb912013-06-28 14:43:51 -0400246 if (c.getCall(intent.getStringExtra("id")) != null)
alisiondf1dac92013-06-27 17:35:53 -0400247 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
248 }
249 }
250 // Re sending the same intent to the app
251 callback.sendBroadcast(intent);
252 ;
253 } catch (RemoteException e) {
254 // TODO Auto-generated catch block
255 e.printStackTrace();
256 }
257
alision2cb99562013-05-30 17:02:20 -0400258 }
259
260 }
261}