blob: 69cbed9e6f6ea08c838b5d08f12a6ec14eaaac79 [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;
alision806e18e2013-06-21 15:30:17 -040013import android.widget.Toast;
alision2cb99562013-05-30 17:02:20 -040014
alision2cb99562013-05-30 17:02:20 -040015import com.savoirfairelinux.sflphone.model.CallContact;
alision806e18e2013-06-21 15:30:17 -040016import com.savoirfairelinux.sflphone.model.Conference;
alision2cb99562013-05-30 17:02:20 -040017import com.savoirfairelinux.sflphone.model.SipCall;
18import com.savoirfairelinux.sflphone.service.CallManagerCallBack;
19import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback;
alision806e18e2013-06-21 15:30:17 -040020import com.savoirfairelinux.sflphone.service.ISipService.Stub;
alision2cb99562013-05-30 17:02:20 -040021import com.savoirfairelinux.sflphone.service.SipService;
22
alision34673e62013-06-25 14:40:07 -040023public class IncomingReceiver extends BroadcastReceiver {
24
alision58356b72013-06-03 17:13:36 -040025 static final String TAG = IncomingReceiver.class.getSimpleName();
alision2cb99562013-05-30 17:02:20 -040026
27 SipService callback;
alision806e18e2013-06-21 15:30:17 -040028 Stub mBinder;
alision34673e62013-06-25 14:40:07 -040029
30 public IncomingReceiver(SipService client, Stub bind) {
alision2cb99562013-05-30 17:02:20 -040031 callback = client;
alision806e18e2013-06-21 15:30:17 -040032 mBinder = bind;
alision2cb99562013-05-30 17:02:20 -040033 }
alision34673e62013-06-25 14:40:07 -040034
alision2cb99562013-05-30 17:02:20 -040035 @Override
36 public void onReceive(Context context, Intent intent) {
37
38 if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040039
alision2cb99562013-05-30 17:02:20 -040040 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040041 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040042
alision2cb99562013-05-30 17:02:20 -040043 } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) {
alision34673e62013-06-25 14:40:07 -040044
alision2cb99562013-05-30 17:02:20 -040045 Log.i(TAG, "Received" + intent.getAction());
alision58356b72013-06-03 17:13:36 -040046 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040047
alision2cb99562013-05-30 17:02:20 -040048 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) {
alision34673e62013-06-25 14:40:07 -040049
alision2cb99562013-05-30 17:02:20 -040050 Log.i(TAG, "Received" + intent.getAction());
51 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -040052
alision2cb99562013-05-30 17:02:20 -040053 } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
54 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newcall");
55
56 SipCall.SipCallBuilder callBuilder = SipCall.SipCallBuilder.getInstance();
57 callBuilder.startCallCreation(b.getString("CallID")).setAccountID(b.getString("AccountID"))
58 .setCallState(SipCall.state.CALL_STATE_RINGING).setCallType(SipCall.state.CALL_TYPE_INCOMING);
alision907bde72013-06-20 14:40:37 -040059 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
alision2cb99562013-05-30 17:02:20 -040060
61 Intent toSend = new Intent(CallManagerCallBack.INCOMING_CALL);
62 try {
63 SipCall newCall = callBuilder.build();
64 toSend.putExtra("newcall", newCall);
65 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
66 callback.sendBroadcast(toSend);
67 } catch (Exception e) {
68 Log.e(TAG, e.toString());
69 }
70
71 } else if (intent.getAction().contentEquals(CallManagerCallBack.CALL_STATE_CHANGED)) {
72
73 Bundle b = intent.getBundleExtra("com.savoirfairelinux.sflphone.service.newstate");
74 String newState = b.getString("State");
75 if (newState.equals("INCOMING")) {
76 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_INCOMING);
77 } else if (newState.equals("RINGING")) {
78 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
79 } else if (newState.equals("CURRENT")) {
80 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_CURRENT);
81 } else if (newState.equals("HUNGUP")) {
82 callback.getCurrent_calls().remove(b.getString("CallID"));
83 } else if (newState.equals("BUSY")) {
84 callback.getCurrent_calls().remove(b.getString("CallID"));
85 } else if (newState.equals("FAILURE")) {
86 callback.getCurrent_calls().remove(b.getString("CallID"));
87 } else if (newState.equals("HOLD")) {
alision34673e62013-06-25 14:40:07 -040088 if (callback.getCurrent_calls().get(b.getString("CallID")) != null) {
89 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_HOLD);
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_HOLD);
98 }
99 }
100 }
alision2cb99562013-05-30 17:02:20 -0400101 } else if (newState.equals("UNHOLD")) {
alision34673e62013-06-25 14:40:07 -0400102
103 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();
108 while(it.hasNext()){
109 Conference tmp = it.next().getValue();
110 for(SipCall c : tmp.getParticipants()){
111 if(c.getCallId().contentEquals(b.getString("CallID")));
112 c.setCallState(SipCall.state.CALL_STATE_CURRENT);
113 }
114 }
115 }
alision2cb99562013-05-30 17:02:20 -0400116 } else {
117 callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE);
118 }
119
120 callback.sendBroadcast(intent);
alision34673e62013-06-25 14:40:07 -0400121
alision2cb99562013-05-30 17:02:20 -0400122 } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400123
alision2cb99562013-05-30 17:02:20 -0400124 Log.i(TAG, "Received" + intent.getAction());
alision34673e62013-06-25 14:40:07 -0400125
alision806e18e2013-06-21 15:30:17 -0400126 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) {
alision34673e62013-06-25 14:40:07 -0400127
alision806e18e2013-06-21 15:30:17 -0400128 Log.i(TAG, "Received" + intent.getAction());
129 Conference created = new Conference(intent.getStringExtra("confID"));
130 ArrayList<String> all_participants;
131 try {
132 all_participants = (ArrayList<String>) mBinder.getParticipantList(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400133 for (String participant : all_participants) {
alision806e18e2013-06-21 15:30:17 -0400134 created.getParticipants().add(callback.getCurrent_calls().get(participant));
135 }
136 Intent toSend = new Intent(CallManagerCallBack.CONF_CREATED);
137 toSend.putExtra("newconf", created);
138 callback.getCurrent_confs().put(intent.getStringExtra("confID"), created);
139 callback.sendBroadcast(toSend);
140 } catch (RemoteException e1) {
141 e1.printStackTrace();
142 }
143 Log.i(TAG, "current_confs size " + callback.getCurrent_confs().size());
alision34673e62013-06-25 14:40:07 -0400144
alision806e18e2013-06-21 15:30:17 -0400145 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) {
alision34673e62013-06-25 14:40:07 -0400146
alision806e18e2013-06-21 15:30:17 -0400147 Log.i(TAG, "Received" + intent.getAction());
148 Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID"));
alision34673e62013-06-25 14:40:07 -0400149 for (int i = 0; i < toDestroy.getParticipants().size(); ++i) {
alision806e18e2013-06-21 15:30:17 -0400150 callback.getCurrent_calls().put(toDestroy.getParticipants().get(i).getCallId(), toDestroy.getParticipants().get(i));
151 }
152 callback.getCurrent_confs().remove(intent.getStringExtra("confID"));
153 Toast.makeText(callback, "Removed conf ", Toast.LENGTH_SHORT).show();
alision34673e62013-06-25 14:40:07 -0400154
alision806e18e2013-06-21 15:30:17 -0400155 } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) {
alision34673e62013-06-25 14:40:07 -0400156
alision806e18e2013-06-21 15:30:17 -0400157 Log.i(TAG, "Received" + intent.getAction());
158 callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State"));
alision34673e62013-06-25 14:40:07 -0400159 Toast.makeText(callback, "Changing conf state: " + intent.getStringExtra("State"), Toast.LENGTH_SHORT).show();
alision2cb99562013-05-30 17:02:20 -0400160 }
161
162 }
163}