Email MessageView: Bug 2053500, presence.

- fix the query for presence status.
- put it in an AsyncTask instead of Thread, remove from Handler.
- set the target rect when invoking the presence bar.
This commit is contained in:
Mihai Preda 2009-09-01 20:02:39 +02:00
parent 9b9a2e69b9
commit 62fb7cf5f5

View File

@ -43,6 +43,7 @@ import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.graphics.Rect;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
@ -53,6 +54,9 @@ import android.os.Handler;
import android.provider.Contacts;
import android.provider.Contacts.Intents;
import android.provider.Contacts.People;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Presence;
import android.provider.ContactsContract.CommonDataKinds;
import android.text.util.Regex;
import android.view.LayoutInflater;
import android.view.Menu;
@ -80,12 +84,6 @@ public class MessageView extends Activity implements OnClickListener {
private static final String EXTRA_MESSAGE_ID = "com.android.email.MessageView_message_id";
private static final String EXTRA_MAILBOX_ID = "com.android.email.MessageView_mailbox_id";
private static final String[] METHODS_WITH_PRESENCE_PROJECTION = new String[] {
People.ContactMethods._ID, // 0
// People.PRESENCE_STATUS, // 1
};
private static final int METHODS_STATUS_COLUMN = 1;
// Regex that matches start of img tag. '<(?i)img\s+'.
private static final Pattern IMG_TAG_START_REGEX = Pattern.compile("<(?i)img\\s+");
// Regex that matches Web URL protocol part as case insensitive.
@ -96,6 +94,10 @@ public class MessageView extends Activity implements OnClickListener {
Body.RECORD_ID, BodyColumns.MESSAGE_KEY,
BodyColumns.HTML_CONTENT, BodyColumns.TEXT_CONTENT
};
private static final String[] PRESENCE_STATUS_PROJECTION =
new String[] { Presence.PRESENCE_STATUS };
private static final int BODY_CONTENT_COLUMN_RECORD_ID = 0;
private static final int BODY_CONTENT_COLUMN_MESSAGE_KEY = 1;
private static final int BODY_CONTENT_COLUMN_HTML_CONTENT = 2;
@ -125,6 +127,7 @@ public class MessageView extends Activity implements OnClickListener {
private LoadMessageTask mLoadMessageTask;
private LoadBodyTask mLoadBodyTask;
private LoadAttachmentsTask mLoadAttachmentsTask;
private PresenceCheckTask mPresenceCheckTask;
private long mLoadAttachmentId; // the attachment being saved/viewed
private boolean mLoadAttachmentSave; // if true, saving - if false, viewing
@ -156,7 +159,6 @@ public class MessageView extends Activity implements OnClickListener {
private static final int MSG_SET_ATTACHMENTS_ENABLED = 4;
private static final int MSG_NETWORK_ERROR = 6;
private static final int MSG_FETCHING_ATTACHMENT = 10;
private static final int MSG_SET_SENDER_PRESENCE = 11;
private static final int MSG_VIEW_ATTACHMENT_ERROR = 12;
private static final int MSG_UPDATE_ATTACHMENT_ICON = 18;
private static final int MSG_FINISH_LOAD_ATTACHMENT = 19;
@ -200,9 +202,6 @@ public class MessageView extends Activity implements OnClickListener {
getString(R.string.message_view_fetching_attachment_toast),
Toast.LENGTH_SHORT).show();
break;
case MSG_SET_SENDER_PRESENCE:
updateSenderPresence(msg.arg1);
break;
case MSG_VIEW_ATTACHMENT_ERROR:
Toast.makeText(MessageView.this,
getString(R.string.message_view_display_attachment_toast),
@ -253,12 +252,6 @@ public class MessageView extends Activity implements OnClickListener {
sendEmptyMessage(MSG_FETCHING_ATTACHMENT);
}
public void setSenderPresence(int presenceIconId) {
android.os.Message
.obtain(this, MSG_SET_SENDER_PRESENCE, presenceIconId, 0)
.sendToTarget();
}
public void attachmentViewError() {
sendEmptyMessage(MSG_VIEW_ATTACHMENT_ERROR);
}
@ -405,6 +398,8 @@ public class MessageView extends Activity implements OnClickListener {
mLoadAttachmentsTask = null;
cancelTask(mLoadPrevNextTask);
mLoadPrevNextTask = null;
cancelTask(mPresenceCheckTask);
mPresenceCheckTask = null;
}
/**
@ -438,6 +433,14 @@ public class MessageView extends Activity implements OnClickListener {
}
}
private Rect getAbsoluteRect(View view) {
int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
return new Rect(x, y, x + view.getWidth(), y + view.getHeight());
}
private void onClickSender() {
if (mMessage != null) {
Address senderEmail = Address.unpackFirst(mMessage.mFrom);
@ -457,6 +460,8 @@ public class MessageView extends Activity implements OnClickListener {
contactIntent.putExtra(Intents.Insert.NAME, senderPersonal);
}
contactIntent.putExtra(Intents.EXTRA_TARGET_RECT,
getAbsoluteRect(mSenderPresenceView));
startActivity(contactIntent);
}
}
@ -866,7 +871,33 @@ public class MessageView extends Activity implements OnClickListener {
mAttachments.addView(view);
mAttachments.setVisibility(View.VISIBLE);
}
private class PresenceCheckTask extends AsyncTask<String, Void, Integer> {
@Override
protected Integer doInBackground(String... emails) {
Cursor cursor =
getContentResolver().query(ContactsContract.Data.CONTENT_WITH_PRESENCE_URI,
PRESENCE_STATUS_PROJECTION, CommonDataKinds.Email.DATA + "=?", emails, null);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
int status = cursor.getInt(0);
int icon = Presence.getPresenceIconResourceId(status);
return icon;
}
} finally {
cursor.close();
}
}
return 0;
}
@Override
protected void onPostExecute(Integer icon) {
updateSenderPresence(icon);
}
}
/**
* Launch a thread (because of cross-process DB lookup) to check presence of the sender of the
* message. When that thread completes, update the UI.
@ -881,44 +912,18 @@ public class MessageView extends Activity implements OnClickListener {
* sufficient.
*/
private void startPresenceCheck() {
String email = null;
if (mMessage != null) {
Address sender = Address.unpackFirst(mMessage.mFrom);
email = sender != null ? sender.getAddress() : null;
}
if (email == null) {
mHandler.setSenderPresence(0);
return;
}
final String senderEmail = email;
/*
new Thread() {
@Override
public void run() {
Cursor methodsCursor = getContentResolver().query(
Uri.withAppendedPath(Contacts.ContactMethods.CONTENT_URI, "with_presence"),
METHODS_WITH_PRESENCE_PROJECTION,
Contacts.ContactMethods.DATA + "=?",
new String[]{ senderEmail },
null);
int presenceIcon = 0;
if (methodsCursor != null) {
if (methodsCursor.moveToFirst() &&
!methodsCursor.isNull(METHODS_STATUS_COLUMN)) {
// presenceIcon = Presence.getPresenceIconResourceId(
// methodsCursor.getInt(METHODS_STATUS_COLUMN));
}
methodsCursor.close();
if (sender != null) {
String email = sender.getAddress();
if (email != null) {
mPresenceCheckTask = new PresenceCheckTask();
mPresenceCheckTask.execute(email);
return;
}
mHandler.setSenderPresence(presenceIcon);
}
}.start();
*/
}
updateSenderPresence(0);
}
/**
@ -1017,6 +1022,7 @@ public class MessageView extends Activity implements OnClickListener {
} else {
// toast? why would this fail?
}
startPresenceCheck();
}
}