alision | cc7bb42 | 2013-06-06 15:31:39 -0400 | [diff] [blame] | 1 | package com.savoirfairelinux.sflphone.receivers; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 2 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 3 | import java.util.ArrayList; |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 4 | import java.util.Iterator; |
| 5 | import java.util.Map.Entry; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 6 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 7 | import android.content.BroadcastReceiver; |
| 8 | import android.content.Context; |
| 9 | import android.content.Intent; |
| 10 | import android.os.Bundle; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 11 | import android.os.RemoteException; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 12 | import android.util.Log; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 13 | import android.widget.Toast; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 14 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 15 | import com.savoirfairelinux.sflphone.model.CallContact; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 16 | import com.savoirfairelinux.sflphone.model.Conference; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 17 | import com.savoirfairelinux.sflphone.model.SipCall; |
| 18 | import com.savoirfairelinux.sflphone.service.CallManagerCallBack; |
| 19 | import com.savoirfairelinux.sflphone.service.ConfigurationManagerCallback; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 20 | import com.savoirfairelinux.sflphone.service.ISipService.Stub; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 21 | import com.savoirfairelinux.sflphone.service.SipService; |
| 22 | |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 23 | public class IncomingReceiver extends BroadcastReceiver { |
| 24 | |
alision | 58356b7 | 2013-06-03 17:13:36 -0400 | [diff] [blame] | 25 | static final String TAG = IncomingReceiver.class.getSimpleName(); |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 26 | |
| 27 | SipService callback; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 28 | Stub mBinder; |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 29 | |
| 30 | public IncomingReceiver(SipService client, Stub bind) { |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 31 | callback = client; |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 32 | mBinder = bind; |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 33 | } |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 34 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 35 | @Override |
| 36 | public void onReceive(Context context, Intent intent) { |
| 37 | |
| 38 | if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 39 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 40 | Log.i(TAG, "Received" + intent.getAction()); |
alision | 58356b7 | 2013-06-03 17:13:36 -0400 | [diff] [blame] | 41 | callback.sendBroadcast(intent); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 42 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 43 | } else if (intent.getAction().contentEquals(ConfigurationManagerCallback.ACCOUNTS_CHANGED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 44 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 45 | Log.i(TAG, "Received" + intent.getAction()); |
alision | 58356b7 | 2013-06-03 17:13:36 -0400 | [diff] [blame] | 46 | callback.sendBroadcast(intent); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 47 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 48 | } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_TEXT)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 49 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 50 | Log.i(TAG, "Received" + intent.getAction()); |
| 51 | callback.sendBroadcast(intent); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 52 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 53 | } 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); |
alision | 907bde7 | 2013-06-20 14:40:37 -0400 | [diff] [blame] | 59 | callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From"))); |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 60 | |
| 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")) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 88 | 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 | } |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 101 | } else if (newState.equals("UNHOLD")) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 102 | |
| 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 | } |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 116 | } else { |
| 117 | callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_NONE); |
| 118 | } |
| 119 | |
| 120 | callback.sendBroadcast(intent); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 121 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 122 | } else if (intent.getAction().contentEquals(CallManagerCallBack.NEW_CALL_CREATED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 123 | |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 124 | Log.i(TAG, "Received" + intent.getAction()); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 125 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 126 | } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CREATED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 127 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 128 | 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")); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 133 | for (String participant : all_participants) { |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 134 | 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()); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 144 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 145 | } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_REMOVED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 146 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 147 | Log.i(TAG, "Received" + intent.getAction()); |
| 148 | Conference toDestroy = callback.getCurrent_confs().get(intent.getStringExtra("confID")); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 149 | for (int i = 0; i < toDestroy.getParticipants().size(); ++i) { |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 150 | 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(); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 154 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 155 | } else if (intent.getAction().contentEquals(CallManagerCallBack.CONF_CHANGED)) { |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 156 | |
alision | 806e18e | 2013-06-21 15:30:17 -0400 | [diff] [blame] | 157 | Log.i(TAG, "Received" + intent.getAction()); |
| 158 | callback.getCurrent_confs().get(intent.getStringExtra("confID")).setState(intent.getStringExtra("State")); |
alision | 34673e6 | 2013-06-25 14:40:07 -0400 | [diff] [blame] | 159 | Toast.makeText(callback, "Changing conf state: " + intent.getStringExtra("State"), Toast.LENGTH_SHORT).show(); |
alision | 2cb9956 | 2013-05-30 17:02:20 -0400 | [diff] [blame] | 160 | } |
| 161 | |
| 162 | } |
| 163 | } |