Merge change 25293 into eclair

* changes:
  Fix a handful of bugs in the ContactHeaderWidget
This commit is contained in:
Android (Google) Code Review
2009-09-16 17:38:53 -04:00
4 changed files with 106 additions and 89 deletions

View File

@@ -42,6 +42,7 @@ import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.FasttrackBadgeWidget;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -64,15 +65,13 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
private TextView mDisplayNameView;
private TextView mPhoneticNameView;
private CheckBox mStarredView;
private ImageView mPhotoView;
private FasttrackBadgeWidget mPhotoView;
private ImageView mPresenceView;
private TextView mStatusView;
private int mNoPhotoResource;
private QueryHandler mQueryHandler;
protected long mContactId;
protected Uri mContactUri;
protected Uri mStatusUri;
protected String[] mExcludeMimes = null;
@@ -94,6 +93,8 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
Contacts.STARRED,
Contacts.PHOTO_ID,
Contacts.PRESENCE_STATUS,
Contacts._ID,
Contacts.LOOKUP_KEY,
};
protected static final int HEADER_DISPLAY_NAME_COLUMN_INDEX = 0;
//TODO: We need to figure out how we're going to get the phonetic name.
@@ -101,6 +102,8 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
protected static final int HEADER_STARRED_COLUMN_INDEX = 1;
protected static final int HEADER_PHOTO_ID_COLUMN_INDEX = 2;
protected static final int HEADER_PRESENCE_STATUS_COLUMN_INDEX = 3;
protected static final int HEADER_CONTACT_ID_COLUMN_INDEX = 4;
protected static final int HEADER_LOOKUP_KEY_COLUMN_INDEX = 5;
//Projection used for finding the most recent social status.
protected static final String[] SOCIAL_PROJECTION = new String[] {
@@ -113,18 +116,29 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
//Projection used for looking up contact id from phone number
protected static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
PhoneLookup._ID,
PhoneLookup.LOOKUP_KEY,
};
protected static final int PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0;
protected static final int PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1;
//Projection used for looking up contact id from email address
protected static final String[] EMAIL_LOOKUP_PROJECTION = new String[] {
RawContacts.CONTACT_ID,
Contacts.LOOKUP_KEY,
};
protected static final int EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0;
protected static final int EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1;
protected static final String[] CONTACT_LOOKUP_PROJECTION = new String[] {
Contacts._ID,
};
protected static final int CONTACT_LOOKUP_ID_COLUMN_INDEX = 0;
private static final int TOKEN_CONTACT_INFO = 0;
private static final int TOKEN_SOCIAL = 1;
private static final int TOKEN_PHONE_LOOKUP = 2;
private static final int TOKEN_EMAIL_LOOKUP = 3;
private static final int TOKEN_LOOKUP_CONTACT_FOR_SOCIAL_QUERY = 4;
public ContactHeaderWidget(Context context) {
this(context, null);
@@ -151,8 +165,7 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
mStarredView = (CheckBox)findViewById(R.id.star);
mStarredView.setOnClickListener(this);
mPhotoView = (ImageView)findViewById(R.id.photo);
mPhotoView.setOnClickListener(this);
mPhotoView = (FasttrackBadgeWidget) findViewById(R.id.photo);
mPhotoView.setOnLongClickListener(this);
mPresenceView = (ImageView) findViewById(R.id.presence);
@@ -217,12 +230,46 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
try{
if (token == TOKEN_CONTACT_INFO) {
bindContactInfo(cursor);
invalidate();
} else if (token == TOKEN_SOCIAL) {
bindSocial(cursor);
invalidate();
switch (token) {
case TOKEN_CONTACT_INFO: {
bindContactInfo(cursor);
invalidate();
break;
}
case TOKEN_SOCIAL: {
bindSocial(cursor);
invalidate();
break;
}
case TOKEN_PHONE_LOOKUP: {
if (cursor != null && cursor.moveToFirst()) {
long contactId = cursor.getLong(PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX);
String lookupKey = cursor.getString(
PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX);
bindFromContactUri(Contacts.getLookupUri(contactId, lookupKey));
} else {
setDisplayName((String) cookie, null);
}
break;
}
case TOKEN_EMAIL_LOOKUP: {
if (cursor != null && cursor.moveToFirst()) {
long contactId = cursor.getLong(EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX);
String lookupKey = cursor.getString(
EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX);
bindFromContactUri(Contacts.getLookupUri(contactId, lookupKey));
} else {
setDisplayName((String) cookie, null);
}
break;
}
case TOKEN_LOOKUP_CONTACT_FOR_SOCIAL_QUERY: {
if (cursor != null && cursor.moveToFirst()) {
long contactId = cursor.getLong(CONTACT_LOOKUP_ID_COLUMN_INDEX);
startSocialQuery(ContentUris.withAppendedId(
Activities.CONTENT_CONTACT_STATUS_URI, contactId));
}
}
}
} finally {
if (cursor != null) {
@@ -300,33 +347,31 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
* Convenience method for binding all available data from an existing
* contact.
*
* @param contactId the contact id of the contact whose info should be displayed.
* @param conatctUri a {Contacts.CONTENT_LOOKUP_URI} style URI.
*/
public void bindFromContactId(long contactId) {
mContactId = contactId;
mContactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mContactId);
public void bindFromContactLookupUri(Uri contactLookupUri) {
mContactUri = contactLookupUri;
bindContactUri(mContactUri);
bindSocialUri(ContentUris.withAppendedId(Activities.CONTENT_CONTACT_STATUS_URI, mContactId));
// Query for the contactId so we can do the social query.
mQueryHandler.startQuery(TOKEN_LOOKUP_CONTACT_FOR_SOCIAL_QUERY, null, contactLookupUri,
CONTACT_LOOKUP_PROJECTION, null, null, null);
startContactQuery(contactLookupUri);
}
/**
* Convenience method for binding {@link Contacts} header details from a
* {@link Contacts#CONTENT_URI} reference.
* Convenience method for binding all available data from an existing
* contact.
*
* @param conatctUri a {Contacts.CONTENT_URI} style URI.
*/
public void bindContactUri(Uri contactUri) {
mQueryHandler.startQuery(TOKEN_CONTACT_INFO, null, contactUri, HEADER_PROJECTION,
null, null, null);
}
public void bindFromContactUri(Uri contactUri) {
mContactUri = contactUri;
long contactId = ContentUris.parseId(contactUri);
/**
* Convenience method for binding {@link Activities} header details from a
* {@link Activities#CONTENT_CONTACT_STATUS_URI}.
*/
public void bindSocialUri(Uri contactSocial) {
mStatusUri = contactSocial;
mQueryHandler.startQuery(TOKEN_SOCIAL, null, mStatusUri, SOCIAL_PROJECTION, null, null,
null);
startContactQuery(contactUri);
startSocialQuery(ContentUris.withAppendedId(
Activities.CONTENT_CONTACT_STATUS_URI, contactId));
}
/**
@@ -338,21 +383,9 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
* address, one of them will be chosen to bind to.
*/
public void bindFromEmail(String emailAddress) {
Cursor c = null;
try {
c = mContentResolver.query(Uri.withAppendedPath(Email.CONTENT_FILTER_EMAIL_URI, Uri
.encode(emailAddress)), EMAIL_LOOKUP_PROJECTION, null, null, null);
if (c != null && c.moveToFirst()) {
long contactId = c.getLong(EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX);
bindFromContactId(contactId);
} else {
setDisplayName(emailAddress, null);
}
} finally {
if (c != null) {
c.close();
}
}
mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, emailAddress,
Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress)),
EMAIL_LOOKUP_PROJECTION, null, null, null);
}
/**
@@ -364,22 +397,19 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
* number, one of them will be chosen to bind to.
*/
public void bindFromPhoneNumber(String number) {
Cursor c = null;
try {
c = mContentResolver.query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)),
PHONE_LOOKUP_PROJECTION, null, null, null);
if (c != null && c.moveToFirst()) {
long contactId = c.getLong(PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX);
bindFromContactId(contactId);
} else {
setDisplayName(number, null);
}
} finally {
if (c != null) {
c.close();
}
}
mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, number,
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number),
PHONE_LOOKUP_PROJECTION, null, null, null);
}
private void startSocialQuery(Uri contactSocial) {
mQueryHandler.startQuery(TOKEN_SOCIAL, null, contactSocial, SOCIAL_PROJECTION, null, null,
null);
}
private void startContactQuery(Uri contactUri) {
mQueryHandler.startQuery(TOKEN_CONTACT_INFO, null, contactUri, HEADER_PROJECTION,
null, null, null);
}
/**
@@ -390,6 +420,8 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
// TODO: Bring back phonetic name
final String displayName = c.getString(HEADER_DISPLAY_NAME_COLUMN_INDEX);
final long contactId = c.getLong(HEADER_CONTACT_ID_COLUMN_INDEX);
final String lookupKey = c.getString(HEADER_LOOKUP_KEY_COLUMN_INDEX);
final String phoneticName = null;
this.setDisplayName(displayName, null);
@@ -402,6 +434,7 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
photoBitmap = loadPlaceholderPhoto(null);
}
mPhotoView.setImageBitmap(photoBitmap);
mPhotoView.assignContactUri(Contacts.getLookupUri(contactId, lookupKey));
//Set the presence status
int presence = c.getInt(HEADER_PRESENCE_STATUS_COLUMN_INDEX);
@@ -423,27 +456,11 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList
return;
}
switch (view.getId()) {
case R.id.star: {
// Toggle "starred" state
final ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, mStarredView.isChecked());
mContentResolver.update(mContactUri, values, null, null);
break;
}
case R.id.photo: {
// Photo launches contact detail action
final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, mContactUri);
final Rect target = getTargetRect(view);
intent.putExtra(Intents.EXTRA_TARGET_RECT, target);
intent.putExtra(Intents.EXTRA_MODE, Intents.MODE_SMALL);
if (mExcludeMimes != null) {
// Exclude specific MIME-types when requested
intent.putExtra(Intents.EXTRA_EXCLUDE_MIMES, mExcludeMimes);
}
mContext.startActivity(intent);
break;
}
if (view.getId() == R.id.star) {
// Toggle "starred" state
final ContentValues values = new ContentValues(1);
values.put(Contacts.STARRED, mStarredView.isChecked());
mContentResolver.update(mContactUri, values, null, null);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -19,17 +19,17 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/title_bar_tall"
android:background="@drawable/title_bar_medium"
android:paddingRight="5dip"
android:gravity="center_vertical">
<ImageView android:id="@+id/photo"
android:layout_width="56dip"
android:layout_height="62dip"
<android.widget.FasttrackBadgeWidget android:id="@+id/photo"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_marginLeft="10dip"
android:scaleType="fitCenter"
android:background="@drawable/fasttrack_badge_middle_large"/>
style="@*android:style/Widget.FasttrackBadgeWidget.WindowSmall" />
/>
<LinearLayout
android:layout_width="0dip"