alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 1 | package com.savoirfairelinux.sflphone.adapters; |
| 2 | |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 3 | import java.util.HashMap; |
| 4 | import java.util.Iterator; |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 5 | import java.util.List; |
| 6 | import java.util.concurrent.ExecutorService; |
| 7 | import java.util.concurrent.Executors; |
| 8 | |
| 9 | import android.content.Context; |
| 10 | import android.view.LayoutInflater; |
| 11 | import android.view.View; |
| 12 | import android.view.ViewGroup; |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 13 | import android.widget.BaseAdapter; |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 14 | import android.widget.ImageView; |
| 15 | import android.widget.TextView; |
| 16 | |
| 17 | import com.savoirfairelinux.sflphone.R; |
| 18 | import com.savoirfairelinux.sflphone.model.SipCall; |
| 19 | |
| 20 | /** |
| 21 | * A CursorAdapter that creates and update call elements using corresponding contact infos. TODO: handle contact list separatly to allow showing |
| 22 | * synchronized contacts on Call cards with multiple contacts etc. |
| 23 | */ |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 24 | public class CallElementAdapter extends BaseAdapter { |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 25 | private ExecutorService infos_fetcher = Executors.newCachedThreadPool(); |
| 26 | private Context mContext; |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 27 | private final HashMap<String, SipCall> mCallList; |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 28 | private static final String CURRENT_STATE_LABEL = " CURRENT STATE: "; |
| 29 | |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 30 | public CallElementAdapter(Context context, List<SipCall> callList) { |
| 31 | super(); |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 32 | mContext = context; |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 33 | mCallList = new HashMap<String, SipCall>(); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 34 | for (SipCall c : callList) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 35 | mCallList.put(c.getCallId(), c); |
| 36 | } |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 37 | |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | @Override |
| 41 | public View getView(int position, View convertView, ViewGroup parent) { |
| 42 | View rowView = convertView; |
| 43 | CallElementView entryView = null; |
| 44 | |
| 45 | if (rowView == null) { |
| 46 | // Get a new instance of the row layout view |
| 47 | LayoutInflater inflater = LayoutInflater.from(mContext); |
| 48 | rowView = inflater.inflate(R.layout.item_contact, null); |
| 49 | |
| 50 | // Hold the view objects in an object |
| 51 | // so they don't need to be re-fetched |
| 52 | entryView = new CallElementView(); |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 53 | entryView.photo = (ImageView) rowView.findViewById(R.id.photo); |
| 54 | entryView.displayName = (TextView) rowView.findViewById(R.id.display_name); |
| 55 | entryView.phones = (TextView) rowView.findViewById(R.id.phones); |
| 56 | entryView.state = (TextView) rowView.findViewById(R.id.callstate); |
| 57 | |
| 58 | // Cache the view obects in the tag |
| 59 | // so they can be re-accessed later |
| 60 | rowView.setTag(entryView); |
| 61 | } else { |
| 62 | entryView = (CallElementView) rowView.getTag(); |
| 63 | } |
| 64 | |
| 65 | // Transfer the stock data from the data object |
| 66 | // to the view objects |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 67 | |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 68 | SipCall call = (SipCall) mCallList.values().toArray()[position]; |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 69 | entryView.displayName.setText(call.getDisplayName()); |
| 70 | entryView.phones.setText(call.getPhone()); |
| 71 | entryView.state.setText(CURRENT_STATE_LABEL + call.getCallStateString()); |
| 72 | |
| 73 | return rowView; |
| 74 | } |
| 75 | |
| 76 | /********************* |
| 77 | * ViewHolder Pattern |
| 78 | *********************/ |
| 79 | public class CallElementView { |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 80 | protected ImageView photo; |
| 81 | protected TextView displayName; |
| 82 | protected TextView phones; |
| 83 | public TextView state; |
| 84 | } |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 85 | |
| 86 | @Override |
| 87 | public int getCount() { |
| 88 | return mCallList.size(); |
| 89 | } |
| 90 | |
| 91 | @Override |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 92 | public SipCall getItem(int pos) { |
| 93 | return (SipCall) mCallList.values().toArray()[pos]; |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 94 | } |
| 95 | |
| 96 | @Override |
| 97 | public long getItemId(int arg0) { |
| 98 | // TODO Auto-generated method stub |
| 99 | return 0; |
| 100 | } |
| 101 | |
| 102 | public void add(SipCall c) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 103 | mCallList.put(c.getCallId(), c); |
| 104 | notifyDataSetChanged(); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 105 | |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 106 | } |
| 107 | |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 108 | public void update(String id, String newState) { |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 109 | if (mCallList.get(id) == null) { |
| 110 | return; |
| 111 | } |
| 112 | if (newState.equals("INCOMING")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 113 | mCallList.get(id).setCallState(SipCall.CALL_STATE_INCOMING); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 114 | } else if (newState.equals("RINGING")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 115 | mCallList.get(id).setCallState(SipCall.CALL_STATE_RINGING); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 116 | } else if (newState.equals("CURRENT")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 117 | mCallList.get(id).setCallState(SipCall.CALL_STATE_CURRENT); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 118 | } else if (newState.equals("HUNGUP")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 119 | mCallList.get(id).setCallState(SipCall.CALL_STATE_HUNGUP); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 120 | mCallList.remove(id); |
| 121 | } else if (newState.equals("BUSY")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 122 | mCallList.get(id).setCallState(SipCall.CALL_STATE_BUSY); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 123 | mCallList.remove(id); |
| 124 | } else if (newState.equals("FAILURE")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 125 | mCallList.get(id).setCallState(SipCall.CALL_STATE_FAILURE); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 126 | mCallList.remove(id); |
| 127 | } else if (newState.equals("HOLD")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 128 | mCallList.get(id).setCallState(SipCall.CALL_STATE_HOLD); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 129 | } else if (newState.equals("UNHOLD")) { |
alision | 371b77e | 2013-04-23 14:51:26 -0400 | [diff] [blame] | 130 | mCallList.get(id).setCallState(SipCall.CALL_STATE_CURRENT); |
| 131 | } else { |
| 132 | mCallList.get(id).setCallState(SipCall.CALL_STATE_NONE); |
| 133 | } |
| 134 | notifyDataSetChanged(); |
alision | 43a9b36 | 2013-05-01 16:30:15 -0400 | [diff] [blame] | 135 | |
| 136 | } |
| 137 | |
| 138 | public void clear() { |
| 139 | mCallList.clear(); |
| 140 | notifyDataSetChanged(); |
alision | 5f89963 | 2013-04-22 17:26:56 -0400 | [diff] [blame] | 141 | } |
| 142 | |
alision | a432515 | 2013-04-19 11:10:03 -0400 | [diff] [blame] | 143 | } |