Add "favorite" star to MessageView

* Shown next to subject (non-final layout)
* Value taken from provider data
* Tapping star toggles state
* State writes back to provider

NOTE:  I am currently doing the provider writeback via direct provider
calls (using the synced-message URI) but not doing it with a service call,
so at this point there is no triggering of any server-side update.
However a sync engine might "discover" the change.

NOTE:  I made a global change of "mMessage" to "mOldMessage" because
there is still a lot of legacy code in MessageView and I wanted to clearly
demarcate the code that still needs to be redone.
This commit is contained in:
Andrew Stadler 2009-07-01 12:11:47 -07:00
parent 696b8749b5
commit 48c8cc34b7
2 changed files with 85 additions and 35 deletions

View File

@ -112,15 +112,27 @@
android:singleLine="false"
android:ellipsize="none" />
</LinearLayout>
<TextView
android:id="@+id/subject"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondaryInverse"
android:textStyle="bold"
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:ellipsize="none" />
android:layout_height="wrap_content" >
<TextView
android:id="@+id/subject"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondaryInverse"
android:textStyle="bold"
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:singleLine="false"
android:ellipsize="none" />
<!-- TODO: Move this to wherever it really belongs -->
<ImageView
android:id="@+id/favorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:src="@android:drawable/star_off" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/show_pictures_section"

View File

@ -39,11 +39,14 @@ import org.apache.commons.io.IOUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
@ -121,6 +124,7 @@ public class MessageView extends Activity
private WebView mMessageContentView;
private LinearLayout mAttachments;
private ImageView mAttachmentIcon;
private ImageView mFavoriteIcon;
private View mShowPicturesSection;
private ImageView mSenderPresenceView;
private ProgressDialog mProgressDialog;
@ -128,6 +132,7 @@ public class MessageView extends Activity
private long mAccountId;
private EmailContent.Account mAccount;
private long mMessageId;
private EmailContent.Message mMessage;
private LoadMessageTask mLoadMessageTask;
private LoadBodyTask mLoadBodyTask;
@ -136,11 +141,15 @@ public class MessageView extends Activity
private String mMessageUid;
private Cursor mMessageListCursor;
private Message mMessage;
// TODO all uses of this need to be converted to "mMessage". Then mOldMessage goes away.
private Message mOldMessage;
private java.text.DateFormat mDateFormat;
private java.text.DateFormat mTimeFormat;
private Drawable mFavoriteIconOn;
private Drawable mFavoriteIconOff;
private Listener mListener = new Listener();
private MessageViewHandler mHandler = new MessageViewHandler();
@ -376,6 +385,7 @@ public class MessageView extends Activity
mMessageContentView = (WebView) findViewById(R.id.message_content);
mAttachments = (LinearLayout) findViewById(R.id.attachments);
mAttachmentIcon = (ImageView) findViewById(R.id.attachment);
mFavoriteIcon = (ImageView) findViewById(R.id.favorite);
mShowPicturesSection = findViewById(R.id.show_pictures_section);
mSenderPresenceView = (ImageView) findViewById(R.id.presence);
mProgressDialog = new ProgressDialog(this);
@ -388,6 +398,7 @@ public class MessageView extends Activity
mFromView.setOnClickListener(this);
mSenderPresenceView.setOnClickListener(this);
mFavoriteIcon.setOnClickListener(this);
findViewById(R.id.reply).setOnClickListener(this);
findViewById(R.id.reply_all).setOnClickListener(this);
findViewById(R.id.delete).setOnClickListener(this);
@ -397,10 +408,13 @@ public class MessageView extends Activity
mMessageContentView.getSettings().setSupportZoom(false);
setTitle("");
mDateFormat = android.text.format.DateFormat.getDateFormat(this); // short format
mTimeFormat = android.text.format.DateFormat.getTimeFormat(this); // 12/24 date format
mFavoriteIconOn = getResources().getDrawable(android.R.drawable.star_on);
mFavoriteIconOff = getResources().getDrawable(android.R.drawable.star_off);
Intent intent = getIntent();
mMessageId = intent.getLongExtra(EXTRA_MESSAGE_ID, -1);
// mAccountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1);
@ -461,7 +475,7 @@ public class MessageView extends Activity
public void onResume() {
super.onResume();
MessagingController.getInstance(getApplication()).addListener(mListener);
if (mMessage != null) {
if (mOldMessage != null) {
startPresenceCheck();
}
}
@ -499,11 +513,11 @@ public class MessageView extends Activity
}
private void onDelete() {
if (mMessage != null) {
if (mOldMessage != null) {
MessagingController.getInstance(getApplication()).deleteMessage(
mAccount,
mFolder,
mMessage,
mOldMessage,
null);
Toast.makeText(this, R.string.message_deleted_toast, Toast.LENGTH_SHORT).show();
@ -518,9 +532,9 @@ public class MessageView extends Activity
}
private void onClickSender() {
if (mMessage != null) {
if (mOldMessage != null) {
try {
Address senderEmail = mMessage.getFrom()[0];
Address senderEmail = mOldMessage.getFrom()[0];
Uri contactUri = Uri.fromParts("mailto", senderEmail.getAddress(), null);
Intent contactIntent = new Intent(Contacts.Intents.SHOW_OR_CREATE_CONTACT);
@ -545,23 +559,42 @@ public class MessageView extends Activity
}
}
private void onReply() {
/**
* Toggle favorite status and write back to provider
*/
private void onClickFavorite() {
if (mMessage != null) {
MessageCompose.actionReply(this, mAccountId, mMessage, false);
// Update UI
boolean newFavorite = ! mMessage.mFlagFavorite;
mFavoriteIcon.setImageDrawable(newFavorite ? mFavoriteIconOn : mFavoriteIconOff);
// Update provider
mMessage.mFlagFavorite = newFavorite;
ContentValues cv = new ContentValues();
cv.put(EmailContent.MessageColumns.FLAG_FAVORITE, newFavorite ? 1 : 0);
Uri uri = ContentUris.withAppendedId(
EmailContent.Message.SYNCED_CONTENT_URI, mMessageId);
getContentResolver().update(uri, cv, null, null);
}
}
private void onReply() {
if (mOldMessage != null) {
MessageCompose.actionReply(this, mAccountId, mOldMessage, false);
finish();
}
}
private void onReplyAll() {
if (mMessage != null) {
MessageCompose.actionReply(this, mAccountId, mMessage, true);
if (mOldMessage != null) {
MessageCompose.actionReply(this, mAccountId, mOldMessage, true);
finish();
}
}
private void onForward() {
if (mMessage != null) {
MessageCompose.actionForward(this, mAccountId, mMessage);
if (mOldMessage != null) {
MessageCompose.actionForward(this, mAccountId, mOldMessage);
finish();
}
}
@ -587,11 +620,11 @@ public class MessageView extends Activity
}
private void onMarkAsUnread() {
if (mMessage != null) {
if (mOldMessage != null) {
MessagingController.getInstance(getApplication()).markMessageRead(
mAccount,
mFolder,
mMessage.getUid(),
mOldMessage.getUid(),
false);
}
}
@ -641,7 +674,7 @@ public class MessageView extends Activity
}
MessagingController.getInstance(getApplication()).loadAttachment(
mAccount,
mMessage,
mOldMessage,
attachment.part,
new Object[] { true, attachment },
mListener);
@ -650,14 +683,14 @@ public class MessageView extends Activity
private void onViewAttachment(Attachment attachment) {
MessagingController.getInstance(getApplication()).loadAttachment(
mAccount,
mMessage,
mOldMessage,
attachment.part,
new Object[] { false, attachment },
mListener);
}
private void onShowPictures() {
if (mMessage != null) {
if (mOldMessage != null) {
mMessageContentView.getSettings().setBlockNetworkImage(false);
mShowPicturesSection.setVisibility(View.GONE);
}
@ -669,6 +702,9 @@ public class MessageView extends Activity
case R.id.presence:
onClickSender();
break;
case R.id.favorite:
onClickFavorite();
break;
case R.id.reply:
onReply();
break;
@ -885,8 +921,8 @@ public class MessageView extends Activity
private void startPresenceCheck() {
String email = null;
try {
if (mMessage != null) {
Address sender = mMessage.getFrom()[0];
if (mOldMessage != null) {
Address sender = mOldMessage.getFrom()[0];
email = sender.getAddress();
}
} catch (MessagingException me) {
@ -1027,6 +1063,7 @@ public class MessageView extends Activity
*/
private void reloadUiFromCursor(Cursor cursor) {
EmailContent.Message message = EmailContent.getContent(cursor, EmailContent.Message.class);
mMessage = message;
mSubjectView.setText(message.mSubject);
mFromView.setText(Address.toFriendly(Address.unpack(message.mFrom)));
@ -1037,7 +1074,8 @@ public class MessageView extends Activity
mCcView.setText(Address.toFriendly(Address.unpack(message.mCc)));
mCcContainerView.setVisibility((message.mCc != null) ? View.VISIBLE : View.GONE);
mAttachmentIcon.setVisibility(message.mAttachments != null ? View.VISIBLE : View.GONE);
mFavoriteIcon.setImageDrawable(message.mFlagFavorite ? mFavoriteIconOn : mFavoriteIconOff);
// Ask for body
mLoadBodyTask = new LoadBodyTask(message.mId);
mLoadBodyTask.execute();
@ -1113,7 +1151,7 @@ public class MessageView extends Activity
@Override
public void loadMessageForViewHeadersAvailable(EmailContent.Account account, String folder,
String uid, final Message message) {
MessageView.this.mMessage = message;
MessageView.this.mOldMessage = message;
try {
String subjectText = message.getSubject();
String fromText = Address.toFriendly(message.getFrom());
@ -1143,17 +1181,17 @@ public class MessageView extends Activity
@Override
public void loadMessageForViewBodyAvailable(EmailContent.Account account, String folder,
String uid, Message message) {
MessageView.this.mMessage = message;
MessageView.this.mOldMessage = message;
try {
Part part = MimeUtility.findFirstPartByMimeType(mMessage, "text/html");
Part part = MimeUtility.findFirstPartByMimeType(mOldMessage, "text/html");
if (part == null) {
part = MimeUtility.findFirstPartByMimeType(mMessage, "text/plain");
part = MimeUtility.findFirstPartByMimeType(mOldMessage, "text/plain");
}
if (part != null) {
String text = MimeUtility.getTextFromPart(part);
if (part.getMimeType().equalsIgnoreCase("text/html")) {
text = EmailHtmlUtil.resolveInlineImage(
getContentResolver(), mAccount, text, mMessage, 0);
getContentResolver(), mAccount, text, mOldMessage, 0);
} else {
// And also escape special character, such as "<>&",
// to HTML escape sequence.
@ -1213,7 +1251,7 @@ public class MessageView extends Activity
else {
loadMessageContentUrl("file:///android_asset/empty.html");
}
renderAttachments(mMessage, 0);
renderAttachments(mOldMessage, 0);
}
catch (Exception e) {
if (Config.LOGV) {