blob: a90fe22a92117de4ee0803898af59dccadca94a1 [file] [log] [blame]
alisionb1763882013-06-18 17:30:51 -04001package com.savoirfairelinux.sflphone.fragments;
2
3import java.io.IOException;
4import java.util.ArrayList;
5import java.util.List;
6
Adrien Béraud97512842013-09-19 13:37:19 +10007import android.app.Activity;
alisionb1763882013-06-18 17:30:51 -04008import android.app.AlertDialog;
9import android.app.Dialog;
10import android.app.DialogFragment;
11import android.app.LoaderManager;
12import android.content.Context;
13import android.content.DialogInterface;
alision1005ba12013-06-19 13:52:44 -040014import android.content.DialogInterface.OnShowListener;
alisionb1763882013-06-18 17:30:51 -040015import android.content.Intent;
16import android.content.Loader;
17import android.location.Address;
18import android.location.Geocoder;
19import android.net.Uri;
20import android.os.Bundle;
21import android.provider.ContactsContract.Contacts;
22import android.view.LayoutInflater;
23import android.view.View;
24import android.view.ViewGroup;
25import android.widget.AdapterView;
26import android.widget.AdapterView.OnItemClickListener;
27import android.widget.ArrayAdapter;
28import android.widget.AutoCompleteTextView;
29import android.widget.BaseAdapter;
alision1005ba12013-06-19 13:52:44 -040030import android.widget.Button;
alisionb1763882013-06-18 17:30:51 -040031import android.widget.Filter;
32import android.widget.Filterable;
33import android.widget.ListView;
34import android.widget.TextView;
alision1005ba12013-06-19 13:52:44 -040035import android.widget.Toast;
alisionb1763882013-06-18 17:30:51 -040036
37import com.savoirfairelinux.sflphone.R;
38import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
alisiondf1dac92013-06-27 17:35:53 -040039import com.savoirfairelinux.sflphone.model.Conference;
alisionb1763882013-06-18 17:30:51 -040040import com.savoirfairelinux.sflphone.model.SipCall;
41
alision1005ba12013-06-19 13:52:44 -040042public class TransferDFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<Bundle> {
Adrien Béraud97512842013-09-19 13:37:19 +100043 public static final int RESULT_TRANSFER_CONF = Activity.RESULT_FIRST_USER + 1;
44 public static final int RESULT_TRANSFER_NUMBER = Activity.RESULT_FIRST_USER + 2;
alisionb1763882013-06-18 17:30:51 -040045
46 private AutoCompleteTextView mEditText;
47 private AutoCompleteAdapter autoCompleteAdapter;
48 SimpleCallListAdapter mAdapter;
alision1005ba12013-06-19 13:52:44 -040049
alisionb1763882013-06-18 17:30:51 -040050 /**
51 * Create a new instance of CallActionsDFragment
52 */
alision1005ba12013-06-19 13:52:44 -040053 static TransferDFragment newInstance(int num) {
54 TransferDFragment f = new TransferDFragment();
alisionb1763882013-06-18 17:30:51 -040055 return f;
56 }
57
58 @Override
59 public void onCreate(Bundle savedInstanceState) {
60 super.onCreate(savedInstanceState);
61
62 // Pick a style based on the num.
63 int style = DialogFragment.STYLE_NORMAL, theme = 0;
64 setStyle(style, theme);
65 }
alisionb1763882013-06-18 17:30:51 -040066
67 @Override
alision1005ba12013-06-19 13:52:44 -040068 public Dialog onCreateDialog(Bundle savedInstanceState) {
69 View rootView = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_transfer, null);
70
alisiondf1dac92013-06-27 17:35:53 -040071 ArrayList<Conference> calls = getArguments().getParcelableArrayList("calls");
Alexandre Lision2b237922013-09-09 16:23:02 -040072 final SipCall call_selected = getArguments().getParcelable("call_selected");
alision1005ba12013-06-19 13:52:44 -040073
alisionb1763882013-06-18 17:30:51 -040074 mAdapter = new SimpleCallListAdapter(getActivity(), calls);
75 ListView list = (ListView) rootView.findViewById(R.id.concurrent_calls);
76 list.setAdapter(mAdapter);
77 list.setOnItemClickListener(new OnItemClickListener() {
78
79 @Override
80 public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
alision1005ba12013-06-19 13:52:44 -040081
alisionb1763882013-06-18 17:30:51 -040082 Intent in = new Intent();
alision1005ba12013-06-19 13:52:44 -040083 in.putExtra("target", mAdapter.getItem(pos));
84 in.putExtra("transfer", call_selected);
Adrien Béraud97512842013-09-19 13:37:19 +100085
Adrien Béraude78d06f2013-09-19 13:33:44 +100086 getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_TRANSFER_CONF, in);
alisionb1763882013-06-18 17:30:51 -040087 dismiss();
88 }
89 });
90 list.setEmptyView(rootView.findViewById(R.id.empty_view));
alision1005ba12013-06-19 13:52:44 -040091
alisionb1763882013-06-18 17:30:51 -040092 mEditText = (AutoCompleteTextView) rootView.findViewById(R.id.external_number);
93 mEditText.setAdapter(autoCompleteAdapter);
alisionb1763882013-06-18 17:30:51 -040094
alision1005ba12013-06-19 13:52:44 -040095 final AlertDialog a = new AlertDialog.Builder(getActivity()).setView(rootView)
Alexandre Lision2b237922013-09-09 16:23:02 -040096 .setTitle("Transfer " + call_selected.getContact().getmDisplayName())
alision1005ba12013-06-19 13:52:44 -040097 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
Adrien Béraude78d06f2013-09-19 13:33:44 +100098 @Override
alision1005ba12013-06-19 13:52:44 -040099 public void onClick(DialogInterface dialog, int whichButton) {
alisionb1763882013-06-18 17:30:51 -0400100
Adrien Béraude78d06f2013-09-19 13:33:44 +1000101 }
102 }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
103 @Override
104 public void onClick(DialogInterface dialog, int whichButton) {
Adrien Béraud97512842013-09-19 13:37:19 +1000105 getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, new Intent());
alision1005ba12013-06-19 13:52:44 -0400106 dismiss();
107 }
108 }).create();
109
110 a.setOnShowListener(new OnShowListener() {
111
112 @Override
113 public void onShow(DialogInterface dialog) {
114 Button b = a.getButton(AlertDialog.BUTTON_POSITIVE);
115 b.setOnClickListener(new View.OnClickListener() {
116
117 @Override
118 public void onClick(View view) {
119 if(mEditText.getText().length() == 0){
120 Toast.makeText(getActivity(), "Enter a number to transfer this call", Toast.LENGTH_SHORT).show();
121 } else {
122 Intent in = new Intent();
123 in.putExtra("to_number", mEditText.getText().toString());
124 in.putExtra("transfer", call_selected);
Adrien Béraude78d06f2013-09-19 13:33:44 +1000125 getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_TRANSFER_NUMBER, in);
alision1005ba12013-06-19 13:52:44 -0400126 dismiss();
127 }
128 }
129 });
130
131 }
132 });
133 return a;
alisionb1763882013-06-18 17:30:51 -0400134 }
alision1005ba12013-06-19 13:52:44 -0400135
alisionb1763882013-06-18 17:30:51 -0400136 @Override
137 public Loader<Bundle> onCreateLoader(int id, Bundle args) {
138 Uri baseUri;
139
140 if (args != null) {
141 baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(args.getString("filter")));
142 } else {
143 baseUri = Contacts.CONTENT_URI;
144 }
145 ContactsLoader l = new ContactsLoader(getActivity(), baseUri);
146 l.forceLoad();
147 return l;
148 }
149
150 @Override
151 public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
152
Alexandre Lision6e8931e2013-09-19 16:49:34 -0400153// ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
alisionb1763882013-06-18 17:30:51 -0400154
alisionb1763882013-06-18 17:30:51 -0400155 }
156
157 @Override
158 public void onLoaderReset(Loader<Bundle> loader) {
159 // Thi is called when the last Cursor provided to onLoadFinished
160 // mListAdapter.swapCursor(null);
161 }
alisionb1763882013-06-18 17:30:51 -0400162
163 private class AutoCompleteAdapter extends ArrayAdapter<Address> implements Filterable {
alision1005ba12013-06-19 13:52:44 -0400164
alisionb1763882013-06-18 17:30:51 -0400165 private LayoutInflater mInflater;
166 private Geocoder mGeocoder;
Alexandre Lision6e8931e2013-09-19 16:49:34 -0400167// private StringBuilder mSb = new StringBuilder();
alision1005ba12013-06-19 13:52:44 -0400168
alisionb1763882013-06-18 17:30:51 -0400169 public AutoCompleteAdapter(final Context context) {
170 super(context, -1);
171 mInflater = LayoutInflater.from(context);
172 mGeocoder = new Geocoder(context);
173 }
alision1005ba12013-06-19 13:52:44 -0400174
alisionb1763882013-06-18 17:30:51 -0400175 @Override
176 public View getView(final int position, final View convertView, final ViewGroup parent) {
177 final TextView tv;
178 if (convertView != null) {
179 tv = (TextView) convertView;
180 } else {
181 tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
182 }
alision1005ba12013-06-19 13:52:44 -0400183
alisionb1763882013-06-18 17:30:51 -0400184 return tv;
185 }
alisionb1763882013-06-18 17:30:51 -0400186
alisionb1763882013-06-18 17:30:51 -0400187 @Override
188 public Filter getFilter() {
189 Filter myFilter = new Filter() {
190 @Override
191 protected FilterResults performFiltering(final CharSequence constraint) {
192 List<Address> addressList = null;
193 if (constraint != null) {
194 try {
195 addressList = mGeocoder.getFromLocationName((String) constraint, 5);
196 } catch (IOException e) {
197 }
198 }
199 if (addressList == null) {
200 addressList = new ArrayList<Address>();
201 }
alision1005ba12013-06-19 13:52:44 -0400202
alisionb1763882013-06-18 17:30:51 -0400203 final FilterResults filterResults = new FilterResults();
204 filterResults.values = addressList;
205 filterResults.count = addressList.size();
alision1005ba12013-06-19 13:52:44 -0400206
alisionb1763882013-06-18 17:30:51 -0400207 return filterResults;
208 }
alision1005ba12013-06-19 13:52:44 -0400209
alisionb1763882013-06-18 17:30:51 -0400210 @SuppressWarnings("unchecked")
211 @Override
212 protected void publishResults(final CharSequence contraint, final FilterResults results) {
213 clear();
214 for (Address address : (List<Address>) results.values) {
215 add(address);
216 }
217 if (results.count > 0) {
218 notifyDataSetChanged();
219 } else {
220 notifyDataSetInvalidated();
221 }
222 }
alision1005ba12013-06-19 13:52:44 -0400223
alisionb1763882013-06-18 17:30:51 -0400224 @Override
225 public CharSequence convertResultToString(final Object resultValue) {
226 return resultValue == null ? "" : ((Address) resultValue).getAddressLine(0);
227 }
228 };
229 return myFilter;
230 }
231 }
alision1005ba12013-06-19 13:52:44 -0400232
233 private class SimpleCallListAdapter extends BaseAdapter {
234
alisionb1763882013-06-18 17:30:51 -0400235 private LayoutInflater mInflater;
alisiondf1dac92013-06-27 17:35:53 -0400236 ArrayList<Conference> calls;
alision1005ba12013-06-19 13:52:44 -0400237
alisiondf1dac92013-06-27 17:35:53 -0400238 public SimpleCallListAdapter(final Context context, ArrayList<Conference> calls2) {
alisionb1763882013-06-18 17:30:51 -0400239 super();
240 mInflater = LayoutInflater.from(context);
241 calls = calls2;
242 }
alision1005ba12013-06-19 13:52:44 -0400243
alisionb1763882013-06-18 17:30:51 -0400244 @Override
245 public View getView(final int position, final View convertView, final ViewGroup parent) {
246 final TextView tv;
247 if (convertView != null) {
248 tv = (TextView) convertView;
249 } else {
250 tv = (TextView) mInflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);
251 }
alision1005ba12013-06-19 13:52:44 -0400252
alisiondf1dac92013-06-27 17:35:53 -0400253 tv.setText(calls.get(position).getParticipants().get(0).getContact().getmDisplayName());
alisionb1763882013-06-18 17:30:51 -0400254 return tv;
255 }
256
257 @Override
258 public int getCount() {
259 return calls.size();
260 }
261
262 @Override
alisiondf1dac92013-06-27 17:35:53 -0400263 public Conference getItem(int pos) {
alisionb1763882013-06-18 17:30:51 -0400264 return calls.get(pos);
265 }
266
267 @Override
268 public long getItemId(int position) {
269 return 0;
270 }
271 }
272}