blob: 4fab834701e581c14680b101136ff55baf3814fd [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
72 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
73 String newState = b.getString("State");
74 if (newState.equals("INCOMING")) {
75 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
76 } else if (newState.equals("RINGING")) {
77 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
78 } else if (newState.equals("CURRENT")) {
79 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
80 } else if (newState.equals("HUNGUP")) {
81 callback.getCurrent_calls().remove(b.getString("CallID"));
82 } else if (newState.equals("BUSY")) {
83 callback.getCurrent_calls().remove(b.getString("CallID"));
84 } else if (newState.equals("FAILURE")) {
85 callback.getCurrent_calls().remove(b.getString("CallID"));
86 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -040087 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
88 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
89 } else {
90 // Check if call is in a conference
91 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -040092 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -040093 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -040094 for (SipCall c : tmp.getParticipants()) {
95 if (c.getCallId().contentEquals(b.getString("CallID")))
96 ;
97 c.setCallState(SipCall.state.CALL_STATE_HOLD);
alision34673e62013-06-25 14:40:07 -040098 }
99 }
100 }
alision2cb99562013-05-30 17:02:20 -0400101 } else if (newState.equals("UNHOLD")) {
alisiondf1dac92013-06-27 17:35:53 -0400102
alision34673e62013-06-25 14:40:07 -0400103 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
104 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
105 } else {
106 // Check if call is in a conference
107 Iterator<Entry<String, Conference>> it = callback.getCurrent_confs().entrySet().iterator();
alisiondf1dac92013-06-27 17:35:53 -0400108 while (it.hasNext()) {
alision34673e62013-06-25 14:40:07 -0400109 Conference tmp = it.next().getValue();
alisiondf1dac92013-06-27 17:35:53 -0400110 for (SipCall c : tmp.getParticipants()) {
111 if (c.getCallId().contentEquals(b.getString("CallID")))
112 ;
113 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
alision34673e62013-06-25 14:40:07 -0400114 }
115 }
116 }
alision2cb99562013-05-30 17:02:20 -0400117 } else {
118 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
119 }
120
121 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400122
alision2cb99562013-05-30 17:02:20 -0400123 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400124
alision2cb99562013-05-30 17:02:20 -0400125 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400126
alision806e18e2013-06-21 15:30:17 -0400127 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400128
alision806e18e2013-06-21 15:30:17 -0400129 Log.i(TAG, "Received" + intent.getAction());
130 Conference created = new Conference(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400131
alision806e18e2013-06-21 15:30:17 -0400132 try {
alisiondf1dac92013-06-27 17:35:53 -0400133 ArrayList<String> all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400134 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400135 created.getParticipants().add(callback.getCurrent_calls().get(participant));
alisiondf1dac92013-06-27 17:35:53 -0400136 callback.getCurrent_calls().remove(participant);
alision806e18e2013-06-21 15:30:17 -0400137 }
138 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
139 toSend.putExtra("newconf", created);
140 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
141 callback.sendBroadcast(toSend);
142 } catch (RemoteException e1) {
143 e1.printStackTrace();
144 }
145 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400146
alision806e18e2013-06-21 15:30:17 -0400147 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400148
alision806e18e2013-06-21 15:30:17 -0400149 Log.i(TAG, "Received" + intent.getAction());
150 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400151 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400152 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
153 }
154 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
alisiondf1dac92013-06-27 17:35:53 -0400155 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400156
alision806e18e2013-06-21 15:30:17 -0400157 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400158
alisiondf1dac92013-06-27 17:35:53 -0400159 ArrayList<String> all_participants;
160 try {
161 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
162 for (String participant : all_participants) {
163 if (callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants().size() < all_participants.size()
164 && callback.getCurrent_calls().get(participant) != null) { // We need to add the new participant to the conf
165 callback.getCurrent_confs().get(intent.getStringExtra("confID")).getParticipants()
166 .add(callback.getCurrent_calls().get(participant));
167 callback.getCurrent_calls().remove(participant);
168 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
169 callback.sendBroadcast(intent);
170 return;
171 }
172 }
173 } catch (RemoteException e) {
174 e.printStackTrace();
175 }
176
alision806e18e2013-06-21 15:30:17 -0400177 Log.i(TAG, "Received" + intent.getAction());
178 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alisiondf1dac92013-06-27 17:35:53 -0400179 callback.sendBroadcast(intent);
180
181 } else if (intent.getAction().contentEquals(CallManagerCallBack.RECORD_STATE_CHANGED)) {
182
183 Log.i(TAG, "Received" + intent.getAction());
184
185 try {
186 if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
187 callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
188 } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null){
189 callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
190 } else {
191 // A call in a conference has been put on hold
192 Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
193 while(it.hasNext()){
194 Conference c = it.next();
195 if(c.getCall(intent.getStringExtra("id")) != null)
196 c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
197 }
198 }
199 // Re sending the same intent to the app
200 callback.sendBroadcast(intent);
201 ;
202 } catch (RemoteException e) {
203 // TODO Auto-generated catch block
204 e.printStackTrace();
205 }
206
alision2cb99562013-05-30 17:02:20 -0400207 }
208
209 }
210}