initial Controller.sendMessage() and invocation from MessageCompose.

This commit is contained in:
Mihai Preda 2009-07-28 19:41:59 +02:00
parent 3e79032dd1
commit 334903369e
3 changed files with 125 additions and 75 deletions

View File

@ -266,6 +266,56 @@ public class Controller {
return box.mId;
}
/**
* Send a message:
* - move the message to Outbox (the message is assumed to be in Drafts).
* - perform any necessary notification
* - do the work in a separate (non-UI) thread
* @param messageId the id of the message to send
*/
public void sendMessage(long messageId, long accountId) {
ContentResolver resolver = mProviderContext.getContentResolver();
if (accountId == -1) {
accountId = lookupAccountForMessage(messageId);
}
if (accountId == -1) {
// probably the message was not found
if (Email.LOGD) {
Email.log("no account found for message " + messageId);
}
return;
}
// Move to Outbox
long outboxId = findOrCreateMailboxOfType(accountId, Mailbox.TYPE_OUTBOX);
ContentValues cv = new ContentValues();
cv.put(EmailContent.MessageColumns.MAILBOX_KEY, outboxId);
// does this need to be SYNCED_CONTENT_URI instead?
Uri uri = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, messageId);
resolver.update(uri, cv, null, null);
// TODO: notifications
}
/**
* @param messageId the id of message
* @return the accountId corresponding to the given messageId, or -1 if not found.
*/
private long lookupAccountForMessage(long messageId) {
ContentResolver resolver = mProviderContext.getContentResolver();
Cursor c = resolver.query(EmailContent.Message.CONTENT_URI,
MESSAGEID_TO_ACCOUNTID_PROJECTION, EmailContent.RECORD_ID + "=?",
new String[] { Long.toString(messageId) }, null);
try {
return c.moveToFirst()
? c.getLong(MESSAGEID_TO_ACCOUNTID_COLUMN_ACCOUNTID)
: -1;
} finally {
c.close();
}
}
/**
* Delete a single message by moving it to the trash.
*
@ -285,18 +335,10 @@ public class Controller {
// 1. Look up acct# for message we're deleting
Cursor c = null;
if (accountId == -1) {
try {
c = resolver.query(EmailContent.Message.CONTENT_URI,
MESSAGEID_TO_ACCOUNTID_PROJECTION, EmailContent.RECORD_ID + "=?",
new String[] { Long.toString(messageId) }, null);
if (c.moveToFirst()) {
accountId = c.getLong(MESSAGEID_TO_ACCOUNTID_COLUMN_ACCOUNTID);
} else {
return;
}
} finally {
if (c != null) c.close();
}
accountId = lookupAccountForMessage(messageId);
}
if (accountId == -1) {
return;
}
// 2. Confirm that there is a trash mailbox available

View File

@ -28,6 +28,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.util.Log;
import java.io.File;
@ -227,12 +228,16 @@ public class Email extends Application {
*/
BinaryTempFileBody.setTempDirectory(getCacheDir());
}
/**
* Internal, utility method for logging.
* The calls to log() must be guarded with "if (Email.LOGD)" for performance reasons.
*/
public static void log(String message) {
if (!Email.LOGD) {
// somebody called log() without the guard.
throw new IllegalStateException("Must guard with \"if (Email.LOGD)\"");
}
Log.d(LOG_TAG, message);
}
}

View File

@ -455,14 +455,14 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
@Override
public void onResume() {
super.onResume();
MessagingController.getInstance(getApplication()).addListener(mListener);
mController.addResultCallback(mListener);
}
@Override
public void onPause() {
super.onPause();
saveIfNeeded();
MessagingController.getInstance(getApplication()).removeListener(mListener);
mController.removeResultCallback(mListener);
}
/**
@ -694,23 +694,33 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
// message.setBody(body);
// }
private void sendOrSaveMessage(boolean save) {
final String action = getIntent().getAction();
if (save) {
/*
* Save a draft
*/
if (ACTION_EDIT_DRAFT.equals(action)) {
// The update doesn't modify the mailboxKey,
// so just keep the same mailbox which is already DRAFTS.
// TODO: move out of UI thread
Message message = updateMessage(mSourceMessage);
message.update(getApplication(), getUpdateContentValues(message));
} else {
Message message = updateMessage(null);
mController.saveToMailbox(message, EmailContent.Mailbox.TYPE_DRAFTS);
}
/**
* Send a message:
* save to Drafts and invoke Controller.sendMessage().
*/
private void sendMessage() {
Message message = saveMessage();
mController.sendMessage(message.mId, message.mAccountKey);
}
/**
* Save a draft
* @return the id of the saved message.
*/
private Message saveMessage() {
final String action = getIntent().getAction();
Message message;
if (ACTION_EDIT_DRAFT.equals(action)) {
// The update doesn't modify the mailboxKey,
// so just keep the same mailbox which is already DRAFTS.
// TODO: move out of UI thread
message = updateMessage(mSourceMessage);
message.update(getApplication(), getUpdateContentValues(message));
} else {
message = updateMessage(null);
mController.saveToMailbox(message, EmailContent.Mailbox.TYPE_DRAFTS);
}
// if (mDraftUid != null) {
// message.setUid(mDraftUid);
// }
@ -725,30 +735,10 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
// mDraftUid = message.getUid();
// Don't display the toast if the user is just changing the orientation
if ((getChangingConfigurations() & ActivityInfo.CONFIG_ORIENTATION) == 0) {
mHandler.sendEmptyMessage(MSG_SAVED_DRAFT);
}
if ((getChangingConfigurations() & ActivityInfo.CONFIG_ORIENTATION) == 0) {
mHandler.sendEmptyMessage(MSG_SAVED_DRAFT);
}
// else {
// /*
// * Send the message
// * If the source message is in other folder than draft, it should not be deleted while
// * sending message.
// */
// if (ACTION_EDIT_DRAFT.equals(getIntent().getAction())
// && mSourceMessageUid != null
// && mFolder.equals(mAccount.getDraftsFolderName(this))) {
// /*
// * We're sending a previously saved draft, so delete the old draft first.
// */
// MessagingController.getInstance(getApplication()).deleteMessage(
// mAccount,
// mFolder,
// mSourceMessage,
// null);
// }
// MessagingController.getInstance(getApplication()).sendMessage(mAccount, message, null);
// }
return message;
}
private void saveIfNeeded() {
@ -756,7 +746,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
return;
}
mDraftNeedsSaving = false;
sendOrSaveMessage(true);
saveMessage();
}
/**
@ -784,7 +774,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
Toast.makeText(this, getString(R.string.message_compose_error_no_recipients),
Toast.LENGTH_LONG).show();
} else {
sendOrSaveMessage(false);
sendMessage();
mDraftNeedsSaving = false;
finish();
}
@ -1244,13 +1234,26 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
}
}
class Listener extends MessagingListener {
@Override
public void loadMessageForViewStarted(Account account, String folder,
String uid) {
mHandler.sendEmptyMessage(MSG_PROGRESS_ON);
class Listener implements Controller.Result {
public void updateMailboxListCallback(MessagingException result, long accountId) {
}
public void updateMailboxCallback(MessagingException result, long accountId,
long mailboxId, int totalMessagesInMailbox, int numNewMessages) {
}
public void loadAttachmentCallback(MessagingException result, long messageId,
long attachmentId, int progress, Object tag) {
}
}
// class Listener extends MessagingListener {
// @Override
// public void loadMessageForViewStarted(Account account, String folder,
// String uid) {
// mHandler.sendEmptyMessage(MSG_PROGRESS_ON);
// }
// @Override
// public void loadMessageForViewFinished(Account account, String folder,
// String uid, Message message) {
@ -1269,11 +1272,11 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
// });
// }
@Override
public void loadMessageForViewFailed(Account account, String folder, String uid,
final String message) {
mHandler.sendEmptyMessage(MSG_PROGRESS_OFF);
// TODO show network error
}
}
// @Override
// public void loadMessageForViewFailed(Account account, String folder, String uid,
// final String message) {
// mHandler.sendEmptyMessage(MSG_PROGRESS_OFF);
// // TODO show network error
// }
// }
}