blob: 2f6eed6162d7d16cfb06cfab2652cc09949496d7 [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;
53import android.view.View.OnDragListener;
Alexandre Savarda04c5202012-09-18 17:19:53 -040054import android.view.ViewGroup;
Alexandre Savard31433992012-09-20 15:19:49 -040055import android.widget.AdapterView;
alisiond295ec22013-05-17 10:12:13 -040056import android.widget.AdapterView.OnItemClickListener;
Alexandre Savard31433992012-09-20 15:19:49 -040057import android.widget.AdapterView.OnItemLongClickListener;
alisionf76de3b2013-04-16 15:35:22 -040058import android.widget.ListView;
59import android.widget.SearchView;
Alexandre Savard6668cf82012-09-19 10:59:21 -040060import android.widget.SearchView.OnQueryTextListener;
Alexandre Savarda04c5202012-09-18 17:19:53 -040061
62import com.savoirfairelinux.sflphone.R;
alisiond295ec22013-05-17 10:12:13 -040063import com.savoirfairelinux.sflphone.adapters.ContactsAdapter;
64import com.savoirfairelinux.sflphone.adapters.StarredContactsAdapter;
65import com.savoirfairelinux.sflphone.client.CallActivity;
66import com.savoirfairelinux.sflphone.loaders.ContactsLoader;
67import com.savoirfairelinux.sflphone.model.CallContact;
alisiond8c83882013-05-17 17:00:42 -040068import com.savoirfairelinux.sflphone.model.SipCall;
alisiond295ec22013-05-17 10:12:13 -040069import com.savoirfairelinux.sflphone.views.TACGridView;
Alexandre Savarda04c5202012-09-18 17:19:53 -040070
alisiond295ec22013-05-17 10:12:13 -040071public class ContactListFragment extends Fragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Bundle> {
alisiond8c83882013-05-17 17:00:42 -040072 final String TAG = "ContactListFragment";
73 ContactsAdapter mListAdapter;
74 StarredContactsAdapter mGridAdapter;
alisiond295ec22013-05-17 10:12:13 -040075
alisiond8c83882013-05-17 17:00:42 -040076 String mCurFilter;
Alexandre Savard6668cf82012-09-19 10:59:21 -040077
alisiond8c83882013-05-17 17:00:42 -040078 public static final int CONTACT_LOADER = 555;
alisiond295ec22013-05-17 10:12:13 -040079
alisiond8c83882013-05-17 17:00:42 -040080 @Override
81 public void onCreate(Bundle savedInBundle) {
82 super.onCreate(savedInBundle);
83 mListAdapter = new ContactsAdapter(getActivity());
84 mGridAdapter = new StarredContactsAdapter(getActivity());
85 }
Alexandre Savarda04c5202012-09-18 17:19:53 -040086
alisiond8c83882013-05-17 17:00:42 -040087 @Override
88 public void onAttach(Activity activity) {
89 super.onAttach(activity);
90 }
Emeric Vigier1f1ced32012-11-02 16:56:32 -040091
alisiond8c83882013-05-17 17:00:42 -040092 @Override
93 public void onActivityCreated(Bundle savedInstanceState) {
94 super.onActivityCreated(savedInstanceState);
Alexandre Savarda04c5202012-09-18 17:19:53 -040095
alisiond8c83882013-05-17 17:00:42 -040096 // In order to onCreateOptionsMenu be called
97 setHasOptionsMenu(true);
98 getLoaderManager().initLoader(CONTACT_LOADER, null, this);
Alexandre Savarda04c5202012-09-18 17:19:53 -040099
alisiond8c83882013-05-17 17:00:42 -0400100 }
Alexandre Savard23240c12012-09-19 18:23:44 -0400101
alisiond8c83882013-05-17 17:00:42 -0400102 ListView list;
Alexandre Savard31433992012-09-20 15:19:49 -0400103
alisiond8c83882013-05-17 17:00:42 -0400104 private OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() {
105 @Override
106 public boolean onItemLongClick(AdapterView<?> av, View view, int pos, long id) {
107 DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view.findViewById(R.id.photo));
108 view.startDrag(null, shadowBuilder, view, 0);
109 view.setVisibility(View.INVISIBLE);
110 return true;
111 }
alisiond295ec22013-05-17 10:12:13 -0400112
alisiond8c83882013-05-17 17:00:42 -0400113 };
alisiond295ec22013-05-17 10:12:13 -0400114
alisiond8c83882013-05-17 17:00:42 -0400115 private void launchCallActivity(CallContact c) {
116 Log.i(TAG, "Launch Call Activity");
117 Bundle bundle = new Bundle();
118 bundle.putString("action", "call");
119 bundle.putParcelable("CallContact", c);
120 Intent intent = new Intent().setClass(getActivity(), CallActivity.class);
121 intent.putExtras(bundle);
122 getActivity().startActivity(intent);
123 }
alisiond295ec22013-05-17 10:12:13 -0400124
alisiond8c83882013-05-17 17:00:42 -0400125 @Override
126 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
127 View inflatedView = inflater.inflate(R.layout.frag_contact_list, container, false);
128 list = (ListView) inflatedView.findViewById(R.id.contacts_list);
alisiond295ec22013-05-17 10:12:13 -0400129
alisiond8c83882013-05-17 17:00:42 -0400130 list.setOnDragListener(dragListener);
131 list.setOnItemClickListener(new OnItemClickListener() {
alisiond295ec22013-05-17 10:12:13 -0400132
alisiond8c83882013-05-17 17:00:42 -0400133 @Override
134 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
135 launchCallActivity(mListAdapter.getItem(pos));
136
137 }
138 });
139 list.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400140
alisiond8c83882013-05-17 17:00:42 -0400141 View header = inflater.inflate(R.layout.frag_contact_list_header, null);
142 list.addHeaderView(header, null, false);
143 TACGridView grid = (TACGridView) header.findViewById(R.id.favorites_grid);
Alexandre Savardaef9d802012-09-20 17:31:32 -0400144
alisiond8c83882013-05-17 17:00:42 -0400145 list.setAdapter(mListAdapter);
146 grid.setAdapter(mGridAdapter);
147 grid.setExpanded(true);
148
149
150 grid.setOnDragListener(dragListener);
151 grid.setOnItemClickListener(new OnItemClickListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400152
alisiond8c83882013-05-17 17:00:42 -0400153 @Override
154 public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
155 launchCallActivity(mGridAdapter.getItem(pos));
156
157 }
158 });
159 grid.setOnItemLongClickListener(mItemLongClickListener);
alisiond295ec22013-05-17 10:12:13 -0400160
alisiond8c83882013-05-17 17:00:42 -0400161 return inflatedView;
162 }
alisiond295ec22013-05-17 10:12:13 -0400163
alisiond8c83882013-05-17 17:00:42 -0400164 OnDragListener dragListener = new OnDragListener() {
Alexandre Savard0014d232012-09-24 10:31:23 -0400165
alisiond8c83882013-05-17 17:00:42 -0400166 @Override
167 public boolean onDrag(View v, DragEvent event) {
168 switch (event.getAction()) {
169 case DragEvent.ACTION_DRAG_STARTED:
170 // Do nothing
171 break;
172 case DragEvent.ACTION_DRAG_ENTERED:
173 break;
174 case DragEvent.ACTION_DRAG_EXITED:
175 v.setBackgroundDrawable(null);
176 break;
177 case DragEvent.ACTION_DROP:
178 View view = (View) event.getLocalState();
179 break;
180 case DragEvent.ACTION_DRAG_ENDED:
181 View view1 = (View) event.getLocalState();
182 view1.setVisibility(View.VISIBLE);
183 default:
184 break;
185 }
186 return true;
187 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400188
alisiond8c83882013-05-17 17:00:42 -0400189 };
Alexandre Savarda04c5202012-09-18 17:19:53 -0400190
alisiond8c83882013-05-17 17:00:42 -0400191 @Override
192 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
193 // Place an action bar item for searching
194 inflater.inflate(R.menu.contact_list_menu, menu);
195 MenuItem item = menu.findItem(R.id.menu_search);
196 SearchView sv = new SearchView(getActivity());
197 sv.setOnQueryTextListener(this);
198 item.setActionView(sv);
199 }
alisiond295ec22013-05-17 10:12:13 -0400200
alisiond8c83882013-05-17 17:00:42 -0400201 @Override
202 public boolean onQueryTextChange(String newText) {
203 // Called when the action bar search text has changed. Update
204 // the search filter, and restart the loader to do a new query
205 // with this filter.
206 String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
207 // Don't do anything if the filter hasn't actually changed.
208 // Prefents restarting the loader when restoring state.
209 if (mCurFilter == null && newFilter == null) {
210 return true;
211 }
212 if (mCurFilter != null && mCurFilter.equals(newFilter)) {
213 return true;
214 }
215 mCurFilter = newFilter;
216 getLoaderManager().restartLoader(CONTACT_LOADER, null, this);
217 return true;
218 }
alisiond295ec22013-05-17 10:12:13 -0400219
alisiond8c83882013-05-17 17:00:42 -0400220 @Override
221 public boolean onQueryTextSubmit(String query) {
222 // Return false to let the SearchView perform the default action
223 return false;
224 }
alisiond295ec22013-05-17 10:12:13 -0400225
alisiond8c83882013-05-17 17:00:42 -0400226 @Override
227 public Loader<Bundle> onCreateLoader(int id, Bundle args) {
228 Uri baseUri;
alision17052d42013-04-22 10:39:38 -0400229
alisiond8c83882013-05-17 17:00:42 -0400230 if (mCurFilter != null) {
231 baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter));
232 } else {
233 baseUri = Contacts.CONTENT_URI;
234 }
235 ContactsLoader l = new ContactsLoader(getActivity(), baseUri);
236 l.forceLoad();
237 return l;
238 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400239
alisiond8c83882013-05-17 17:00:42 -0400240 @Override
241 public void onLoadFinished(Loader<Bundle> loader, Bundle data) {
Alexandre Savard6668cf82012-09-19 10:59:21 -0400242
alisiond8c83882013-05-17 17:00:42 -0400243 mListAdapter.removeAll();
244 mGridAdapter.removeAll();
245 ArrayList<CallContact> tmp = data.getParcelableArrayList("Contacts");
246 ArrayList<CallContact> tmp2 = data.getParcelableArrayList("Starred");
Alexandre Savard6668cf82012-09-19 10:59:21 -0400247
alisiond8c83882013-05-17 17:00:42 -0400248 Log.w(TAG, "Contact stareed " + tmp2.size());
249 mListAdapter.addAll(tmp);
250 mGridAdapter.addAll(tmp2);
Alexandre Savard6668cf82012-09-19 10:59:21 -0400251
alisiond8c83882013-05-17 17:00:42 -0400252 }
Alexandre Savard6668cf82012-09-19 10:59:21 -0400253
alisiond8c83882013-05-17 17:00:42 -0400254 @Override
255 public void onLoaderReset(Loader<Bundle> loader) {
256 // Thi is called when the last Cursor provided to onLoadFinished
257 // mListAdapter.swapCursor(null);
258 }
Alexandre Savarda04c5202012-09-18 17:19:53 -0400259}