summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2015-06-10 14:29:55 +0200
committerDanny Baumann <dannybaumann@web.de>2015-06-11 11:01:35 +0200
commitebf12f687754c9c4a1ab5ada180dde4668947ce0 (patch)
tree0b93dc30390822868bb66d0c61af86db92bdd23b
parent9a652f8c9e48200d6827711eca661bedc815a593 (diff)
downloadandroid_packages_apps_Email-ebf12f687754c9c4a1ab5ada180dde4668947ce0.tar.gz
android_packages_apps_Email-ebf12f687754c9c4a1ab5ada180dde4668947ce0.tar.bz2
android_packages_apps_Email-ebf12f687754c9c4a1ab5ada180dde4668947ce0.zip
Use an inexact timer for the IDLE refresh.
Also use a wakeup timer, as we can't rely on the screen being turned on at refresh time. Change-Id: If64c164fd151c63404d0d63d9c463556cc3d0658
-rw-r--r--provider_src/com/android/email/service/ImapService.java39
1 files changed, 26 insertions, 13 deletions
diff --git a/provider_src/com/android/email/service/ImapService.java b/provider_src/com/android/email/service/ImapService.java
index 1dddd7291..9fdd864f8 100644
--- a/provider_src/com/android/email/service/ImapService.java
+++ b/provider_src/com/android/email/service/ImapService.java
@@ -108,8 +108,9 @@ public class ImapService extends Service {
private static final Flag[] FLAG_LIST_FLAGGED = new Flag[] { Flag.FLAGGED };
private static final Flag[] FLAG_LIST_ANSWERED = new Flag[] { Flag.ANSWERED };
- // Kick idle connection every 25 minutes
+ // Kick idle connection every ~25 minutes (in a window between 25 and 28 minutes)
private static final int KICK_IDLE_CONNECTION_TIMEOUT = 25 * 60 * 1000;
+ private static final int KICK_IDLE_CONNECTION_MAX_DELAY = 3 * 60 * 1000;
private static final int ALARM_REQUEST_KICK_IDLE_CODE = 1000;
/**
@@ -293,9 +294,10 @@ public class ImapService extends Service {
private void scheduleKickIdleConnection() {
PendingIntent pi = getKickIdleConnectionPendingIntent();
- long due = System.currentTimeMillis() + KICK_IDLE_CONNECTION_TIMEOUT;
+ long due = SystemClock.elapsedRealtime() + KICK_IDLE_CONNECTION_TIMEOUT;
+ long windowLength = KICK_IDLE_CONNECTION_MAX_DELAY;
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- am.set(AlarmManager.RTC, due, pi);
+ am.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, due, windowLength, pi);
}
private void cancelKickIdleConnection() {
@@ -742,6 +744,7 @@ public class ImapService extends Service {
private ImapEmailConnectivityManager mConnectivityManager;
private LocalChangesContentObserver mLocalChangesObserver;
private Handler mServiceHandler;
+ private PowerManager.WakeLock mIdleRefreshWakeLock;
@Override
public void onCreate() {
@@ -755,6 +758,11 @@ public class ImapService extends Service {
mConnectivityManager = new ImapEmailConnectivityManager(this, mBinder);
mLocalChangesObserver = new LocalChangesContentObserver(this, mServiceHandler);
+ // Initialize wake locks
+ PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mIdleRefreshWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Imap IDLE Refresh");
+ mIdleRefreshWakeLock.setReferenceCounted(true);
+
// Register observers
getContentResolver().registerContentObserver(
Account.SYNC_SETTING_CHANGED_URI, true, mLocalChangesObserver);
@@ -892,28 +900,33 @@ public class ImapService extends Service {
LogUtils.d(Logging.LOG_TAG, "action: Send Pending Mail "+accountId);
}
final long mailboxId = intent.getLongExtra(EXTRA_MAILBOX, -1);
- if (mailboxId <= -1 ) {
+ if (mailboxId <= -1) {
return START_NOT_STICKY;
}
+ mIdleRefreshWakeLock.acquire();
+
sExecutor.execute(new Runnable() {
@Override
public void run() {
- Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
- if (mailbox == null) {
- return;
- }
- Account account = Account.restoreAccountWithId(context, mailbox.mAccountKey);
- if (account == null) {
- return;
- }
-
try {
+ Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
+ if (mailbox == null) {
+ return;
+ }
+ Account account = Account.restoreAccountWithId(context,
+ mailbox.mAccountKey);
+ if (account == null) {
+ return;
+ }
+
ImapIdleFolderHolder holder = ImapIdleFolderHolder.getInstance();
holder.kickIdledMailbox(context, mailbox, account);
} catch (Exception e) {
LogUtils.e(Logging.LOG_TAG, e, "Failed to kick idled connection "
+ "for mailbox " + mailboxId);
+ } finally {
+ mIdleRefreshWakeLock.release();
}
}
});