From 17052d46a1c9185c2989f5cde4206c679da84a10 Mon Sep 17 00:00:00 2001 From: alision <alexandre.lision@savoirfairelinux.com> Date: Mon, 22 Apr 2013 10:39:38 -0400 Subject: [PATCH] Added contact picture to ContactListFragment --- AndroidManifest.xml | 1 + bin/AndroidManifest.xml | 1 + res/drawable/ic_contact_picture.png | Bin 0 -> 7422 bytes res/layout/item_contact.xml | 13 +- .../sflphone/adapters/CallElementAdapter.java | 6 - .../sflphone/client/CallActivity.java | 3 +- .../sflphone/client/CallElementView.java | 2 - .../client/receiver/CallListReceiver.java | 4 + .../fragments/ButtonSectionFragment.java | 4 + .../fragments/ContactListFragment.java | 176 ++++++++---------- .../sflphone/service/SipService.java | 31 ++- 11 files changed, 115 insertions(+), 126 deletions(-) create mode 100644 res/drawable/ic_contact_picture.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 34dc33fb9..6c6345f51 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -45,6 +45,7 @@ as that of the covered work. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> + <uses-permission android:name="android.permission.VIBRATE" /> <application android:name=".client.SFLphoneApplication" diff --git a/bin/AndroidManifest.xml b/bin/AndroidManifest.xml index 34dc33fb9..6c6345f51 100644 --- a/bin/AndroidManifest.xml +++ b/bin/AndroidManifest.xml @@ -45,6 +45,7 @@ as that of the covered work. <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> + <uses-permission android:name="android.permission.VIBRATE" /> <application android:name=".client.SFLphoneApplication" diff --git a/res/drawable/ic_contact_picture.png b/res/drawable/ic_contact_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2bfde385b770deff8237c256c118c81effe5b5 GIT binary patch literal 7422 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 a2_N{_IsP|+#tXr#5hf#{C|)jV;Qv2JieUr* literal 0 HcmV?d00001 diff --git a/res/layout/item_contact.xml b/res/layout/item_contact.xml index eed4505b5..423ab662b 100644 --- a/res/layout/item_contact.xml +++ b/res/layout/item_contact.xml @@ -45,24 +45,17 @@ as that of the covered work. android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" - android:layout_alignTop="@+id/button2" android:background="#00000000" android:drawableLeft="@drawable/call_pause" android:gravity="left|center_vertical" android:src="@drawable/call_pause" android:visibility="gone" /> - <Button - android:id="@+id/button2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_toRightOf="@+id/toggleButton1" - android:text="Button" - android:visibility="gone" /> + <ImageView android:id="@+id/photo" android:layout_width="70dp" android:layout_height="70dp" + android:scaleType="centerCrop" android:src="@drawable/box_border" /> <TextView android:id="@+id/display_name" @@ -70,9 +63,9 @@ as that of the covered work. android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/photo" + android:paddingLeft="@dimen/padding_small" android:paddingTop="@dimen/padding_small" - android:text="Contact Name" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/phones" diff --git a/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java b/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java index 5196cf894..35b694ffc 100644 --- a/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java +++ b/src/com/savoirfairelinux/sflphone/adapters/CallElementAdapter.java @@ -9,8 +9,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; @@ -46,8 +44,6 @@ public class CallElementAdapter extends ArrayAdapter { // Hold the view objects in an object // so they don't need to be re-fetched entryView = new CallElementView(); - entryView.toggleButton = (ImageButton) rowView.findViewById(R.id.toggleButton1); - entryView.button = (Button) rowView.findViewById(R.id.button2); entryView.photo = (ImageView) rowView.findViewById(R.id.photo); entryView.displayName = (TextView) rowView.findViewById(R.id.display_name); entryView.phones = (TextView) rowView.findViewById(R.id.phones); @@ -75,8 +71,6 @@ public class CallElementAdapter extends ArrayAdapter { * ViewHolder Pattern *********************/ public class CallElementView { - protected ImageButton toggleButton; - protected Button button; protected ImageView photo; protected TextView displayName; protected TextView phones; diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java index 3b0bfd5ab..273ef5caa 100644 --- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java +++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java @@ -33,14 +33,13 @@ package com.savoirfairelinux.sflphone.client; import android.app.Activity; import android.content.BroadcastReceiver; -import android.content.Context; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; -import android.os.RemoteException; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.View; diff --git a/src/com/savoirfairelinux/sflphone/client/CallElementView.java b/src/com/savoirfairelinux/sflphone/client/CallElementView.java index 1031e0953..be580dee4 100644 --- a/src/com/savoirfairelinux/sflphone/client/CallElementView.java +++ b/src/com/savoirfairelinux/sflphone/client/CallElementView.java @@ -42,8 +42,6 @@ import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.FrameLayout; -import com.savoirfairelinux.sflphone.R; - public class CallElementView extends FrameLayout { private ViewGroup contactCard = null; private ViewGroup callCard = null; diff --git a/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java index ddf4efa6f..5b1dc16bd 100644 --- a/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java +++ b/src/com/savoirfairelinux/sflphone/client/receiver/CallListReceiver.java @@ -85,6 +85,10 @@ public class CallListReceiver extends BroadcastReceiver mHome = home; } + public CallListReceiver() { + // TODO Auto-generated constructor stub + } + @Override public void onReceive(Context context, Intent intent) { diff --git a/src/com/savoirfairelinux/sflphone/fragments/ButtonSectionFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ButtonSectionFragment.java index 02c72e58f..280f3dc63 100644 --- a/src/com/savoirfairelinux/sflphone/fragments/ButtonSectionFragment.java +++ b/src/com/savoirfairelinux/sflphone/fragments/ButtonSectionFragment.java @@ -43,4 +43,8 @@ public class ButtonSectionFragment extends Fragment return view; } + + public void onClick(){ + Log.i(TAG,"onClik"); + } } diff --git a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java index 18e8043df..2cdca0504 100644 --- a/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java +++ b/src/com/savoirfairelinux/sflphone/fragments/ContactListFragment.java @@ -77,15 +77,13 @@ import android.widget.SearchView.OnQueryTextListener; import android.widget.TextView; import com.savoirfairelinux.sflphone.R; -import com.savoirfairelinux.sflphone.account.AccountSelectionSpinner; import com.savoirfairelinux.sflphone.client.SFLPhoneHomeActivity; import com.savoirfairelinux.sflphone.client.SFLphoneApplication; import com.savoirfairelinux.sflphone.client.receiver.AccountListReceiver; import com.savoirfairelinux.sflphone.model.SipCall; import com.savoirfairelinux.sflphone.service.ISipService; -public class ContactListFragment extends ListFragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> -{ +public class ContactListFragment extends ListFragment implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { final String TAG = "ContactListFragment"; ContactElementAdapter mAdapter; Activity mContext; @@ -96,8 +94,7 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList private AccountListReceiver mAccountList; // These are the Contacts rows that we will retrieve. - static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, - Contacts.PHOTO_ID, Contacts.LOOKUP_KEY }; + static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_ID, Contacts.LOOKUP_KEY }; 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 }; @@ -112,21 +109,19 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList Log.w(TAG, "onAttach() service=" + service + ", mAccountList=" + mAccountList); } - public static class InfosLoader implements Runnable - { - private View view; + public static class InfosLoader implements Runnable { + private ImageView view; private long cid; private ContentResolver cr; + private static final String TAG = InfosLoader.class.getSimpleName(); - public InfosLoader(Context context, View element, long contact_id) - { + public InfosLoader(Context context, ImageView element, long contact_id) { cid = contact_id; cr = context.getContentResolver(); view = element; } - public static Bitmap loadContactPhoto(ContentResolver cr, long id) - { + 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) { @@ -136,14 +131,11 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList } @Override - public void run() - { + 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); + 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()) { @@ -154,28 +146,24 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList phones.close(); final Bitmap bmp = photo_bmp; - view.post(new Runnable() - { + view.post(new Runnable() { @Override - public void run() - { + public void run() { + view.setImageBitmap(bmp); } }); } } - public static class ContactElementAdapter extends CursorAdapter - { + public static class ContactElementAdapter extends CursorAdapter { private ExecutorService infos_fetcher = Executors.newCachedThreadPool(); - - public ContactElementAdapter(Context context, Cursor c) - { + private static final String TAG = ContactElementAdapter.class.getSimpleName(); + public ContactElementAdapter(Context context, Cursor c) { super(context, c, 0); } @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) - { + public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.item_contact, parent, false); bindView(v, context, cursor); @@ -183,35 +171,33 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList } @Override - public void bindView(final View view, Context context, Cursor cursor) - { + 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)); + final long photo_id = cursor.getLong(cursor.getColumnIndex(Contacts.PHOTO_ID)); + Log.i(TAG,"photo_id "+photo_id); +// final String photo_uri_thumb_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); + // photo_view.setVisibility(View.GONE); - infos_fetcher.execute(new InfosLoader(context, view, contact_id)); + if (photo_id != 0) { + infos_fetcher.execute(new InfosLoader(context, photo_view, contact_id)); + } else { + photo_view.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_contact_picture)); + } } }; - public ContactListFragment() - { - super(); - } - @Override - public void onActivityCreated(Bundle savedInstanceState) - { + public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mContext = getActivity(); - // In order to onCreateOptionsMenu be called + // In order to onCreateOptionsMenu be called setHasOptionsMenu(true); mAdapter = new ContactElementAdapter(mContext, null); @@ -224,7 +210,7 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList @Override public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { Log.i(TAG, "On Long Click"); - final CharSequence[] items = {"Make Call", "Send Message", "Add to Conference"}; + final CharSequence[] items = { "Make Call", "Send Message", "Add to Conference" }; final SipCall.CallInfo info = new SipCall.CallInfo(); info.mDisplayName = (String) ((TextView) v.findViewById(R.id.display_name)).getText(); info.mPhone = (String) ((TextView) v.findViewById(R.id.phones)).getText(); @@ -234,30 +220,29 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList // FIXME service = sflphoneApplication.getSipService(); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - builder.setTitle("Action to perform with " + call.mCallInfo.mDisplayName) - .setCancelable(true) - .setItems(items, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - Log.i(TAG, "Selected " + items[item]); - switch (item) { - case 0: - call.placeCallUpdateUi(); - break; - case 1: - call.sendTextMessage(); - // Need to hangup this call immediately since no way to do it after this action - call.notifyServiceHangup(service); - break; - case 2: - call.addToConference(); - // Need to hangup this call immediately since no way to do it after this action - call.notifyServiceHangup(service); - break; - default: - break; - } - } - }); + builder.setTitle("Action to perform with " + call.mCallInfo.mDisplayName).setCancelable(true) + .setItems(items, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + Log.i(TAG, "Selected " + items[item]); + switch (item) { + case 0: + call.placeCallUpdateUi(); + break; + case 1: + call.sendTextMessage(); + // Need to hangup this call immediately since no way to do it after this action + call.notifyServiceHangup(service); + break; + case 2: + call.addToConference(); + // Need to hangup this call immediately since no way to do it after this action + call.notifyServiceHangup(service); + break; + default: + break; + } + } + }); AlertDialog alert = builder.create(); alert.show(); @@ -279,19 +264,17 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View inflatedView = inflater.inflate(R.layout.frag_contact_list, container, false); return inflatedView; } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) - { + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Place an action bar item for searching MenuItem item = menu.add("Search"); item.setIcon(R.drawable.ic_menu_search); - + item.setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_IF_ROOM | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); SearchView sv = new SearchView(getActivity()); sv.setOnQueryTextListener(this); @@ -299,8 +282,7 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList } @Override - public void onListItemClick(ListView l, View v, int position, long id) - { + public void onListItemClick(ListView l, View v, int position, long id) { // Insert desired behavior here. SipCall.CallInfo callInfo = new SipCall.CallInfo(); callInfo.mDisplayName = (String) ((TextView) v.findViewById(R.id.display_name)).getText(); @@ -315,38 +297,39 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList SipCall call = new SipCall(callInfo); // if(nbCallAfter > nbCallBefore) - // call.placeCall(); + // call.placeCall(); } @Override - public boolean onQueryTextChange(String newText) - { + public boolean onQueryTextChange(String newText) { // Called when the action bar search text has changed. Update // the search filter, and restart the loader to do a new query // with this filter. String newFilter = !TextUtils.isEmpty(newText) ? newText : null; // Don't do anything if the filter hasn't actually changed. // Prefents restarting the loader when restoring state. - if (mCurFilter == null && newFilter == null) { return true; } - if (mCurFilter != null && mCurFilter.equals(newFilter)) { return true; } + if (mCurFilter == null && newFilter == null) { + return true; + } + if (mCurFilter != null && mCurFilter.equals(newFilter)) { + return true; + } mCurFilter = newFilter; getLoaderManager().restartLoader(0, null, this); - return true; + return true; } @Override - public boolean onQueryTextSubmit(String query) - { + public boolean onQueryTextSubmit(String query) { // Return false to let the SearchView perform the default action return false; } @Override - public Loader<Cursor> onCreateLoader(int id, Bundle args) - { + public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri baseUri; - if(mCurFilter != null) { + if (mCurFilter != null) { baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter)); } else { baseUri = Contacts.CONTENT_URI; @@ -354,28 +337,21 @@ public class ContactListFragment extends ListFragment implements OnQueryTextList // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. - String select = "((" + Contacts.DISPLAY_NAME - + " NOTNULL) AND (" - + Contacts.HAS_PHONE_NUMBER - + "=1) AND (" - + Contacts.DISPLAY_NAME - + " != '' ))"; - - return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, - select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); + String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + + " != '' ))"; + + return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); } @Override - public void onLoadFinished(Loader<Cursor> loader, Cursor data) - { + 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 + public void onLoaderReset(Loader<Cursor> loader) { + // Thi is called when the last Cursor provided to onLoadFinished mAdapter.swapCursor(null); } } diff --git a/src/com/savoirfairelinux/sflphone/service/SipService.java b/src/com/savoirfairelinux/sflphone/service/SipService.java index e0600065a..ec1f0b6d1 100644 --- a/src/com/savoirfairelinux/sflphone/service/SipService.java +++ b/src/com/savoirfairelinux/sflphone/service/SipService.java @@ -24,26 +24,29 @@ package com.savoirfairelinux.sflphone.service; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.Vibrator; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.widget.Toast; -import com.savoirfairelinux.sflphone.service.ManagerImpl; import com.savoirfairelinux.sflphone.account.AccountDetailsHandler; import com.savoirfairelinux.sflphone.client.SFLphoneApplication; -import com.savoirfairelinux.sflphone.service.ISipService; - -import java.util.Map; -import java.util.HashMap; -import java.util.ArrayList; +import com.savoirfairelinux.sflphone.client.receiver.CallListReceiver; public class SipService extends Service { @@ -60,6 +63,7 @@ public class SipService extends Service { private ConfigurationManagerCallback configurationManagerCallback; private ManagerImpl managerImpl; private boolean isPjSipStackStarted = false; + public CallListReceiver mCallList; /* Implement public interface for the service */ @@ -250,6 +254,16 @@ public class SipService extends Service { }); } }; + private BroadcastReceiver IncomingReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + Log.i(TAG, "Received"+ intent.getAction()); + // Get instance of Vibrator from current Context + Vibrator mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); + mVibrator.vibrate(300); + } + }; /** * Class used for the client Binder. Because we know this service always @@ -269,6 +283,11 @@ public class SipService extends Service { super.onCreate(); sflphoneApp = (SFLphoneApplication) getApplication(); sipServiceThread = new SipServiceThread(); + mCallList = new CallListReceiver(); + + IntentFilter callFilter = new IntentFilter(CallManagerCallBack.NEW_CALL_CREATED); + callFilter.addAction(CallManagerCallBack.INCOMING_CALL); + LocalBroadcastManager.getInstance(this).registerReceiver(IncomingReceiver , callFilter); getExecutor().execute(new StartRunnable()); } -- GitLab