blob: a3308433acc9a5f0715ad5c6da6214e8fb1ef8a4 [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 }
Emeric Vigier1f1ced32012-11-02 16:56:32 -0400126
alisiond8c83882013-05-17 17:00:42 -0400127 @Override
128 public void onActivityCreated(Bundle savedInstanceState) {
129 super.onActivityCreated(savedInstanceState);
Alexandre Savarda04c5202012-09-18 17:19:53 -0400130
alisiond8c83882013-05-17 17:00:42 -0400131 // In order to onCreateOptionsMenu be called
132 setHasOptionsMenu(true);
133 getLoaderManager().initLoader(CONTACT_LOADER, null, this);
Alexandre Savarda04c5202012-09-18 17:19:53 -0400134
alisiond8c83882013-05-17 17:00:42 -0400135 }
Alexandre Savard23240c12012-09-19 18:23:44 -0400136
alisiond8c83882013-05-17 17:00:42 -0400137 ListView list;
Alexandre Savard31433992012-09-20 15:19:49 -0400138
alisiond8c83882013-05-17 17:00:42 -0400139 private OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() {
140 @Override
141 public boolean onItemLongClick(AdapterView<?> av, View view, int pos, long id) {
142 DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view.findViewById(R.id.photo));
143 view.startDrag(null, shadowBuilder, view, 0);
144 view.setVisibility(View.INVISIBLE);
145 return true;
146 }
alisiond295ec22013-05-17 10:12:13 -0400147
alisiond8c83882013-05-17 17:00:42 -0400148 };
alisiond295ec22013-05-17 10:12:13 -0400149
alision84813a12013-05-27 17:40:39 -0400150// private void launchCallActivity(CallContact c) {
151// Log.i(TAG, "Launch Call Activity");
152// Bundle bundle = new Bundle();
153// bundle.putString("action", "call");
154// bundle.putParcelable("CallContact", c);
155// Intent intent = new Intent().setClass(getActivity(), CallActivity.class);
156// intent.putExtras(bundle);
157// getActivity().startActivity(intent);
158// }
alisiond295ec22013-05-17 10:12:13 -0400159
alisiond8c83882013-05-17 17:00:42 -0400160 @Override
161 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
162 View inflatedView = inflater.inflate(R.layout.frag_contact_list, container, false);
163 list = (ListView) inflatedView.findViewById(R.id.contacts_list);
alisiond295ec22013-05-17 10:12:13 -0400164
alisiond8c83882013-05-17 17:00:42 -0400165 list.setOnDragListener(dragListener);
166 list.setOnItemClickListener(new OnItemClickListener() {
alisiond295ec22013-05-17 10:12:13 -0400167
alisiond8c83882013-05-17 17:00:42 -0400168 @Override
169 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
alision84813a12013-05-27 17:40:39 -0400170 mCallbacks.onContactSelected(mListAdapter.getItem(pos));
alisiond8c83882013-05-17 17:00:42 -0400171
172 }
173 });
174 list.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400175
alisiond8c83882013-05-17 17:00:42 -0400176 View header = inflater.inflate(R.layout.frag_contact_list_header, null);
177 list.addHeaderView(header, null, false);
178 TACGridView grid = (TACGridView) header.findViewById(R.id.favorites_grid);
Alexandre Savardaef9d802012-09-20 17:31:32 -0400179
alisiond8c83882013-05-17 17:00:42 -0400180 list.setAdapter(mListAdapter);
181 grid.setAdapter(mGridAdapter);
182 grid.setExpanded(true);
183
184
185 grid.setOnDragListener(dragListener);
186 grid.setOnItemClickListener(new OnItemClickListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400187
alisiond8c83882013-05-17 17:00:42 -0400188 @Override
189 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
alision84813a12013-05-27 17:40:39 -0400190// launchCallActivity(mGridAdapter.getItem(pos));
191 mCallbacks.onContactSelected(mGridAdapter.getItem(pos));
alisiond8c83882013-05-17 17:00:42 -0400192 }
193 });
194 grid.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400195
alisiond8c83882013-05-17 17:00:42 -0400196 return inflatedView;
197 }
alisiond295ec22013-05-17 10:12:13 -0400198
alisiond8c83882013-05-17 17:00:42 -0400199 OnDragListener dragListener = new OnDragListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400200
alisiond8c83882013-05-17 17:00:42 -0400201 @Override
202 public boolean onDrag(View v, DragEvent event) {
203 switch (event.getAction()) {
204 case DragEvent.ACTION_DRAG_STARTED:
205 // Do nothing
206 break;
207 case DragEvent.ACTION_DRAG_ENTERED:
208 break;
209 case DragEvent.ACTION_DRAG_EXITED:
210 v.setBackgroundDrawable(null);
211 break;
212 case DragEvent.ACTION_DROP:
213 View view = (View) event.getLocalState();
214 break;
215 case DragEvent.ACTION_DRAG_ENDED:
216 View view1 = (View) event.getLocalState();
217 view1.setVisibility(View.VISIBLE);
218 default:
219 break;
220 }
221 return true;
222 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400223
alisiond8c83882013-05-17 17:00:42 -0400224 };
alision84813a12013-05-27 17:40:39 -0400225 private RelativeLayout mHandle;
Alexandre Savarda04c5202012-09-18 17:19:53 -0400226
alisiond8c83882013-05-17 17:00:42 -0400227 @Override
228 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
229 // Place an action bar item for searching
alision84813a12013-05-27 17:40:39 -0400230// inflater.inflate(R.menu.contact_list_menu, menu);
231// MenuItem item = menu.findItem(R.id.menu_search);
232// SearchView sv = new SearchView(getActivity());
233// sv.setOnQueryTextListener(this);
234// item.setActionView(sv);
alisiond8c83882013-05-17 17:00:42 -0400235 }
alisiond295ec22013-05-17 10:12:13 -0400236
alisiond8c83882013-05-17 17:00:42 -0400237 @Override
238 public boolean onQueryTextChange(String newText) {
239 // Called when the action bar search text has changed. Update
240 // the search filter, and restart the loader to do a new query
241 // with this filter.
242 String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
243 // Don't do anything if the filter hasn't actually changed.
244 // Prefents restarting the loader when restoring state.
245 if (mCurFilter == null && newFilter == null) {
246 return true;
247 }
248 if (mCurFilter != null && mCurFilter.equals(newFilter)) {
249 return true;
250 }
251 mCurFilter = newFilter;
252 getLoaderManager().restartLoader(CONTACT_LOADER, null, this);
253 return true;
254 }
alisiond295ec22013-05-17 10:12:13 -0400255
alisiond8c83882013-05-17 17:00:42 -0400256 @Override
257 public boolean onQueryTextSubmit(String query) {
258 // Return false to let the SearchView perform the default action
259 return false;
260 }
alisiond295ec22013-05-17 10:12:13 -0400261
alisiond8c83882013-05-17 17:00:42 -0400262 @Override
263 public Loader<Bundle> onCreateLoader(int id, Bundle args) {
264 Uri baseUri;
alision17052d42013-04-22 10:39:38 -0400265
alisiond8c83882013-05-17 17:00:42 -0400266 if (mCurFilter != null) {
267 baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter));
268 } else {
269 baseUri = Contacts.CONTENT_URI;
270 }
271 ContactsLoader l = new ContactsLoader(getActivity(), baseUri);
272 l.forceLoad();
273 return l;
274 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400275
alisiond8c83882013-05-17 17:00:42 -0400276 @Override
277 public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
Alexandre Savard6668cf82012-09-19 10:59:21 -0400278
alisiond8c83882013-05-17 17:00:42 -0400279 mListAdapter.removeAll();
280 mGridAdapter.removeAll();
281 ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
282 ArrayList<CallContact> tmp2 = data.getParcelableArrayList("Starred");
Alexandre Savard6668cf82012-09-19 10:59:21 -0400283
alisiond8c83882013-05-17 17:00:42 -0400284 Log.w(TAG, "Contact stareed " + tmp2.size());
285 mListAdapter.addAll(tmp);
286 mGridAdapter.addAll(tmp2);
Alexandre Savard6668cf82012-09-19 10:59:21 -0400287
alisiond8c83882013-05-17 17:00:42 -0400288 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400289
alisiond8c83882013-05-17 17:00:42 -0400290 @Override
291 public void onLoaderReset(Loader<Bundle> loader) {
292 // Thi is called when the last Cursor provided to onLoadFinished
293 // mListAdapter.swapCursor(null);
294 }
alision84813a12013-05-27 17:40:39 -0400295
296 public void setHandleView(RelativeLayout handle) {
297 mHandle = handle;
298
299// ((ImageButton) handle.findViewById(R.id.contact_search)).setTag(R.id.contact_search, false);
300
301 ((SearchView)mHandle.findViewById(R.id.contact_search_text)).setOnQueryTextListener(this);
302
303
304// ((ImageButton) mHandle.findViewById(R.id.contact_search)).setOnClickListener(new OnClickListener() {
305//
306// @Override
307// public void onClick(View v) {
308// Log.i(TAG, "Click on serach");
309//// ((ViewSwitcher)mHandle.findViewById(R.id.view_switcher)).showNext();
310//// ((SearchView)mHandle.findViewById(R.id.contact_search_text)).
311//
312//
313// }
314// });
315
316 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400317}