From b3f7a208574b6f4e1559a9130f0bf3808b59cf50 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Mon, 3 Oct 2011 16:33:59 +0200 Subject: [PATCH] Initial support for contact picture retrieving Search for - custom im 'sip' from username@domain; - then android sip from username@domain; - then number from username --- AndroidManifest.xml | 3 +- res/drawable-hdpi/unknown_person.png | Bin 0 -> 4619 bytes res/drawable-ldpi/unknown_person.png | Bin 0 -> 5539 bytes res/drawable-mdpi/unknown_person.png | Bin 0 -> 2521 bytes res/drawable/unknown_person.png | Bin 812 -> 5539 bytes res/layout/conferencing.xml | 11 +- res/layout/incoming.xml | 5 + .../AbstractContactPickerActivity.java | 2 + src/org/linphone/ConferenceActivity.java | 38 +++++- .../linphone/ContactPickerActivityNew.java | 112 ++++++++++++++---- .../linphone/ContactPickerActivityOld.java | 5 + src/org/linphone/DialerActivity.java | 7 +- src/org/linphone/IncomingCallActivity.java | 12 ++ src/org/linphone/LinphoneUtils.java | 58 ++++++++- src/org/linphone/ui/HangCallButton.java | 9 +- 15 files changed, 233 insertions(+), 29 deletions(-) create mode 100644 res/drawable-hdpi/unknown_person.png create mode 100644 res/drawable-ldpi/unknown_person.png create mode 100644 res/drawable-mdpi/unknown_person.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2228c435e..5f3d7662b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -61,7 +61,8 @@ + android:theme="@android:style/Theme.NoTitleBar.Fullscreen" + android:screenOrientation="portrait"> diff --git a/res/drawable-hdpi/unknown_person.png b/res/drawable-hdpi/unknown_person.png new file mode 100644 index 0000000000000000000000000000000000000000..0e517993259cd47352c32d642093b4e06bede319 GIT binary patch literal 4619 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 B%o_jz literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/unknown_person.png b/res/drawable-ldpi/unknown_person.png new file mode 100644 index 0000000000000000000000000000000000000000..4425150f288d423128b55612a04896c6d0d1df15 GIT binary patch literal 5539 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 P00000NkvXXu0mjf2AXM> diff --git a/res/layout/conferencing.xml b/res/layout/conferencing.xml index 61791955b..42781aeb8 100644 --- a/res/layout/conferencing.xml +++ b/res/layout/conferencing.xml @@ -54,6 +54,15 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> + + + diff --git a/res/layout/incoming.xml b/res/layout/incoming.xml index 4b0f71816..aab32ea21 100644 --- a/res/layout/incoming.xml +++ b/res/layout/incoming.xml @@ -13,6 +13,11 @@ + extractPhones(String id) { List list = new ArrayList(); Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; + String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER}; String selection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?"; String[] selArgs = new String[] {id}; - Cursor c = this.getContentResolver().query(uri, null, selection, selArgs, null); + Cursor c = this.getContentResolver().query(uri, projection, selection, selArgs, null); int nbId = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); @@ -96,35 +107,41 @@ public class ContactPickerActivityNew extends AbstractContactPickerActivity { protected List extractSipNumbers(String id) { List list = new ArrayList(); Uri uri = ContactsContract.Data.CONTENT_URI; + String[] projection = {ContactsContract.CommonDataKinds.Im.DATA}; String selection = new StringBuilder() - .append(ContactsContract.Data.CONTACT_ID).append(" = ? AND ") - .append(ContactsContract.Data.MIMETYPE).append(" = ? ") - .append(" AND lower(") - .append(ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL) - .append(") = 'sip'").toString(); - String[] selArgs = new String[] {id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; - Cursor c = this.getContentResolver().query(uri, null, selection, selArgs, null); + .append(ContactsContract.Data.CONTACT_ID).append(" = ? AND ") + .append(ContactsContract.Data.MIMETYPE).append(" = '") + .append(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + .append("' AND lower(") + .append(ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL) + .append(") = 'sip'") + .toString(); + Cursor c = getContentResolver().query(uri, projection, selection, new String[]{id}, null); int nbId = c.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA); - while (c.moveToNext()) { list.add("sip:" + c.getString(nbId)); } - c.close(); + // Using the SIP contact field added in SDK 9 if (Version.sdkAboveOrEqual(Version.API09_GINGERBREAD_23)) { - selection = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; - String projection[] = new String[] {ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS}; - selArgs = new String[] {id, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE}; - c = this.getContentResolver().query(uri, projection, selection, selArgs, null); + selection = new StringBuilder() + .append(ContactsContract.Data.CONTACT_ID) + .append(" = ? AND ") + .append(ContactsContract.Data.MIMETYPE) + .append(" = '") + .append(ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE) + .append("'") + .toString(); + projection = new String[] {ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS}; + c = this.getContentResolver().query(uri, projection, selection, new String[]{id}, null); nbId = c.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS); while (c.moveToNext()) { list.add("sip:" + c.getString(nbId)); } - c.close(); } @@ -162,13 +179,14 @@ public class ContactPickerActivityNew extends AbstractContactPickerActivity { private String retrieveContactName(String id) { //Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; Uri uri = ContactsContract.Contacts.CONTENT_URI; + String[] projection = new String[] {ContactsContract.Contacts.DISPLAY_NAME}; String selection = ContactsContract.Contacts._ID + " = ?"; String[] selArgs = new String[] {id}; - Cursor c = this.getContentResolver().query(uri, null, selection, selArgs, null); + Cursor c = this.getContentResolver().query(uri, projection, selection, selArgs, null); String name = ""; if (c.moveToFirst()) { - name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); + name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); } c.close(); @@ -199,4 +217,58 @@ public class ContactPickerActivityNew extends AbstractContactPickerActivity { } + private static Uri retrievePhotoUri(ContentResolver resolver, Cursor c, String column) { + if (c == null) return null; + while (c.moveToNext()) { + long id = c.getLong(c.getColumnIndex(column)); + Uri picture = retrievePhotoUri(resolver, id); + if (picture != null) { + c.close(); + return picture; + } + } + c.close(); + return null; + } + public static Uri findUriPictureOfContact(ContentResolver resolver, String username, String domain) { + Uri retrievedPictureUri = null; + String sipUri = username + "@" + domain; + + // Try first using sip field + Uri uri = ContactsContract.Data.CONTENT_URI; + String[] projection = {ContactsContract.Data.CONTACT_ID}; + String selection = new StringBuilder() + .append(ContactsContract.CommonDataKinds.Im.DATA).append(" = ? AND ") + .append(ContactsContract.Data.MIMETYPE) + .append(" = '") + .append(ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE) + .append("' AND lower(") + .append(ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL) + .append(") = 'sip'").toString(); + Cursor c = resolver.query(uri, projection, selection, new String[] {sipUri}, null); + retrievedPictureUri = retrievePhotoUri(resolver, c, ContactsContract.Data.CONTACT_ID); + if (retrievedPictureUri != null) return retrievedPictureUri; + + + // Then using custom SIP field + if (Version.sdkAboveOrEqual(Version.API09_GINGERBREAD_23)) { + selection = new StringBuilder() + .append(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS) + .append(" = ? AND ") + .append(ContactsContract.Data.MIMETYPE) + .append(" = '") + .append(ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE) + .append("'") + .toString(); + c = resolver.query(uri, projection, selection, new String[] {sipUri}, null); + retrievedPictureUri = retrievePhotoUri(resolver, c, ContactsContract.Data.CONTACT_ID); + if (retrievedPictureUri != null) return retrievedPictureUri; + } + + // Finally using phone number + Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(username)); + projection = new String[]{PhoneLookup._ID}; + c = resolver.query(lookupUri, projection, null, null, null); + return retrievePhotoUri(resolver, c, PhoneLookup._ID); + } } diff --git a/src/org/linphone/ContactPickerActivityOld.java b/src/org/linphone/ContactPickerActivityOld.java index cf7489816..38c939ce5 100644 --- a/src/org/linphone/ContactPickerActivityOld.java +++ b/src/org/linphone/ContactPickerActivityOld.java @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package org.linphone; import android.app.Activity; +import android.content.ContentResolver; import android.content.ContentUris; import android.content.Intent; import android.database.Cursor; @@ -91,4 +92,8 @@ public class ContactPickerActivityOld extends Activity { LinphoneActivity.instance().getTabHost().setCurrentTabByTag(LinphoneActivity.DIALER_TAB); } } + + public static Uri findUriPictureOfContact(ContentResolver resolver, String username, String domain) { + throw new RuntimeException("not implemented"); + } } diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index f81a701d8..fbc1183d4 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -137,8 +137,11 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin mInCallAddressLayout = findViewById(R.id.IncallAddressLayout); mInCallAddressLayout.setVisibility(View.GONE); - if (useIncallActivity) { - mHangup = findViewById(R.id.HangUp); + if (useConferenceActivity) { + mHangup = findViewById(R.id.HangUp); + ((HangCallButton)mHangup).setTerminateAllCalls(true); + } else if (useIncallActivity) { + mHangup = findViewById(R.id.HangUp); } else { mMute = (MuteMicButton) findViewById(R.id.mic_mute_button); mSpeaker = (SpeakerButton) findViewById(R.id.speaker_button); diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java index 5e3bccc3f..5beb9bfbb 100644 --- a/src/org/linphone/IncomingCallActivity.java +++ b/src/org/linphone/IncomingCallActivity.java @@ -18,17 +18,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone; +import static android.view.View.VISIBLE; + import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.Log; import android.app.Activity; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.text.Html.ImageGetter; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.view.View.OnClickListener; +import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -42,6 +47,7 @@ public class IncomingCallActivity extends Activity implements OnClickListener { private TextView mNameView; private TextView mNumberView; + private ImageView mPictureView; private LinphoneCall mCall; private void findIncomingCall(Intent intent) { @@ -62,6 +68,7 @@ public class IncomingCallActivity extends Activity implements OnClickListener { mNameView = (TextView) findViewById(R.id.incoming_caller_name); mNumberView = (TextView) findViewById(R.id.incoming_caller_number); + mPictureView = (ImageView) findViewById(R.id.incoming_picture); findViewById(R.id.Decline).setOnClickListener(this); findViewById(R.id.Answer).setOnClickListener(this); @@ -84,6 +91,11 @@ public class IncomingCallActivity extends Activity implements OnClickListener { String from = LinphoneManager.extractADisplayName(getResources(), address); mNameView.setText(from); mNumberView.setText(address.asStringUriOnly()); + String username = address.getUserName(); + String domain = address.getDomain(); + // May be greatly sped up using a drawable cache + Uri uri = LinphoneUtils.findPictureOfContact(getContentResolver(), username, domain); + LinphoneUtils.setImagePictureFromUri(mPictureView, uri, R.drawable.unknown_person); super.onResume(); } diff --git a/src/org/linphone/LinphoneUtils.java b/src/org/linphone/LinphoneUtils.java index a9c884892..7234b0758 100644 --- a/src/org/linphone/LinphoneUtils.java +++ b/src/org/linphone/LinphoneUtils.java @@ -18,15 +18,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; + import org.linphone.core.Log; +import org.linphone.mediastream.Version; import org.linphone.mediastream.video.capture.hwconf.Hacks; import android.app.Activity; +import android.content.ContentResolver; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; import android.view.KeyEvent; +import android.widget.ImageView; /** - * Helper to handle softvolume. + * Helpers. * @author Guillaume Beraudo * */ @@ -63,5 +74,50 @@ public final class LinphoneUtils { } return !preventVolumeBarToDisplay; } + + + /** + * @param contact sip uri + * @return url/uri of the resource + */ + public static Uri findPictureOfContact(ContentResolver resolver, String username, String domain) { + if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_20)) { + return ContactPickerActivityNew.findUriPictureOfContact(resolver, username, domain); + } else { + return ContactPickerActivityOld.findUriPictureOfContact(resolver, username, domain); + } + } + + public static Bitmap downloadBitmap(Uri uri) { + URL url; + InputStream is = null; + try { + url = new URL(uri.toString()); + is = url.openStream(); + return BitmapFactory.decodeStream(is); + } catch (MalformedURLException e) { + Log.e(e, e.getMessage()); + } catch (IOException e) { + Log.e(e, e.getMessage()); + } finally { + try {is.close();} catch (IOException x) {} + } + return null; + } + + public static void setImagePictureFromUri(ImageView view, Uri uri, int notFoundResource) { + if (uri == null) { + view.setImageResource(notFoundResource); + return; + } + if (uri.getScheme().startsWith("http")) { + Bitmap bm = downloadBitmap(uri); + if (bm == null) view.setImageResource(notFoundResource); + view.setImageBitmap(bm); + } else { + view.setImageURI(uri); + } + } + } diff --git a/src/org/linphone/ui/HangCallButton.java b/src/org/linphone/ui/HangCallButton.java index 706df35ec..9194c844d 100644 --- a/src/org/linphone/ui/HangCallButton.java +++ b/src/org/linphone/ui/HangCallButton.java @@ -29,6 +29,9 @@ import android.widget.ImageButton; public class HangCallButton extends ImageButton implements OnClickListener { + private boolean terminateAllCalls; + public void setTerminateAllCalls(boolean all) {terminateAllCalls = all;} + private OnClickListener externalClickListener; public void setExternalClickListener(OnClickListener e) {externalClickListener = e;} @@ -39,7 +42,11 @@ public class HangCallButton extends ImageButton implements OnClickListener { public void onClick(View v) { LinphoneCore lc = LinphoneManager.getLc(); - lc.terminateCall(lc.getCurrentCall()); + if (terminateAllCalls) { + lc.terminateAllCalls(); + } else { + lc.terminateCall(lc.getCurrentCall()); + } if (externalClickListener != null) externalClickListener.onClick(v); }