blob: 819abb0cec014ba24058ebfb47d4d1c1f856742d [file] [log] [blame]
Alexandre Savarda04c5202012-09-18 17:19:53 -04001/*
alisiond295ec22013-05-17 10:12:13 -04002 * Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
Alexandre Savarda04c5202012-09-18 17:19:53 -04003 *
Alexandre Savard23240c12012-09-19 18:23:44 -04004 * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
alisiond295ec22013-05-17 10:12:13 -04005 * Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Alexandre Savarda04c5202012-09-18 17:19:53 -04006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 *
21 * Additional permission under GNU GPL version 3 section 7:
22 *
23 * If you modify this program, or any covered work, by linking or
24 * combining it with the OpenSSL project's OpenSSL library (or a
25 * modified version of that library), containing parts covered by the
26 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
27 * grants you additional permission to convey the resulting work.
28 * Corresponding Source for a non-source form of such a combination
29 * shall include the source code for the parts of OpenSSL used as well
30 * as that of the covered work.
31 */
alisionf76de3b2013-04-16 15:35:22 -040032package com.savoirfairelinux.sflphone.fragments;
33
alisionf76de3b2013-04-16 15:35:22 -040034import java.util.ArrayList;
Alexandre Savarda04c5202012-09-18 17:19:53 -040035
Emeric Vigier1f1ced32012-11-02 16:56:32 -040036import android.app.Activity;
alisiond295ec22013-05-17 10:12:13 -040037import android.app.Fragment;
Alexandre Savard6668cf82012-09-19 10:59:21 -040038import android.app.LoaderManager;
alisiond295ec22013-05-17 10:12:13 -040039import android.content.Intent;
Alexandre Savard6668cf82012-09-19 10:59:21 -040040import android.content.Loader;
Alexandre Savard6668cf82012-09-19 10:59:21 -040041import android.net.Uri;
Alexandre Savarda04c5202012-09-18 17:19:53 -040042import android.os.Bundle;
Alexandre Savard6668cf82012-09-19 10:59:21 -040043import android.provider.ContactsContract.Contacts;
Alexandre Savard6668cf82012-09-19 10:59:21 -040044import android.text.TextUtils;
alisionf76de3b2013-04-16 15:35:22 -040045import android.util.Log;
alisiond295ec22013-05-17 10:12:13 -040046import android.view.DragEvent;
Alexandre Savarda04c5202012-09-18 17:19:53 -040047import android.view.LayoutInflater;
Alexandre Savard6668cf82012-09-19 10:59:21 -040048import android.view.Menu;
Alexandre Savard6668cf82012-09-19 10:59:21 -040049import android.view.MenuInflater;
alisionf76de3b2013-04-16 15:35:22 -040050import android.view.MenuItem;
Alexandre Savarda04c5202012-09-18 17:19:53 -040051import android.view.View;
alisiond295ec22013-05-17 10:12:13 -040052import android.view.View.DragShadowBuilder;
alision84813a12013-05-27 17:40:39 -040053import android.view.View.OnClickListener;
alisiond295ec22013-05-17 10:12:13 -040054import android.view.View.OnDragListener;
Alexandre Savarda04c5202012-09-18 17:19:53 -040055import android.view.ViewGroup;
Alexandre Savard31433992012-09-20 15:19:49 -040056import android.widget.AdapterView;
alisiond295ec22013-05-17 10:12:13 -040057import android.widget.AdapterView.OnItemClickListener;
Alexandre Savard31433992012-09-20 15:19:49 -040058import android.widget.AdapterView.OnItemLongClickListener;
alision84813a12013-05-27 17:40:39 -040059import android.widget.ImageButton;
alisionf76de3b2013-04-16 15:35:22 -040060import android.widget.ListView;
alision84813a12013-05-27 17:40:39 -040061import android.widget.RelativeLayout;
alisionf76de3b2013-04-16 15:35:22 -040062import android.widget.SearchView;
Alexandre Savard6668cf82012-09-19 10:59:21 -040063import android.widget.SearchView.OnQueryTextListener;
alision84813a12013-05-27 17:40:39 -040064import android.widget.ViewSwitcher;
Alexandre Savarda04c5202012-09-18 17:19:53 -040065
66import com.savoirfairelinux.sflphone.R;
alisiond295ec22013-05-17 10:12:13 -040067import com.savoirfairelinux.sflphone.adapters.ContactsAdapter;
68import com.savoirfairelinux.sflphone.adapters.StarredContactsAdapter;
69import com.savoirfairelinux.sflphone.client.CallActivity;
alision84813a12013-05-27 17:40:39 -040070import com.savoirfairelinux.sflphone.fragments.HistoryFragment.Callbacks;
alisiond295ec22013-05-17 10:12:13 -040071import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
72import com.savoirfairelinux.sflphone.model.CallContact;
alisiond8c83882013-05-17 17:00:42 -040073import com.savoirfairelinux.sflphone.model.SipCall;
alision84813a12013-05-27 17:40:39 -040074import com.savoirfairelinux.sflphone.service.ISipService;
alisiond295ec22013-05-17 10:12:13 -040075import com.savoirfairelinux.sflphone.views.TACGridView;
Alexandre Savarda04c5202012-09-18 17:19:53 -040076
alisiond295ec22013-05-17 10:12:13 -040077public class ContactListFragment extends Fragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Bundle> {
alision84813a12013-05-27 17:40:39 -040078 private static final String TAG = "ContactListFragment";
alisiond8c83882013-05-17 17:00:42 -040079 ContactsAdapter mListAdapter;
80 StarredContactsAdapter mGridAdapter;
alisiond295ec22013-05-17 10:12:13 -040081
alisiond8c83882013-05-17 17:00:42 -040082 String mCurFilter;
Alexandre Savard6668cf82012-09-19 10:59:21 -040083
alisiond8c83882013-05-17 17:00:42 -040084 public static final int CONTACT_LOADER = 555;
alisiond295ec22013-05-17 10:12:13 -040085
alisiond8c83882013-05-17 17:00:42 -040086 @Override
87 public void onCreate(Bundle savedInBundle) {
88 super.onCreate(savedInBundle);
89 mListAdapter = new ContactsAdapter(getActivity());
90 mGridAdapter = new StarredContactsAdapter(getActivity());
91 }
Alexandre Savarda04c5202012-09-18 17:19:53 -040092
alision84813a12013-05-27 17:40:39 -040093 private Callbacks mCallbacks = sDummyCallbacks;
94 /**
95 * A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity.
96 */
97 private static Callbacks sDummyCallbacks = new Callbacks() {
98 @Override
99 public void onContactSelected(CallContact c) {
100 }
101
102 @Override
103 public ISipService getService() {
104 Log.i(TAG, "Dummy");
105 return null;
106 }
107
108 };
109
110 public interface Callbacks {
111 void onContactSelected(CallContact c);
112
113 public ISipService getService();
114
115 }
116
alisiond8c83882013-05-17 17:00:42 -0400117 @Override
118 public void onAttach(Activity activity) {
119 super.onAttach(activity);
alision84813a12013-05-27 17:40:39 -0400120 if (!(activity instanceof Callbacks)) {
121 throw new IllegalStateException("Activity must implement fragment's callbacks.");
122 }
123
124 mCallbacks = (Callbacks) activity;
alisiond8c83882013-05-17 17:00:42 -0400125 }
alisionfde875f2013-05-28 17:01:54 -0400126
127 @Override
128 public void onDetach() {
129 super.onDetach();
130 mCallbacks = sDummyCallbacks;
131 }
Emeric Vigier1f1ced32012-11-02 16:56:32 -0400132
alisiond8c83882013-05-17 17:00:42 -0400133 @Override
134 public void onActivityCreated(Bundle savedInstanceState) {
135 super.onActivityCreated(savedInstanceState);
Alexandre Savarda04c5202012-09-18 17:19:53 -0400136
alisiond8c83882013-05-17 17:00:42 -0400137 // In order to onCreateOptionsMenu be called
138 setHasOptionsMenu(true);
139 getLoaderManager().initLoader(CONTACT_LOADER, null, this);
Alexandre Savarda04c5202012-09-18 17:19:53 -0400140
alisiond8c83882013-05-17 17:00:42 -0400141 }
Alexandre Savard23240c12012-09-19 18:23:44 -0400142
alisiond8c83882013-05-17 17:00:42 -0400143 ListView list;
Alexandre Savard31433992012-09-20 15:19:49 -0400144
alisiond8c83882013-05-17 17:00:42 -0400145 private OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() {
146 @Override
147 public boolean onItemLongClick(AdapterView<?> av, View view, int pos, long id) {
148 DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view.findViewById(R.id.photo));
149 view.startDrag(null, shadowBuilder, view, 0);
150 view.setVisibility(View.INVISIBLE);
151 return true;
152 }
alisiond295ec22013-05-17 10:12:13 -0400153
alisiond8c83882013-05-17 17:00:42 -0400154 };
alisiond295ec22013-05-17 10:12:13 -0400155
alision84813a12013-05-27 17:40:39 -0400156// private void launchCallActivity(CallContact c) {
157// Log.i(TAG, "Launch Call Activity");
158// Bundle bundle = new Bundle();
159// bundle.putString("action", "call");
160// bundle.putParcelable("CallContact", c);
161// Intent intent = new Intent().setClass(getActivity(), CallActivity.class);
162// intent.putExtras(bundle);
163// getActivity().startActivity(intent);
164// }
alisiond295ec22013-05-17 10:12:13 -0400165
alisiond8c83882013-05-17 17:00:42 -0400166 @Override
167 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
168 View inflatedView = inflater.inflate(R.layout.frag_contact_list, container, false);
169 list = (ListView) inflatedView.findViewById(R.id.contacts_list);
alisiond295ec22013-05-17 10:12:13 -0400170
alisiond8c83882013-05-17 17:00:42 -0400171 list.setOnDragListener(dragListener);
172 list.setOnItemClickListener(new OnItemClickListener() {
alisiond295ec22013-05-17 10:12:13 -0400173
alisiond8c83882013-05-17 17:00:42 -0400174 @Override
175 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
alision84813a12013-05-27 17:40:39 -0400176 mCallbacks.onContactSelected(mListAdapter.getItem(pos));
alisiond8c83882013-05-17 17:00:42 -0400177
178 }
179 });
180 list.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400181
alisiond8c83882013-05-17 17:00:42 -0400182 View header = inflater.inflate(R.layout.frag_contact_list_header, null);
183 list.addHeaderView(header, null, false);
184 TACGridView grid = (TACGridView) header.findViewById(R.id.favorites_grid);
Alexandre Savardaef9d802012-09-20 17:31:32 -0400185
alisiond8c83882013-05-17 17:00:42 -0400186 list.setAdapter(mListAdapter);
187 grid.setAdapter(mGridAdapter);
188 grid.setExpanded(true);
189
190
191 grid.setOnDragListener(dragListener);
192 grid.setOnItemClickListener(new OnItemClickListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400193
alisiond8c83882013-05-17 17:00:42 -0400194 @Override
195 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
alision84813a12013-05-27 17:40:39 -0400196// launchCallActivity(mGridAdapter.getItem(pos));
197 mCallbacks.onContactSelected(mGridAdapter.getItem(pos));
alisiond8c83882013-05-17 17:00:42 -0400198 }
199 });
200 grid.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400201
alisiond8c83882013-05-17 17:00:42 -0400202 return inflatedView;
203 }
alisiond295ec22013-05-17 10:12:13 -0400204
alisiond8c83882013-05-17 17:00:42 -0400205 OnDragListener dragListener = new OnDragListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400206
alisiond8c83882013-05-17 17:00:42 -0400207 @Override
208 public boolean onDrag(View v, DragEvent event) {
209 switch (event.getAction()) {
210 case DragEvent.ACTION_DRAG_STARTED:
211 // Do nothing
212 break;
213 case DragEvent.ACTION_DRAG_ENTERED:
214 break;
215 case DragEvent.ACTION_DRAG_EXITED:
216 v.setBackgroundDrawable(null);
217 break;
218 case DragEvent.ACTION_DROP:
219 View view = (View) event.getLocalState();
220 break;
221 case DragEvent.ACTION_DRAG_ENDED:
222 View view1 = (View) event.getLocalState();
223 view1.setVisibility(View.VISIBLE);
224 default:
225 break;
226 }
227 return true;
228 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400229
alisiond8c83882013-05-17 17:00:42 -0400230 };
alision84813a12013-05-27 17:40:39 -0400231 private RelativeLayout mHandle;
Alexandre Savarda04c5202012-09-18 17:19:53 -0400232
alisiond8c83882013-05-17 17:00:42 -0400233 @Override
234 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
235 // Place an action bar item for searching
alision84813a12013-05-27 17:40:39 -0400236// inflater.inflate(R.menu.contact_list_menu, menu);
237// MenuItem item = menu.findItem(R.id.menu_search);
238// SearchView sv = new SearchView(getActivity());
239// sv.setOnQueryTextListener(this);
240// item.setActionView(sv);
alisiond8c83882013-05-17 17:00:42 -0400241 }
alisiond295ec22013-05-17 10:12:13 -0400242
alisiond8c83882013-05-17 17:00:42 -0400243 @Override
244 public boolean onQueryTextChange(String newText) {
245 // Called when the action bar search text has changed. Update
246 // the search filter, and restart the loader to do a new query
247 // with this filter.
248 String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
249 // Don't do anything if the filter hasn't actually changed.
250 // Prefents restarting the loader when restoring state.
251 if (mCurFilter == null && newFilter == null) {
252 return true;
253 }
254 if (mCurFilter != null && mCurFilter.equals(newFilter)) {
255 return true;
256 }
257 mCurFilter = newFilter;
258 getLoaderManager().restartLoader(CONTACT_LOADER, null, this);
259 return true;
260 }
alisiond295ec22013-05-17 10:12:13 -0400261
alisiond8c83882013-05-17 17:00:42 -0400262 @Override
263 public boolean onQueryTextSubmit(String query) {
264 // Return false to let the SearchView perform the default action
265 return false;
266 }
alisiond295ec22013-05-17 10:12:13 -0400267
alisiond8c83882013-05-17 17:00:42 -0400268 @Override
269 public Loader<Bundle> onCreateLoader(int id, Bundle args) {
270 Uri baseUri;
alision17052d42013-04-22 10:39:38 -0400271
alisiond8c83882013-05-17 17:00:42 -0400272 if (mCurFilter != null) {
273 baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter));
274 } else {
275 baseUri = Contacts.CONTENT_URI;
276 }
277 ContactsLoader l = new ContactsLoader(getActivity(), baseUri);
278 l.forceLoad();
279 return l;
280 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400281
alisiond8c83882013-05-17 17:00:42 -0400282 @Override
283 public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
Alexandre Savard6668cf82012-09-19 10:59:21 -0400284
alisiond8c83882013-05-17 17:00:42 -0400285 mListAdapter.removeAll();
286 mGridAdapter.removeAll();
287 ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
288 ArrayList<CallContact> tmp2 = data.getParcelableArrayList("Starred");
Alexandre Savard6668cf82012-09-19 10:59:21 -0400289
alisiond8c83882013-05-17 17:00:42 -0400290 Log.w(TAG, "Contact stareed " + tmp2.size());
291 mListAdapter.addAll(tmp);
292 mGridAdapter.addAll(tmp2);
Alexandre Savard6668cf82012-09-19 10:59:21 -0400293
alisiond8c83882013-05-17 17:00:42 -0400294 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400295
alisiond8c83882013-05-17 17:00:42 -0400296 @Override
297 public void onLoaderReset(Loader<Bundle> loader) {
298 // Thi is called when the last Cursor provided to onLoadFinished
299 // mListAdapter.swapCursor(null);
300 }
alision84813a12013-05-27 17:40:39 -0400301
302 public void setHandleView(RelativeLayout handle) {
303 mHandle = handle;
304
305// ((ImageButton) handle.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
306
307 ((SearchView)mHandle.findViewById(R.id.contact_search_text)).setOnQueryTextListener(this);
308
309
310// ((ImageButton) mHandle.findViewById(R.id.contact_search)).setOnClickListener(new OnClickListener() {
311//
312// @Override
313// public void onClick(View v) {
314// Log.i(TAG, "Click on serach");
315//// ((ViewSwitcher)mHandle.findViewById(R.id.view_switcher)).showNext();
316//// ((SearchView)mHandle.findViewById(R.id.contact_search_text)).
317//
318//
319// }
320// });
321
322 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400323}