Integrate EAS push notifications with the main notifications.
* Use the new account-based field for number of new messages * Add support for async notifications in MailService * Change EAS to call MailService to notify user
This commit is contained in:
parent
2cf87e6c3c
commit
cbe513d430
@ -754,9 +754,9 @@ public class MessageList extends ListActivity implements OnItemClickListener, On
|
||||
|
||||
// Reset the "new messages" count in the service, since we're seeing them now
|
||||
if (mMailboxKey == QUERY_ALL_INBOXES) {
|
||||
MailService.resetNewMessageCount(-1);
|
||||
MailService.resetNewMessageCount(MessageList.this, -1);
|
||||
} else if (mMailboxKey >= 0 && mAccountKey != -1) {
|
||||
MailService.resetNewMessageCount(mAccountKey);
|
||||
MailService.resetNewMessageCount(MessageList.this, mAccountKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,6 +30,7 @@ import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.ContentUris;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
@ -56,9 +57,12 @@ public class MailService extends Service {
|
||||
"com.android.email.intent.action.MAIL_SERVICE_RESCHEDULE";
|
||||
private static final String ACTION_CANCEL =
|
||||
"com.android.email.intent.action.MAIL_SERVICE_CANCEL";
|
||||
private static final String ACTION_NOTIFY_MAIL =
|
||||
"com.android.email.intent.action.MAIL_SERVICE_NOTIFY";
|
||||
|
||||
private static final String EXTRA_CHECK_ACCOUNT = "com.android.email.intent.extra.ACCOUNT";
|
||||
private static final String EXTRA_ACCOUNT_INFO = "com.android.email.intent.extra.ACCOUNT_INFO";
|
||||
private static final String EXTRA_MESSAGE_COUNT = "com.android.email.intent.extra.COUNT";
|
||||
|
||||
private Controller.Result mControllerCallback = new ControllerResults();
|
||||
|
||||
@ -70,6 +74,15 @@ public class MailService extends Service {
|
||||
private static HashMap<Long,AccountSyncReport> mSyncReports =
|
||||
new HashMap<Long,AccountSyncReport>();
|
||||
|
||||
/**
|
||||
* Simple template used for clearing new message count in accounts
|
||||
*/
|
||||
static ContentValues mClearNewMessages;
|
||||
static {
|
||||
mClearNewMessages = new ContentValues();
|
||||
mClearNewMessages.put(Account.NEW_MESSAGE_COUNT, 0);
|
||||
}
|
||||
|
||||
public static void actionReschedule(Context context) {
|
||||
Intent i = new Intent();
|
||||
i.setClass(context, MailService.class);
|
||||
@ -85,13 +98,12 @@ public class MailService extends Service {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset new message counts for one or all accounts
|
||||
*
|
||||
* TODO what about EAS service new message counts, where are they reset?
|
||||
* Reset new message counts for one or all accounts. This clears both our local copy and
|
||||
* the values (if any) stored in the account records.
|
||||
*
|
||||
* @param accountId account to clear, or -1 for all accounts
|
||||
*/
|
||||
public static void resetNewMessageCount(long accountId) {
|
||||
public static void resetNewMessageCount(Context context, long accountId) {
|
||||
synchronized (mSyncReports) {
|
||||
for (AccountSyncReport report : mSyncReports.values()) {
|
||||
if (accountId == -1 || accountId == report.accountId) {
|
||||
@ -99,20 +111,30 @@ public class MailService extends Service {
|
||||
}
|
||||
}
|
||||
}
|
||||
// now do the database - all accounts, or just one of them
|
||||
Uri uri;
|
||||
if (accountId == -1) {
|
||||
uri = Account.CONTENT_URI;
|
||||
} else {
|
||||
uri = ContentUris.withAppendedId(Account.CONTENT_URI, accountId);
|
||||
}
|
||||
context.getContentResolver().update(uri, mClearNewMessages, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Entry point for asynchronous message services (e.g. push mode) to post notifications of new
|
||||
* messages. Note: Although this is not a blocking call, it will start the MessagingController
|
||||
* which will attempt to load the new messages. So the Store should expect to be opened and
|
||||
* fetched from shortly after making this call.
|
||||
* messages. This assumes that the push provider has already synced the messages into the
|
||||
* appropriate database - this simply triggers the notification mechanism.
|
||||
*
|
||||
* @param context a context
|
||||
* @param accountId the id of the account that is reporting new messages
|
||||
* @param newCount the number of new messages
|
||||
*/
|
||||
public static void actionNotifyNewMessages(Context context, long accountId) {
|
||||
Intent i = new Intent(ACTION_CHECK_MAIL);
|
||||
public static void actionNotifyNewMessages(Context context, long accountId, int newCount) {
|
||||
Intent i = new Intent(ACTION_NOTIFY_MAIL);
|
||||
i.setClass(context, MailService.class);
|
||||
i.putExtra(EXTRA_CHECK_ACCOUNT, accountId);
|
||||
i.putExtra(EXTRA_MESSAGE_COUNT, newCount);
|
||||
context.startService(i);
|
||||
}
|
||||
|
||||
@ -122,11 +144,12 @@ public class MailService extends Service {
|
||||
|
||||
// TODO this needs to be passed through the controller and back to us
|
||||
this.mStartId = startId;
|
||||
String action = intent.getAction();
|
||||
|
||||
Controller controller = Controller.getInstance(getApplication());
|
||||
controller.addResultCallback(mControllerCallback);
|
||||
|
||||
if (ACTION_CHECK_MAIL.equals(intent.getAction())) {
|
||||
if (ACTION_CHECK_MAIL.equals(action)) {
|
||||
if (Config.LOGD && Email.DEBUG) {
|
||||
Log.d(Email.LOG_TAG, "*** MailService: checking mail");
|
||||
}
|
||||
@ -146,23 +169,36 @@ public class MailService extends Service {
|
||||
stopSelf(startId);
|
||||
}
|
||||
}
|
||||
else if (ACTION_CANCEL.equals(intent.getAction())) {
|
||||
else if (ACTION_CANCEL.equals(action)) {
|
||||
if (Config.LOGD && Email.DEBUG) {
|
||||
Log.d(Email.LOG_TAG, "*** MailService: cancel");
|
||||
}
|
||||
cancel();
|
||||
stopSelf(startId);
|
||||
}
|
||||
else if (ACTION_RESCHEDULE.equals(intent.getAction())) {
|
||||
else if (ACTION_RESCHEDULE.equals(action)) {
|
||||
if (Config.LOGD && Email.DEBUG) {
|
||||
Log.d(Email.LOG_TAG, "*** MailService: reschedule");
|
||||
}
|
||||
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
|
||||
reschedule(alarmManager);
|
||||
stopSelf(startId);
|
||||
} else if (ACTION_NOTIFY_MAIL.equals(action)) {
|
||||
long accountId = intent.getLongExtra(EXTRA_CHECK_ACCOUNT, -1);
|
||||
int newMessageCount = intent.getIntExtra(EXTRA_MESSAGE_COUNT, -1);
|
||||
if (Config.LOGD && Email.DEBUG) {
|
||||
Log.d(Email.LOG_TAG, "*** MailService: notify accountId=" + Long.toString(accountId)
|
||||
+ " count=" + newMessageCount);
|
||||
}
|
||||
if (accountId != -1) {
|
||||
updateAccountReport(accountId, newMessageCount);
|
||||
notifyNewMessages(accountId);
|
||||
}
|
||||
stopSelf(startId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
@ -273,6 +309,8 @@ public class MailService extends Service {
|
||||
|
||||
String displayName; // temporary, for debug logging
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return displayName + ": prevSync=" + prevSyncTime + " nextSync=" + nextSyncTime
|
||||
+ " numNew=" + numNewMessages;
|
||||
|
@ -22,11 +22,13 @@ import com.android.email.activity.MessageList;
|
||||
import com.android.email.mail.Address;
|
||||
import com.android.email.provider.EmailContent;
|
||||
import com.android.email.provider.EmailProvider;
|
||||
import com.android.email.provider.EmailContent.Account;
|
||||
import com.android.email.provider.EmailContent.Attachment;
|
||||
import com.android.email.provider.EmailContent.Mailbox;
|
||||
import com.android.email.provider.EmailContent.Message;
|
||||
import com.android.email.provider.EmailContent.MessageColumns;
|
||||
import com.android.email.provider.EmailContent.SyncColumns;
|
||||
import com.android.email.service.MailService;
|
||||
import com.android.exchange.Eas;
|
||||
import com.android.exchange.EasSyncService;
|
||||
|
||||
@ -465,30 +467,28 @@ public class EmailSyncAdapter extends AbstractSyncAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO Remove this temporary notification code
|
||||
// TODO: This should be implemented using an "add to unread messages" URI,
|
||||
// and then it could be handled in the previous section as just another "op"
|
||||
int totalNewCount = 0;
|
||||
if (notifyCount > 0) {
|
||||
NotificationManager notifMgr =
|
||||
(NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
Notification notif = new Notification(R.drawable.stat_notify_email_generic,
|
||||
mContext.getString(R.string.notification_new_title),
|
||||
System.currentTimeMillis());
|
||||
Intent i = MessageList.actionHandleAccountIntent(mContext, mAccount.mId, -1,
|
||||
Mailbox.TYPE_INBOX);
|
||||
PendingIntent pi = PendingIntent.getActivity(mContext, 0, i, 0);
|
||||
notif.setLatestEventInfo(mContext,
|
||||
mContext.getString(R.string.notification_new_title),
|
||||
"You've got new mail!", pi);
|
||||
boolean vibrate = ((mAccount.getFlags() & EmailContent.Account.FLAGS_VIBRATE) != 0);
|
||||
String ringtone = mAccount.getRingtone();
|
||||
notif.flags = Notification.FLAG_SHOW_LIGHTS;
|
||||
notif.sound = TextUtils.isEmpty(ringtone) ? null : Uri.parse(ringtone);
|
||||
notif.ledARGB = 0xFF00FF00;
|
||||
notif.ledOnMS = 500;
|
||||
notif.ledOffMS = 500;
|
||||
if (vibrate) {
|
||||
notif.defaults |= Notification.DEFAULT_VIBRATE;
|
||||
Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, mAccount.mId);
|
||||
Cursor c = mContentResolver.query(uri,
|
||||
new String[] { Account.NEW_MESSAGE_COUNT }, null, null, null);
|
||||
try {
|
||||
if (c.moveToNext()) {
|
||||
int oldCount = c.getInt(0);
|
||||
ContentValues cv = new ContentValues();
|
||||
totalNewCount = oldCount + notifyCount;
|
||||
cv.put(Account.NEW_MESSAGE_COUNT, totalNewCount);
|
||||
mContentResolver.update(uri, cv, null, null);
|
||||
}
|
||||
notifMgr.notify(1, notif);
|
||||
} finally {
|
||||
c.close();
|
||||
}
|
||||
}
|
||||
|
||||
if (totalNewCount > 0) {
|
||||
MailService.actionNotifyNewMessages(mContext, mAccount.mId, totalNewCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user