Clean up Exchange code

Clean up imports to point to the com.android.exchange version of EmailContent
Clean up some line wrapping
Update EmailContent with latest version from Email project
This commit is contained in:
Marc Blank 2009-06-23 17:50:42 -07:00
parent dd46221bd8
commit 09d13e6295
10 changed files with 196 additions and 169 deletions

View File

@ -24,7 +24,12 @@ import java.util.GregorianCalendar;
import java.util.TimeZone;
import com.android.email.provider.EmailProvider;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Account;
import com.android.exchange.EmailContent.Attachment;
import com.android.exchange.EmailContent.Mailbox;
import com.android.exchange.EmailContent.Message;
import com.android.exchange.EmailContent.MessageColumns;
import com.android.exchange.EmailContent.SyncColumns;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
@ -41,11 +46,11 @@ public class EasEmailSyncParser extends EasParser {
private static final String TAG = "EmailSyncParser";
private EmailContent.Account mAccount;
private Account mAccount;
private EasService mService;
private ContentResolver mContentResolver;
private Context mContext;
private EmailContent.Mailbox mMailbox;
private Mailbox mMailbox;
protected boolean mMoreAvailable = false;
String[] bindArgument = new String[1];
@ -75,8 +80,8 @@ public class EasEmailSyncParser extends EasParser {
mMailbox.mSyncKey = "0";
Log.w(TAG, "Bad sync key; RESET and delete mailbox contents");
mContext.getContentResolver()
.delete(EmailContent.Message.CONTENT_URI,
EmailContent.Message.MAILBOX_KEY + "=" + mMailbox.mId, null);
.delete(Message.CONTENT_URI,
Message.MAILBOX_KEY + "=" + mMailbox.mId, null);
mMoreAvailable = true;
}
}
@ -96,8 +101,8 @@ public class EasEmailSyncParser extends EasParser {
mMailbox.saveOrUpdate(mContext);
}
public void addParser(ArrayList<EmailContent.Message> emails) throws IOException {
EmailContent.Message msg = new EmailContent.Message();
public void addParser(ArrayList<Message> emails) throws IOException {
Message msg = new Message();
String to = "";
String from = "";
String cc = "";
@ -105,9 +110,9 @@ public class EasEmailSyncParser extends EasParser {
int size = 0;
msg.mAccountKey = mAccount.mId;
msg.mMailboxKey = mMailbox.mId;
msg.mFlagLoaded = EmailContent.Message.LOADED;
msg.mFlagLoaded = Message.LOADED;
ArrayList<EmailContent.Attachment> atts = new ArrayList<EmailContent.Attachment>();
ArrayList<Attachment> atts = new ArrayList<Attachment>();
boolean inData = false;
while (nextTag(EasTags.SYNC_ADD) != END) {
@ -197,7 +202,7 @@ public class EasEmailSyncParser extends EasParser {
emails.add(msg);
}
public void attachmentParser(ArrayList<EmailContent.Attachment> atts, EmailContent.Message msg)
public void attachmentParser(ArrayList<Attachment> atts, Message msg)
throws IOException {
String fileName = null;
String length = null;
@ -220,7 +225,7 @@ public class EasEmailSyncParser extends EasParser {
}
if (fileName != null && length != null && lvl != null) {
EmailContent.Attachment att = new EmailContent.Attachment();
Attachment att = new Attachment();
att.mEncoding = "base64";
att.mSize = Long.parseLong(length);
att.mFileName = fileName;
@ -234,13 +239,13 @@ public class EasEmailSyncParser extends EasParser {
switch (tag) {
case EasTags.SYNC_SERVER_ID:
String serverId = getValue();
Cursor c = mContentResolver.query(EmailContent.Message.CONTENT_URI,
EmailContent.Message.ID_COLUMN_PROJECTION,
EmailContent.SyncColumns.SERVER_ID + "=" + serverId, null, null);
Cursor c = mContentResolver.query(Message.CONTENT_URI,
Message.ID_COLUMN_PROJECTION,
SyncColumns.SERVER_ID + "=" + serverId, null, null);
try {
if (c.moveToFirst()) {
mService.log("Deleting " + serverId);
deletes.add(c.getLong(EmailContent.Message.ID_COLUMNS_ID_COLUMN));
deletes.add(c.getLong(Message.ID_COLUMNS_ID_COLUMN));
}
} finally {
c.close();
@ -262,15 +267,14 @@ public class EasEmailSyncParser extends EasParser {
case EasTags.SYNC_SERVER_ID:
serverId = getValue();
bindArgument[0] = serverId;
Cursor c = mContentResolver.query(EmailContent.Message.CONTENT_URI,
EmailContent.Message.LIST_PROJECTION,
EmailContent.SyncColumns.SERVER_ID + "=?", bindArgument, null);
Cursor c = mContentResolver.query(Message.CONTENT_URI,
Message.LIST_PROJECTION,
SyncColumns.SERVER_ID + "=?", bindArgument, null);
try {
if (c.moveToFirst()) {
mService.log("Changing " + serverId);
oldRead = c.getInt(EmailContent.Message.LIST_READ_COLUMN) ==
EmailContent.Message.READ;
id = c.getLong(EmailContent.Message.LIST_ID_COLUMN);
oldRead = c.getInt(Message.LIST_READ_COLUMN) == Message.READ;
id = c.getLong(Message.LIST_ID_COLUMN);
}
} finally {
c.close();
@ -291,7 +295,7 @@ public class EasEmailSyncParser extends EasParser {
}
public void commandsParser() throws IOException {
ArrayList<EmailContent.Message> newEmails = new ArrayList<EmailContent.Message>();
ArrayList<Message> newEmails = new ArrayList<Message>();
ArrayList<Long> deletedEmails = new ArrayList<Long>();
ArrayList<Long> changedEmails = new ArrayList<Long>();
@ -310,27 +314,27 @@ public class EasEmailSyncParser extends EasParser {
// TODO Notifications
// TODO Store message bodies
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
for (EmailContent.Message content: newEmails) {
for (Message content: newEmails) {
content.addSaveOps(ops);
}
for (Long id: deletedEmails) {
ops.add(ContentProviderOperation
.newDelete(ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, id)).build());
.newDelete(ContentUris.withAppendedId(Message.CONTENT_URI, id)).build());
}
if (!changedEmails.isEmpty()) {
ContentValues cv = new ContentValues();
// TODO Handle proper priority
// Set this as the correct state (assuming server wins)
cv.put(EmailContent.SyncColumns.DIRTY_COUNT, 0);
cv.put(EmailContent.MessageColumns.FLAG_READ, true);
cv.put(SyncColumns.DIRTY_COUNT, 0);
cv.put(MessageColumns.FLAG_READ, true);
for (Long id: changedEmails) {
// For now, don't handle read->unread
ops.add(ContentProviderOperation.newUpdate(ContentUris
.withAppendedId(EmailContent.Message.CONTENT_URI, id)).withValues(cv).build());
.withAppendedId(Message.CONTENT_URI, id)).withValues(cv).build());
}
}
ops.add(ContentProviderOperation.newUpdate(ContentUris
.withAppendedId(EmailContent.Mailbox.CONTENT_URI, mMailbox.mId))
.withAppendedId(Mailbox.CONTENT_URI, mMailbox.mId))
.withValues(mMailbox.toContentValues()).build());
try {

View File

@ -24,7 +24,8 @@ import java.util.Arrays;
import java.util.List;
import com.android.email.provider.EmailProvider;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Account;
import com.android.exchange.EmailContent.Mailbox;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
@ -54,7 +55,7 @@ public class EasFolderSyncParser extends EasParser {
public static final List<Integer> mMailFolderTypes =
Arrays.asList(INBOX_TYPE,DRAFTS_TYPE,DELETED_TYPE,SENT_TYPE,OUTBOX_TYPE,USER_MAILBOX_TYPE);
private EmailContent.Account mAccount;
private Account mAccount;
private EasService mService;
//private Context mContext;
private MockParserStream mMock = null;
@ -90,7 +91,7 @@ public class EasFolderSyncParser extends EasParser {
//captureOff(mContext, "FolderSyncParser.txt");
}
public void addParser(ArrayList<EmailContent.Mailbox> boxes) throws IOException {
public void addParser(ArrayList<Mailbox> boxes) throws IOException {
String name = null;
String serverId = null;
String parentId = null;
@ -119,26 +120,26 @@ public class EasFolderSyncParser extends EasParser {
}
}
if (mMailFolderTypes.contains(type)) {
EmailContent.Mailbox m = new EmailContent.Mailbox();
Mailbox m = new Mailbox();
m.mDisplayName = name;
m.mServerId = serverId;
m.mAccountKey = mAccount.mId;
if (type == INBOX_TYPE) {
m.mSyncFrequency = EmailContent.Account.CHECK_INTERVAL_PUSH;
m.mType = EmailContent.Mailbox.TYPE_INBOX;
m.mSyncFrequency = Account.CHECK_INTERVAL_PUSH;
m.mType = Mailbox.TYPE_INBOX;
} else if (type == OUTBOX_TYPE) {
//m.mSyncFrequency = MailService.OUTBOX_FREQUENCY;
m.mSyncFrequency = EmailContent.Account.CHECK_INTERVAL_NEVER;
m.mType = EmailContent.Mailbox.TYPE_OUTBOX;
m.mSyncFrequency = Account.CHECK_INTERVAL_NEVER;
m.mType = Mailbox.TYPE_OUTBOX;
} else {
if (type == SENT_TYPE) {
m.mType = EmailContent.Mailbox.TYPE_SENT;
m.mType = Mailbox.TYPE_SENT;
} else if (type == DRAFTS_TYPE) {
m.mType = EmailContent.Mailbox.TYPE_DRAFTS;
m.mType = Mailbox.TYPE_DRAFTS;
} else if (type == DELETED_TYPE) {
m.mType = EmailContent.Mailbox.TYPE_TRASH;
m.mType = Mailbox.TYPE_TRASH;
}
m.mSyncFrequency = EmailContent.Account.CHECK_INTERVAL_NEVER;
m.mSyncFrequency = Account.CHECK_INTERVAL_NEVER;
}
if (!parentId.equals("0")) {
@ -153,7 +154,7 @@ public class EasFolderSyncParser extends EasParser {
public void changesParser() throws IOException {
// Keep track of new boxes, deleted boxes, updated boxes
ArrayList<EmailContent.Mailbox> newBoxes = new ArrayList<EmailContent.Mailbox>();
ArrayList<Mailbox> newBoxes = new ArrayList<Mailbox>();
while (nextTag(EasTags.FOLDER_CHANGES) != END) {
if (tag == EasTags.FOLDER_ADD) {
@ -164,13 +165,13 @@ public class EasFolderSyncParser extends EasParser {
skipTag();
}
for (EmailContent.Mailbox m: newBoxes) {
for (Mailbox m: newBoxes) {
String parent = m.mParentServerId;
if (parent != null) {
// Wrong except first time! Need to check existing boxes!
//**PROVIDER
m.mFlagVisible = true; //false;
for (EmailContent.Mailbox mm: newBoxes) {
for (Mailbox mm: newBoxes) {
if (mm.mServerId.equals(parent)) {
//mm.parent = true;
}
@ -185,14 +186,14 @@ public class EasFolderSyncParser extends EasParser {
if (!newBoxes.isEmpty()) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
for (EmailContent.Mailbox content: newBoxes) {
for (Mailbox content: newBoxes) {
ContentProviderOperation.Builder b = ContentProviderOperation
.newInsert(EmailContent.Mailbox.CONTENT_URI);
.newInsert(Mailbox.CONTENT_URI);
b.withValues(content.toContentValues());
ops.add(b.build());
}
ops.add(ContentProviderOperation.newUpdate(ContentUris
.withAppendedId(EmailContent.Account.CONTENT_URI, mAccount.mId))
.withAppendedId(Account.CONTENT_URI, mAccount.mId))
.withValues(mAccount.toContentValues()).build());
try {

View File

@ -22,12 +22,12 @@ import java.io.InputStream;
import android.util.Log;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Mailbox;
public class EasMoveParser extends EasParser {
private static final String TAG = "EasMoveParser";
private EasService mService;
private EmailContent.Mailbox mMailbox;
private Mailbox mMailbox;
protected boolean mMoreAvailable = false;
public EasMoveParser(InputStream in, EasService service) throws IOException {

View File

@ -19,7 +19,9 @@ package com.android.exchange;
import java.net.HttpURLConnection;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.HostAuth;
import com.android.exchange.EmailContent.Mailbox;
import com.android.exchange.EmailContent.Message;
import android.content.ContentUris;
import android.content.ContentValues;
@ -28,11 +30,10 @@ import android.database.Cursor;
public class EasOutboxService extends EasService {
public EasOutboxService(Context _context, EmailContent.Mailbox _mailbox) {
public EasOutboxService(Context _context, Mailbox _mailbox) {
super(_context, _mailbox);
mContext = _context;
EmailContent.HostAuth ha =
EmailContent.HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv);
HostAuth ha = HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv);
mHostAddress = ha.mAddress;
mUserName = ha.mLogin;
mPassword = ha.mPassword;
@ -43,11 +44,11 @@ public class EasOutboxService extends EasService {
String uniqueId = android.provider.Settings.System.getString(mContext.getContentResolver(),
android.provider.Settings.System.ANDROID_ID);
try {
Cursor c = mContext.getContentResolver().query(EmailContent.Message.CONTENT_URI,
EmailContent.Message.CONTENT_PROJECTION, "mMailbox=" + mMailbox, null, null);
Cursor c = mContext.getContentResolver().query(Message.CONTENT_URI,
Message.CONTENT_PROJECTION, "mMailbox=" + mMailbox, null, null);
try {
if (c.moveToFirst()) {
EmailContent.Message msg = new EmailContent.Message().restore(c);
Message msg = new Message().restore(c);
if (msg != null) {
String data = Rfc822Formatter
.writeEmailAsRfc822String(mContext, mAccount, msg, uniqueId);
@ -59,12 +60,12 @@ public class EasOutboxService extends EasService {
//intent.putExtra("text", "Your message with subject \"" + msg.mSubject + "\" has been sent.");
log("Deleting message...");
mContext.getContentResolver().delete(ContentUris.withAppendedId(
EmailContent.Message.CONTENT_URI, msg.mId), null, null);
Message.CONTENT_URI, msg.mId), null, null);
} else {
ContentValues cv = new ContentValues();
cv.put("uid", 1);
EmailContent.Message.update(mContext,
EmailContent.Message.CONTENT_URI, msg.mId, cv);
Message.update(mContext,
Message.CONTENT_URI, msg.mId, cv);
//intent.putExtra("text", "WHOA! Your message with subject \"" + msg.mSubject + "\" failed to send.");
}
//mContext.sendBroadcast(intent);

View File

@ -21,7 +21,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Mailbox;
import android.content.Context;
@ -30,7 +30,7 @@ public class EasPingService extends EasService {
EasService mCaller;
HttpURLConnection mConnection = null;
public EasPingService(Context _context, EmailContent.Mailbox _mailbox, EasService _caller) {
public EasPingService(Context _context, Mailbox _mailbox, EasService _caller) {
super(_context, _mailbox);
mCaller = _caller;
mHostAddress = _caller.mHostAddress;

View File

@ -48,7 +48,10 @@ import org.apache.http.impl.client.DefaultHttpClient;
import com.android.email.Account;
import com.android.email.mail.AuthenticationFailedException;
import com.android.email.mail.MessagingException;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.AttachmentColumns;
import com.android.exchange.EmailContent.HostAuth;
import com.android.exchange.EmailContent.Mailbox;
import com.android.exchange.EmailContent.Message;
import android.content.ContentValues;
import android.content.Context;
@ -103,7 +106,7 @@ public class EasService extends ProtocolService {
private boolean mStop = false;
private Object mWaitTarget = new Object();
public EasService (Context _context, EmailContent.Mailbox _mailbox) {
public EasService (Context _context, Mailbox _mailbox) {
// A comment
super(_context, _mailbox);
mContext = _context;
@ -199,7 +202,7 @@ public class EasService extends ProtocolService {
String type = e.getContentType().getValue();
Log.v(TAG, "Attachment code: " + status + ", Length: " + len + ", Type: " + type);
InputStream is = res.getEntity().getContent();
File f = null; //EmailContent.Attachment.openAttachmentFile(req);
File f = null; //Attachment.openAttachmentFile(req);
if (f != null) {
FileOutputStream os = new FileOutputStream(f);
if (len > 0) {
@ -227,8 +230,8 @@ public class EasService extends ProtocolService {
os.close();
ContentValues cv = new ContentValues();
cv.put(EmailContent.AttachmentColumns.CONTENT_URI, f.getAbsolutePath());
cv.put(EmailContent.AttachmentColumns.MIME_TYPE, type);
cv.put(AttachmentColumns.CONTENT_URI, f.getAbsolutePath());
cv.put(AttachmentColumns.MIME_TYPE, type);
req.att.update(mContext, cv);
// TODO Inform UI that we're done
}
@ -514,7 +517,7 @@ public class EasService extends ProtocolService {
}
long handleLocalReads (EASSerializer s) throws IOException {
Cursor c = mContext.getContentResolver().query(EmailContent.Message.CONTENT_URI, EmailContent.Message.LIST_PROJECTION, "mailboxKey=" + mMailboxId, null, null);
Cursor c = mContext.getContentResolver().query(Message.CONTENT_URI, Message.LIST_PROJECTION, "mailboxKey=" + mMailboxId, null, null);
long maxReadId = -1;
try {
// if (c.moveToFirst()) {
@ -620,8 +623,7 @@ public class EasService extends ProtocolService {
mDeviceId = android.provider.Settings.System
.getString(mContext.getContentResolver(), android.provider.Settings.System.ANDROID_ID);
EmailContent.HostAuth ha = EmailContent.HostAuth
.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv);
HostAuth ha = HostAuth.restoreHostAuthWithId(mContext, mAccount.mHostAuthKeyRecv);
mHostAddress = ha.mAddress;
mUserName = ha.mLogin;
mPassword = ha.mPassword;
@ -751,7 +753,7 @@ public class EasService extends ProtocolService {
// Handle local moves
handleLocalMoves();
if (mMailbox.mSyncFrequency != EmailContent.Account.CHECK_INTERVAL_PUSH) {
if (mMailbox.mSyncFrequency != Account.CHECK_INTERVAL_PUSH) {
return;
}

View File

@ -140,7 +140,7 @@ public abstract class EmailContent {
* @param selectionArgs as with a query call
* @return the number of items matching the query (or zero)
*/
static public int count (Context context, Uri uri, String selection, String[] selectionArgs) {
static public int count(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = context.getContentResolver()
.query(uri, COUNT_COLUMNS, selection, selectionArgs, null);
try {
@ -324,8 +324,6 @@ public abstract class EmailContent {
public static final String TEXT_INFO = "textInfo";
// Information about the html part (if any) in form <location>;<encoding>;<charset>;<length>
public static final String HTML_INFO = "htmlInfo";
// Foreign key to the Body content of this message (text and/or html)
public static final String BODY_ID = "bodyId";
// Sync related identifiers
// Any client-required identifier
@ -371,27 +369,26 @@ public abstract class EmailContent {
public static final int CONTENT_FLAGS_COLUMN = 9;
public static final int CONTENT_TEXT_INFO_COLUMN = 10;
public static final int CONTENT_HTML_INFO_COLUMN = 11;
public static final int CONTENT_BODY_ID_COLUMN = 12;
public static final int CONTENT_SERVER_ID_COLUMN = 13;
public static final int CONTENT_CLIENT_ID_COLUMN = 14;
public static final int CONTENT_MESSAGE_ID_COLUMN = 15;
public static final int CONTENT_THREAD_ID_COLUMN = 16;
public static final int CONTENT_MAILBOX_KEY_COLUMN = 17;
public static final int CONTENT_ACCOUNT_KEY_COLUMN = 18;
public static final int CONTENT_REFERENCE_KEY_COLUMN = 19;
public static final int CONTENT_SENDER_LIST_COLUMN = 20;
public static final int CONTENT_FROM_LIST_COLUMN = 21;
public static final int CONTENT_TO_LIST_COLUMN = 22;
public static final int CONTENT_CC_LIST_COLUMN = 23;
public static final int CONTENT_BCC_LIST_COLUMN = 24;
public static final int CONTENT_REPLY_TO_COLUMN = 25;
public static final int CONTENT_SERVER_VERSION_COLUMN = 26;
public static final int CONTENT_SERVER_ID_COLUMN = 12;
public static final int CONTENT_CLIENT_ID_COLUMN = 13;
public static final int CONTENT_MESSAGE_ID_COLUMN = 14;
public static final int CONTENT_THREAD_ID_COLUMN = 15;
public static final int CONTENT_MAILBOX_KEY_COLUMN = 16;
public static final int CONTENT_ACCOUNT_KEY_COLUMN = 17;
public static final int CONTENT_REFERENCE_KEY_COLUMN = 18;
public static final int CONTENT_SENDER_LIST_COLUMN = 19;
public static final int CONTENT_FROM_LIST_COLUMN = 20;
public static final int CONTENT_TO_LIST_COLUMN = 21;
public static final int CONTENT_CC_LIST_COLUMN = 22;
public static final int CONTENT_BCC_LIST_COLUMN = 23;
public static final int CONTENT_REPLY_TO_COLUMN = 24;
public static final int CONTENT_SERVER_VERSION_COLUMN = 25;
public static final String[] CONTENT_PROJECTION = new String[] {
RECORD_ID, MessageColumns.DISPLAY_NAME, MessageColumns.TIMESTAMP,
MessageColumns.SUBJECT, MessageColumns.PREVIEW, MessageColumns.FLAG_READ,
MessageColumns.FLAG_LOADED, MessageColumns.FLAG_FAVORITE,
MessageColumns.FLAG_ATTACHMENT, MessageColumns.FLAGS, MessageColumns.TEXT_INFO,
MessageColumns.HTML_INFO, MessageColumns.BODY_ID, SyncColumns.SERVER_ID,
MessageColumns.HTML_INFO, SyncColumns.SERVER_ID,
MessageColumns.CLIENT_ID, MessageColumns.MESSAGE_ID, MessageColumns.THREAD_ID,
MessageColumns.MAILBOX_KEY, MessageColumns.ACCOUNT_KEY, MessageColumns.REFERENCE_KEY,
MessageColumns.SENDER_LIST, MessageColumns.FROM_LIST, MessageColumns.TO_LIST,
@ -458,7 +455,6 @@ public abstract class EmailContent {
public String mMessageId;
public String mThreadId;
public long mBodyKey;
public long mMailboxKey;
public long mAccountKey;
public long mReferenceKey;
@ -522,7 +518,6 @@ public abstract class EmailContent {
values.put(MessageColumns.CLIENT_ID, mClientId);
values.put(MessageColumns.MESSAGE_ID, mMessageId);
values.put(MessageColumns.BODY_ID, mBodyKey);
values.put(MessageColumns.MAILBOX_KEY, mMailboxKey);
values.put(MessageColumns.ACCOUNT_KEY, mAccountKey);
values.put(MessageColumns.REFERENCE_KEY, mReferenceKey);
@ -575,7 +570,6 @@ public abstract class EmailContent {
mClientId = c.getString(CONTENT_CLIENT_ID_COLUMN);
mMessageId = c.getString(CONTENT_MESSAGE_ID_COLUMN);
mThreadId = c.getString(CONTENT_THREAD_ID_COLUMN);
mBodyKey = c.getLong(CONTENT_BODY_ID_COLUMN);
mMailboxKey = c.getLong(CONTENT_MAILBOX_KEY_COLUMN);
mAccountKey = c.getLong(CONTENT_ACCOUNT_KEY_COLUMN);
mReferenceKey = c.getLong(CONTENT_REFERENCE_KEY_COLUMN);

View File

@ -21,7 +21,8 @@ import java.util.ArrayList;
import com.android.email.Email;
import com.android.email.mail.MessagingException;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Account;
import com.android.exchange.EmailContent.Mailbox;
import android.content.Context;
import android.net.ConnectivityManager;
@ -57,11 +58,11 @@ public abstract class ProtocolService implements Runnable {
// Kindly subclasses will synchronize on this before making an SSL connection
public static Object sslGovernorToken = new Object();
protected EmailContent.Mailbox mMailbox;
protected Mailbox mMailbox;
protected long mMailboxId;
protected Thread mThread;
protected String mMailboxName;
protected EmailContent.Account mAccount;
protected Account mAccount;
protected Context mContext;
protected long mRequestTime;
protected ArrayList<PartRequest> mPartRequests = new ArrayList<PartRequest>();
@ -81,12 +82,12 @@ public abstract class ProtocolService implements Runnable {
//return MailService.SyncStatus.SYNC;
}
public ProtocolService (Context _context, EmailContent.Mailbox _mailbox) {
public ProtocolService (Context _context, Mailbox _mailbox) {
mContext = _context;
mMailbox = _mailbox;
mMailboxId = _mailbox.mId;
mMailboxName = _mailbox.mServerId;
mAccount = EmailContent.Account.restoreAccountWithId(_context, _mailbox.mAccountKey);
mAccount = Account.restoreAccountWithId(_context, _mailbox.mAccountKey);
}
// Will be required when subclasses are instantiated by name

View File

@ -26,7 +26,9 @@ import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Account;
import com.android.exchange.EmailContent.Attachment;
import com.android.exchange.EmailContent.Message;
import android.content.ContentUris;
import android.content.Context;
@ -47,21 +49,21 @@ public class Rfc822Formatter {
static final String CRLF = "\r\n";
static public String writeEmailAsRfc822String (Context context, EmailContent.Account acct,
EmailContent.Message msg, String uniqueId) throws IOException {
static public String writeEmailAsRfc822String (Context context, Account acct,
Message msg, String uniqueId) throws IOException {
StringWriter w = new StringWriter();
writeEmailAsRfc822(context, acct, msg, w, uniqueId);
return w.toString();
}
static public boolean writeEmailAsRfc822 (Context context, EmailContent.Account acct,
EmailContent.Message msg, Writer writer, String uniqueId) throws IOException {
static public boolean writeEmailAsRfc822 (Context context, Account acct,
Message msg, Writer writer, String uniqueId) throws IOException {
// For now, multi-part alternative means an HTML reply...
boolean alternativeParts = false;
Uri u = ContentUris.withAppendedId(EmailContent.Message.CONTENT_URI, msg.mId)
Uri u = ContentUris.withAppendedId(Message.CONTENT_URI, msg.mId)
.buildUpon().appendPath("attachment").build();
Cursor c = context.getContentResolver().query(u, EmailContent.Attachment.CONTENT_PROJECTION,
Cursor c = context.getContentResolver().query(u, Attachment.CONTENT_PROJECTION,
null, null, null);
try {
if (c.moveToFirst())
@ -71,7 +73,7 @@ public class Rfc822Formatter {
}
//**PROVIDER
boolean mixedParts = false; //(!msg.attachments.isEmpty());
EmailContent.Message reply = null;
Message reply = null;
boolean forward = false;
long referenceId = msg.mReferenceKey;
@ -80,7 +82,7 @@ public class Rfc822Formatter {
referenceId = 0 - referenceId;
forward = true;
}
reply = EmailContent.Message.restoreMessageWithId(context, referenceId);
reply = Message.restoreMessageWithId(context, referenceId);
alternativeParts = true;
}
@ -161,7 +163,7 @@ public class Rfc822Formatter {
}
if (mixedParts) {
for (EmailContent.Attachment att: msg.mAttachments) {
for (Attachment att: msg.mAttachments) {
writeBoundary(writer, mixedBoundary, false);
writeHeader(writer, "Content-Type", att.mMimeType);
writeHeader(writer, "Content-Transfer-Encoding", "base64");
@ -198,7 +200,7 @@ public class Rfc822Formatter {
return true;
}
protected static String createReplyIntro (EmailContent.Message msg) {
protected static String createReplyIntro (Message msg) {
StringBuilder sb = new StringBuilder(2048);
Date d = new Date(msg.mTimeStamp);
sb.append("\n\n-----\nOn ");
@ -211,7 +213,7 @@ public class Rfc822Formatter {
return sb.toString();
}
protected static String createForwardIntro (EmailContent.Message msg) {
protected static String createForwardIntro (Message msg) {
StringBuilder sb = new StringBuilder(2048);
sb.append("\n\nBegin forwarded message:\n\n");
sb.append("From: ");

View File

@ -28,8 +28,10 @@ import java.util.HashMap;
import java.util.List;
import com.android.email.mail.MessagingException;
import com.android.email.provider.EmailContent;
import com.android.exchange.EmailContent.Attachment;
import com.android.exchange.EmailContent.Account;
import com.android.exchange.EmailContent.Mailbox;
import com.android.exchange.EmailContent.Message;
import android.app.AlarmManager;
import android.app.PendingIntent;
@ -141,11 +143,12 @@ public class SyncManager extends Service implements Runnable {
super(handler);
// At startup, we want to see what accounts exist and cache them
Cursor c = getContentResolver().query(EmailContent.Account.CONTENT_URI, EmailContent.Account.CONTENT_PROJECTION, null, null, null);
Cursor c = getContentResolver().query(Account.CONTENT_URI,
Account.CONTENT_PROJECTION, null, null, null);
try {
if (c.moveToFirst()) {
do {
accountIds.add(c.getLong(EmailContent.Account.CONTENT_ID_COLUMN));
accountIds.add(c.getLong(Account.CONTENT_ID_COLUMN));
} while (c.moveToNext());
}
} finally {
@ -154,7 +157,8 @@ public class SyncManager extends Service implements Runnable {
for (long accountId: accountIds) {
Context context = getContext();
int cnt = EmailContent.Mailbox.count(context, EmailContent.Mailbox.CONTENT_URI, "accountKey=" + accountId, null);
int cnt = Mailbox.count(context, Mailbox.CONTENT_URI,
"accountKey=" + accountId, null);
if (cnt == 0) {
initializeAccount(accountId);
}
@ -162,14 +166,15 @@ public class SyncManager extends Service implements Runnable {
}
public void onChange (boolean selfChange) {
// A change to the list of accounts requires us to scan for deletions (so we can stop running syncs)
// A change to the list requires us to scan for deletions (to stop running syncs)
// At startup, we want to see what accounts exist and cache them
ArrayList<Long> currentIds = new ArrayList<Long>();
Cursor c = getContentResolver().query(EmailContent.Account.CONTENT_URI, EmailContent.Account.CONTENT_PROJECTION, null, null, null);
Cursor c = getContentResolver().query(Account.CONTENT_URI,
Account.CONTENT_PROJECTION, null, null, null);
try {
if (c.moveToFirst()) {
do {
currentIds.add(c.getLong(EmailContent.Account.CONTENT_ID_COLUMN));
currentIds.add(c.getLong(Account.CONTENT_ID_COLUMN));
} while (c.moveToNext());
}
for (long accountId: accountIds) {
@ -193,13 +198,14 @@ public class SyncManager extends Service implements Runnable {
}
private void initializeAccount (long acctId) {
EmailContent.Account acct = EmailContent.Account.restoreAccountWithId(getContext(), acctId);
EmailContent.Mailbox main = new EmailContent.Mailbox();
Account acct =
Account.restoreAccountWithId(getContext(), acctId);
Mailbox main = new Mailbox();
main.mDisplayName = "_main";
main.mServerId = "_main";
main.mAccountKey = acct.mId;
main.mType = EmailContent.Mailbox.TYPE_MAIL;
main.mSyncFrequency = EmailContent.Account.CHECK_INTERVAL_PUSH;
main.mType = Mailbox.TYPE_MAIL;
main.mSyncFrequency = Account.CHECK_INTERVAL_PUSH;
main.mFlagVisible = false;
main.save(getContext());
INSTANCE.log("Initializing account: " + acct.mDisplayName);
@ -210,7 +216,8 @@ public class SyncManager extends Service implements Runnable {
synchronized (mSyncToken) {
List<Long> deletedBoxes = new ArrayList<Long>();
for (Long mid : INSTANCE.serviceMap.keySet()) {
EmailContent.Mailbox box = EmailContent.Mailbox.restoreMailboxWithId(INSTANCE, mid);
Mailbox box =
Mailbox.restoreMailboxWithId(INSTANCE, mid);
if (box != null) {
if (box.mAccountKey == acctId) {
ProtocolService svc = INSTANCE.serviceMap.get(mid);
@ -267,7 +274,8 @@ public class SyncManager extends Service implements Runnable {
}
static private HashMap<Long, Boolean> mWakeLocks = new HashMap<Long, Boolean>();
static private HashMap<Long, PendingIntent> mPendingIntents = new HashMap<Long, PendingIntent>();
static private HashMap<Long, PendingIntent> mPendingIntents =
new HashMap<Long, PendingIntent>();
static private WakeLock mWakeLock = null;
static public void acquireWakeLock (long id) {
@ -276,7 +284,8 @@ public class SyncManager extends Service implements Runnable {
if (lock == null) {
INSTANCE.log("+WakeLock requested for " + id);
if (mWakeLock == null) {
PowerManager pm = (PowerManager) INSTANCE.getSystemService(Context.POWER_SERVICE);
PowerManager pm =
(PowerManager) INSTANCE.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MAIL_SERVICE");
mWakeLock.acquire();
INSTANCE.log("+WAKE LOCK ACQUIRED");
@ -312,7 +321,8 @@ public class SyncManager extends Service implements Runnable {
synchronized (mPendingIntents) {
PendingIntent pi = mPendingIntents.get(id);
if (pi != null) {
AlarmManager alarmManager = (AlarmManager)INSTANCE.getSystemService(Context.ALARM_SERVICE);
AlarmManager alarmManager =
(AlarmManager)INSTANCE.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pi);
INSTANCE.log("+Alarm cleared for " + alarmOwner(id));
mPendingIntents.remove(id);
@ -330,7 +340,8 @@ public class SyncManager extends Service implements Runnable {
pi = PendingIntent.getBroadcast(INSTANCE, 0, i, 0);
mPendingIntents.put(id, pi);
AlarmManager alarmManager = (AlarmManager)INSTANCE.getSystemService(Context.ALARM_SERVICE);
AlarmManager alarmManager =
(AlarmManager)INSTANCE.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millis, pi);
INSTANCE.log("+Alarm set for " + alarmOwner(id) + ", " + millis + "ms");
}
@ -360,9 +371,10 @@ public class SyncManager extends Service implements Runnable {
static public void ping (long id) {
ProtocolService service = INSTANCE.serviceMap.get(id);
if (service != null) {
EmailContent.Mailbox m = EmailContent.Mailbox.restoreMailboxWithId(INSTANCE, id);
Mailbox m = Mailbox.restoreMailboxWithId(INSTANCE, id);
if (m != null) {
service.mAccount = EmailContent.Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
service.mAccount =
Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
service.mMailbox = m;
service.ping();
}
@ -412,7 +424,7 @@ public class SyncManager extends Service implements Runnable {
}
}
private void startService (ProtocolService service, EmailContent.Mailbox m) {
private void startService (ProtocolService service, Mailbox m) {
synchronized (mSyncToken) {
String mailboxName = m.mDisplayName;
String accountName = service.mAccount.mDisplayName;
@ -423,9 +435,10 @@ public class SyncManager extends Service implements Runnable {
}
}
private void startService (EmailContent.Mailbox m) {
private void startService (Mailbox m) {
synchronized (mSyncToken) {
EmailContent.Account acct = EmailContent.Account.restoreAccountWithId(this, m.mAccountKey);
Account acct =
Account.restoreAccountWithId(this, m.mAccountKey);
if (acct != null) {
ProtocolService service;
service = new EasService(this, m);
@ -448,7 +461,8 @@ public class SyncManager extends Service implements Runnable {
for (Long mid: toStop) {
ProtocolService svc = serviceMap.get(mid);
log("Going to sleep: shutting down " + svc.mAccount.mDisplayName + "/" + svc.mMailboxName);
log("Going to sleep: shutting down " + svc.mAccount.mDisplayName +
"/" + svc.mMailboxName);
svc.stop();
svc.mThread.interrupt();
stoppedOne = true;
@ -473,12 +487,13 @@ public class SyncManager extends Service implements Runnable {
runAwake(-1);
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(EmailContent.Account.CONTENT_URI, false, mAccountObserver);
resolver.registerContentObserver(EmailContent.Mailbox.CONTENT_URI, false, mMailboxObserver);
resolver.registerContentObserver(Account.CONTENT_URI, false, mAccountObserver);
resolver.registerContentObserver(Mailbox.CONTENT_URI, false, mMailboxObserver);
ConnectivityReceiver cr = new ConnectivityReceiver();
registerReceiver(cr, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
mSettings = PreferenceManager.getDefaultSharedPreferences(this);
GregorianCalendar calendar = new GregorianCalendar();
@ -501,11 +516,9 @@ public class SyncManager extends Service implements Runnable {
long nextWait = 10*MINS;
long now = System.currentTimeMillis();
// We can be MUCH smarter! We can send notices of sleep time changes and otherwise cache all of this...
// We could send notices of sleep time changes and otherwise cache all of this...
long sleepHours = mSettings.getLong("sleep_hours", 0);
if (sleepHours != 0) {
boolean pastStartTime = false;
boolean beforeEndTime = false;
boolean wantSleep = false;
calendar.setTimeInMillis(now);
int nowHour = calendar.get(GregorianCalendar.HOUR_OF_DAY);
@ -520,23 +533,23 @@ public class SyncManager extends Service implements Runnable {
int endMinute = (int)(sleepEnd % 100);
if (sleepStart > sleepEnd) {
if ((nowHour > startHour) || (nowHour == startHour && nowMinute >= startMinute) || (nowHour < endHour) || (nowHour == endHour && nowMinute <= endMinute))
if ((nowHour > startHour) ||
(nowHour == startHour && nowMinute >= startMinute) ||
(nowHour < endHour) ||
(nowHour == endHour && nowMinute <= endMinute))
wantSleep = true;
} else if (((startHour < nowHour || (startHour == nowHour && nowMinute >= startMinute)) && ((nowHour < endHour) || (nowHour == endHour && nowMinute <= endMinute))))
} else if (((startHour < nowHour ||
(startHour == nowHour && nowMinute >= startMinute)) &&
((nowHour < endHour) ||
(nowHour == endHour && nowMinute <= endMinute))))
wantSleep = true;
if (wantSleep && (mStatus == AWAKE)) {
mStatus = SLEEP_HOURS;
log("Going to sleep now...");
log("startHour: " + startHour + ", startMinute: " + startMinute + ", endHour: " + endHour + ", endMinute: " + endMinute);
log("nowHour: " + nowHour + ", nowMinute: " + nowMinute);
startSleep();
broadcastSleep();
} else if (!wantSleep && (mStatus == SLEEP_HOURS)) {
mStatus = AWAKE;
log("Waking up now: " + (pastStartTime ? "pastStartTime, " : "not pastStartTime, ") + (beforeEndTime ? "beforeEndTime" : "not beforeEndTime"));
log("startHour: " + startHour + ", startMinute: " + startMinute + ", endHour: " + endHour + ", endMinute: " + endMinute);
log("nowHour: " + nowHour + ", nowMinute: " + nowMinute);
broadcastSleep();
}
}
@ -546,7 +559,9 @@ public class SyncManager extends Service implements Runnable {
boolean wantSleep = false;
calendar.setTimeInMillis(now);
int day = calendar.get(GregorianCalendar.DAY_OF_WEEK);
if (sleepWeekends && (day == GregorianCalendar.SATURDAY || day == GregorianCalendar.SUNDAY)) {
if (sleepWeekends &&
(day == GregorianCalendar.SATURDAY ||
day == GregorianCalendar.SUNDAY)) {
wantSleep = true;
}
if ((mStatus == AWAKE) && wantSleep) {
@ -577,38 +592,43 @@ public class SyncManager extends Service implements Runnable {
if (!mStop && ((mStatus == AWAKE) || mToothpicks)) {
// Start up threads that need it...
try {
Cursor c = getContentResolver().query(EmailContent.Mailbox.CONTENT_URI, EmailContent.Mailbox.CONTENT_PROJECTION, null, null, null);
Cursor c = getContentResolver().query(Mailbox.CONTENT_URI,
Mailbox.CONTENT_PROJECTION, null, null, null);
if (c.moveToFirst()) {
// TODO Could be much faster - just get cursor of ones we're watching...
do {
long mid = c.getLong(EmailContent.Mailbox.CONTENT_ID_COLUMN);
long mid = c.getLong(Mailbox.CONTENT_ID_COLUMN);
ProtocolService service = serviceMap.get(mid);
if (service == null) {
long freq = c.getInt(EmailContent.Mailbox.CONTENT_SYNC_FREQUENCY_COLUMN);
if (freq == EmailContent.Account.CHECK_INTERVAL_PUSH) {
EmailContent.Mailbox m = EmailContent.getContent(c, EmailContent.Mailbox.class);
// Either we're good to go, or it's been 30 minutes (the default for idle timeout)
if (((m.mFlags & EmailContent.Mailbox.FLAG_CANT_PUSH) == 0) || ((now - m.mSyncTime) > (1000 * 60 * 30L))) {
long freq = c.getInt(Mailbox.CONTENT_SYNC_FREQUENCY_COLUMN);
if (freq == Account.CHECK_INTERVAL_PUSH) {
Mailbox m =
EmailContent.getContent(c, Mailbox.class);
// Either push, or 30 mins (default for idle timeout)
if (((m.mFlags & Mailbox.FLAG_CANT_PUSH) == 0)
|| ((now - m.mSyncTime) > (1000 * 60 * 30L))) {
startService(m);
}
} else if (freq == -19) {
// See if we've got anything to do...
int cnt = EmailContent.count(this, EmailContent.Message.CONTENT_URI, "mailboxKey=" + mid + " and syncServerId=0", null);
int cnt = EmailContent.count(this,
Message.CONTENT_URI, "mailboxKey=" +
mid + " and syncServerId=0", null);
if (cnt > 0) {
EmailContent.Mailbox m = EmailContent.getContent(c, EmailContent.Mailbox.class);
Mailbox m = EmailContent.getContent(c, Mailbox.class);
startService(new EasOutboxService(this, m), m);
}
} else if (freq > 0 && freq <= 1440) {
long lastSync = c.getLong(EmailContent.Mailbox.CONTENT_SYNC_TIME_COLUMN);
long lastSync =
c.getLong(Mailbox.CONTENT_SYNC_TIME_COLUMN);
if (now - lastSync > (freq * 60000L)) {
EmailContent.Mailbox m = EmailContent.getContent(c, EmailContent.Mailbox.class);
Mailbox m = EmailContent.getContent(c, Mailbox.class);
startService(m);
}
}
} else {
Thread thread = service.mThread;
if (!thread.isAlive()) {
log("Removing dead thread for " + c.getString(EmailContent.Mailbox.CONTENT_DISPLAY_NAME_COLUMN));
serviceMap.remove(mid);
// Restart this if necessary
if (nextWait > 3*SECS) {
@ -618,12 +638,14 @@ public class SyncManager extends Service implements Runnable {
long requestTime = service.mRequestTime;
if (requestTime > 0) {
long timeToRequest = requestTime - now;
if (service instanceof ProtocolService && timeToRequest <= 0) {
if (service instanceof ProtocolService &&
timeToRequest <= 0) {
service.mRequestTime = 0;
service.ping();
} else if (requestTime > 0 && timeToRequest < nextWait) {
if (timeToRequest < 11*MINS) {
nextWait = timeToRequest < 250 ? 250 : timeToRequest;
nextWait =
timeToRequest < 250 ? 250 : timeToRequest;
} else {
log("Illegal timeToRequest: " + timeToRequest);
}
@ -674,7 +696,7 @@ public class SyncManager extends Service implements Runnable {
throw new RuntimeException("MailService crash; please restart me...");
}
static public void serviceRequest (EmailContent.Mailbox m) {
static public void serviceRequest (Mailbox m) {
serviceRequest(m.mId, 10*SECS);
}
@ -702,15 +724,15 @@ public class SyncManager extends Service implements Runnable {
ProtocolService service = INSTANCE.serviceMap.get(mailboxId);
if (service != null) {
service.mRequestTime = System.currentTimeMillis() ;
EmailContent.Mailbox m = EmailContent.Mailbox.restoreMailboxWithId(INSTANCE, mailboxId);
service.mAccount = EmailContent.Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
Mailbox m = Mailbox.restoreMailboxWithId(INSTANCE, mailboxId);
service.mAccount = Account.restoreAccountWithId(INSTANCE, m.mAccountKey);
service.mMailbox = m;
kick();
}
}
static public void partRequest (PartRequest req) {
EmailContent.Message msg = EmailContent.Message.restoreMessageWithId(INSTANCE, req.emailId);
Message msg = Message.restoreMessageWithId(INSTANCE, req.emailId);
if (msg == null) {
return;
}
@ -728,7 +750,7 @@ public class SyncManager extends Service implements Runnable {
}
static public PartRequest hasPartRequest(long emailId, String part) {
EmailContent.Message msg = EmailContent.Message.restoreMessageWithId(INSTANCE, emailId);
Message msg = Message.restoreMessageWithId(INSTANCE, emailId);
if (msg == null) {
return null;
}
@ -742,7 +764,7 @@ public class SyncManager extends Service implements Runnable {
}
static public void cancelPartRequest(long emailId, String part) {
EmailContent.Message msg = EmailContent.Message.restoreMessageWithId(INSTANCE, emailId);
Message msg = Message.restoreMessageWithId(INSTANCE, emailId);
if (msg == null) {
return;
}
@ -785,7 +807,7 @@ public class SyncManager extends Service implements Runnable {
INSTANCE.log("startManualSync");
synchronized (mSyncToken) {
if (INSTANCE.serviceMap.get(mid) == null) {
EmailContent.Mailbox m = EmailContent.Mailbox.restoreMailboxWithId(INSTANCE, mid);
Mailbox m = Mailbox.restoreMailboxWithId(INSTANCE, mid);
INSTANCE.log("Starting sync for " + m.mDisplayName);
INSTANCE.startService(m);
}
@ -819,9 +841,9 @@ public class SyncManager extends Service implements Runnable {
}
static public void kick (long mid) {
EmailContent.Mailbox m = EmailContent.Mailbox.restoreMailboxWithId(INSTANCE, mid);
Mailbox m = Mailbox.restoreMailboxWithId(INSTANCE, mid);
int syncType = m.mSyncFrequency;
if (syncType == EmailContent.Account.CHECK_INTERVAL_PUSH) {
if (syncType == Account.CHECK_INTERVAL_PUSH) {
SyncManager.serviceRequestImmediate(mid);
} else {
SyncManager.startManualSync(mid);
@ -833,7 +855,7 @@ public class SyncManager extends Service implements Runnable {
synchronized (mSyncToken) {
for (ProtocolService svc : INSTANCE.serviceMap.values()) {
if (svc.mAccount.mId == acctId) {
svc.mAccount = EmailContent.Account.restoreAccountWithId(INSTANCE, acctId);
svc.mAccount = Account.restoreAccountWithId(INSTANCE, acctId);
}
}
}