#15737: Add move contact adapter in contact fragment
diff --git a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
index 6e83c37..784f21f 100644
--- a/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
+++ b/src/com/savoirfairelinux/sflphone/client/ContactListFragment.java
@@ -1,7 +1,7 @@
 /*
  *  Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
  *
- *  Author: Adrien Beraud <adrien.beraud@gmail.com>
+ *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -32,35 +32,48 @@
 
 import android.app.ListFragment;
 import android.app.LoaderManager;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.Context;
 import android.content.CursorLoader;
 import android.content.Loader;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Bundle;
+import android.provider.*;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Profile;
 import android.text.TextUtils;
-import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.CursorAdapter;
+import android.widget.ImageView;
 import android.widget.ListView;
+import android.widget.TextView;
 import android.widget.SearchView;
 import android.widget.SearchView.OnQueryTextListener;
 import android.util.Log;
+import java.io.InputStream;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.List;
+import java.util.ArrayList;
 
 import com.savoirfairelinux.sflphone.R;
 
 public class ContactListFragment extends ListFragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor>
 {
-    ContactManager mContactManager;
-    CallElementList.CallElementAdapter mAdapter;
+    ContactElementAdapter mAdapter;
+    Manager mManager;
     String mCurFilter;
 
     // These are the Contacts rows that we will retrieve.
@@ -69,6 +82,100 @@
     static final String[] CONTACTS_PHONES_PROJECTION = new String[] { Phone.NUMBER, Phone.TYPE };
     static final String[] CONTACTS_SIP_PROJECTION = new String[] { SipAddress.SIP_ADDRESS, SipAddress.TYPE };
 
+    public static class InfosLoader implements Runnable
+    {
+        private View view;
+        private long cid;
+        private ContentResolver cr;
+
+        public InfosLoader(Context context, View element, long contact_id)
+        {
+            cid = contact_id;
+            cr = context.getContentResolver();
+            view = element;
+        }
+
+        public static Bitmap loadContactPhoto(ContentResolver cr, long id) 
+        {
+            Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
+            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
+            if (input == null) {
+                return null;
+            }
+            return BitmapFactory.decodeStream(input);
+        }
+
+        @Override
+        public void run()
+        {
+            final Bitmap photo_bmp = loadContactPhoto(cr, cid);
+
+            Cursor phones = cr.query(CommonDataKinds.Phone.CONTENT_URI,	
+                                        CONTACTS_PHONES_PROJECTION, CommonDataKinds.Phone.CONTACT_ID + " = ?",
+                                        new String[] { Long.toString(cid) },
+                                        null);
+
+            final List<String> numbers = new ArrayList<String>();
+            while (phones.moveToNext()) {
+                String number = phones.getString(phones.getColumnIndex(CommonDataKinds.Phone.NUMBER));
+                // int type = phones.getInt(phones.getColumnIndex(CommonDataKinds.Phone.TYPE));
+                numbers.add(number);
+            }
+            phones.close();
+
+            final Bitmap bmp = photo_bmp;
+            view.post(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                }
+            });
+        }
+    }
+
+    public static class ContactElementAdapter extends CursorAdapter
+    {
+        private ExecutorService infos_fetcher = Executors.newCachedThreadPool();
+
+        public ContactElementAdapter(Context context, Cursor c)
+        {
+            super(context, c, 0);
+        }
+
+        @Override
+        public View newView(Context context, Cursor cursor, ViewGroup parent)
+        {
+            LayoutInflater inflater = LayoutInflater.from(context);
+            View v = inflater.inflate(R.layout.call_element, parent, false);
+            bindView(v, context, cursor);
+            return v;
+        }
+
+        @Override
+        public void bindView(final View view, Context context, Cursor cursor)
+        {
+            final long contact_id = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
+            final String display_name = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME));
+            // final long photo_uri_string = cursor.getLong(cursor.getColumnIndex(Contacts.PHOTO_ID));
+            // final String photo_uri_string = cursor.getString(cursor.getColumnIndex(Contacts.PHOTO_THUMBNAIL_URI));
+
+            TextView display_name_txt = (TextView) view.findViewById(R.id.display_name);
+            display_name_txt.setText(display_name);
+
+            ImageView photo_view = (ImageView) view.findViewById(R.id.photo);
+            photo_view.setVisibility(View.GONE);
+
+            infos_fetcher.execute(new InfosLoader(context, view, contact_id));
+        }
+    };
+
+    public ContactListFragment(Manager manager)
+    {
+        super();
+        mManager = manager;
+    }
+
     @Override
     public void onActivityCreated(Bundle savedInstanceState)
     {
@@ -77,10 +184,10 @@
         // In order to onCreateOptionsMenu be called 
         setHasOptionsMenu(true);
 
-        mContactManager = new ContactManager(getActivity());
-
-        mAdapter = new CallElementList.CallElementAdapter(getActivity(), mContactManager);
+        mAdapter = new ContactElementAdapter(getActivity(), null);
         setListAdapter(mAdapter);
+
+        getLoaderManager().initLoader(0, null, this);
     }
 
     @Override
@@ -105,12 +212,15 @@
     public void onListItemClick(ListView l, View v, int position, long id)
     {
         // Insert desired behavior here.
-        CallContact contact = mContactManager.getContact(position);
+/*
         Log.i("ContactListFragment", "Contact clicked: " + contact.getDisplayName());
 
         SipCall call = SipCall.getCallInstance(contact);
         Log.i("ConatctListFragment", "OK");
         Log.i("ContactListFragment", "Number of calls " + SipCall.getNbCalls());
+
+        mManager.callmanagerJNI.placeCall("IP2IP", "CALL1234", "192.168.40.35");
+*/
     }
 
     @Override
@@ -164,11 +274,13 @@
     public void onLoadFinished(Loader<Cursor> loader, Cursor data)
     {
         // Swap the new cursor in.
+        mAdapter.swapCursor(data);
     }
 
     @Override
     public void onLoaderReset(Loader<Cursor> loader)
     {
         // Thi is called when the last Cursor provided to onLoadFinished 
+        mAdapter.swapCursor(null);
     }
 }