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
This commit is contained in:
parent
59553089b9
commit
624321751a
|
@ -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_FLAGGED = new Flag[] { Flag.FLAGGED };
|
||||||
private static final Flag[] FLAG_LIST_ANSWERED = new Flag[] { Flag.ANSWERED };
|
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_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;
|
private static final int ALARM_REQUEST_KICK_IDLE_CODE = 1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -294,9 +295,10 @@ public class ImapService extends Service {
|
||||||
|
|
||||||
private void scheduleKickIdleConnection() {
|
private void scheduleKickIdleConnection() {
|
||||||
PendingIntent pi = getKickIdleConnectionPendingIntent();
|
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);
|
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() {
|
private void cancelKickIdleConnection() {
|
||||||
|
@ -743,6 +745,7 @@ public class ImapService extends Service {
|
||||||
private ImapEmailConnectivityManager mConnectivityManager;
|
private ImapEmailConnectivityManager mConnectivityManager;
|
||||||
private LocalChangesContentObserver mLocalChangesObserver;
|
private LocalChangesContentObserver mLocalChangesObserver;
|
||||||
private Handler mServiceHandler;
|
private Handler mServiceHandler;
|
||||||
|
private PowerManager.WakeLock mIdleRefreshWakeLock;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
|
@ -756,6 +759,11 @@ public class ImapService extends Service {
|
||||||
mConnectivityManager = new ImapEmailConnectivityManager(this, mBinder);
|
mConnectivityManager = new ImapEmailConnectivityManager(this, mBinder);
|
||||||
mLocalChangesObserver = new LocalChangesContentObserver(this, mServiceHandler);
|
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
|
// Register observers
|
||||||
getContentResolver().registerContentObserver(
|
getContentResolver().registerContentObserver(
|
||||||
Account.SYNC_SETTING_CHANGED_URI, true, mLocalChangesObserver);
|
Account.SYNC_SETTING_CHANGED_URI, true, mLocalChangesObserver);
|
||||||
|
@ -894,28 +902,33 @@ public class ImapService extends Service {
|
||||||
LogUtils.d(Logging.LOG_TAG, "action: Send Pending Mail "+accountId);
|
LogUtils.d(Logging.LOG_TAG, "action: Send Pending Mail "+accountId);
|
||||||
}
|
}
|
||||||
final long mailboxId = intent.getLongExtra(EXTRA_MAILBOX, -1);
|
final long mailboxId = intent.getLongExtra(EXTRA_MAILBOX, -1);
|
||||||
if (mailboxId <= -1 ) {
|
if (mailboxId <= -1) {
|
||||||
return START_NOT_STICKY;
|
return START_NOT_STICKY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mIdleRefreshWakeLock.acquire();
|
||||||
|
|
||||||
sExecutor.execute(new Runnable() {
|
sExecutor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
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 {
|
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();
|
ImapIdleFolderHolder holder = ImapIdleFolderHolder.getInstance();
|
||||||
holder.kickIdledMailbox(context, mailbox, account);
|
holder.kickIdledMailbox(context, mailbox, account);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtils.e(Logging.LOG_TAG, e, "Failed to kick idled connection "
|
LogUtils.e(Logging.LOG_TAG, e, "Failed to kick idled connection "
|
||||||
+ "for mailbox " + mailboxId);
|
+ "for mailbox " + mailboxId);
|
||||||
|
} finally {
|
||||||
|
mIdleRefreshWakeLock.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue