reworked ping scheduling strategy. very experimental

This commit is contained in:
Daniel Gultsch 2015-01-05 18:45:39 +01:00
parent 85f24c9106
commit 0c51245ff5
1 changed files with 32 additions and 61 deletions

View File

@ -188,12 +188,12 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
} }
} }
syncDirtyContacts(account); syncDirtyContacts(account);
scheduleWakeupCall(Config.PING_MAX_INTERVAL, true); scheduleWakeUpCall(Config.PING_MAX_INTERVAL,account.getUuid().hashCode());
} else if (account.getStatus() == Account.State.OFFLINE) { } else if (account.getStatus() == Account.State.OFFLINE) {
resetSendingToWaiting(account); resetSendingToWaiting(account);
if (!account.isOptionSet(Account.OPTION_DISABLED)) { if (!account.isOptionSet(Account.OPTION_DISABLED)) {
int timeToReconnect = mRandom.nextInt(50) + 10; int timeToReconnect = mRandom.nextInt(50) + 10;
scheduleWakeupCall(timeToReconnect, false); scheduleWakeUpCall(timeToReconnect,account.getUuid().hashCode());
} }
} else if (account.getStatus() == Account.State.REGISTRATION_SUCCESSFUL) { } else if (account.getStatus() == Account.State.REGISTRATION_SUCCESSFUL) {
databaseBackend.updateAccount(account); databaseBackend.updateAccount(account);
@ -206,7 +206,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
+ ": error connecting account. try again in " + ": error connecting account. try again in "
+ next + "s for the " + next + "s for the "
+ (connection.getAttempt() + 1) + " time"); + (connection.getAttempt() + 1) + " time");
scheduleWakeupCall((int) (next * 1.2), false); scheduleWakeUpCall(next,account.getUuid().hashCode());
} }
} }
getNotificationService().updateErrorNotification(); getNotificationService().updateErrorNotification();
@ -241,8 +241,6 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
private OpenPgpServiceConnection pgpServiceConnection; private OpenPgpServiceConnection pgpServiceConnection;
private PgpEngine mPgpEngine = null; private PgpEngine mPgpEngine = null;
private Intent pingIntent;
private PendingIntent pendingPingIntent = null;
private WakeLock wakeLock; private WakeLock wakeLock;
private PowerManager pm; private PowerManager pm;
private final OnBindListener mOnBindListener = new OnBindListener() { private final OnBindListener mOnBindListener = new OnBindListener() {
@ -388,16 +386,17 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && intent.getAction() != null) { final String action = intent == null ? null : intent.getAction();
if (intent.getAction().equals(ACTION_MERGE_PHONE_CONTACTS)) { if (action != null) {
if (action.equals(ACTION_MERGE_PHONE_CONTACTS)) {
PhoneHelper.loadPhoneContacts(getApplicationContext(), new ArrayList<Bundle>(), this); PhoneHelper.loadPhoneContacts(getApplicationContext(), new ArrayList<Bundle>(), this);
return START_STICKY; return START_STICKY;
} else if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { } else if (action.equals(Intent.ACTION_SHUTDOWN)) {
logoutAndSave(); logoutAndSave();
return START_NOT_STICKY; return START_NOT_STICKY;
} else if (intent.getAction().equals(ACTION_CLEAR_NOTIFICATION)) { } else if (action.equals(ACTION_CLEAR_NOTIFICATION)) {
mNotificationService.clear(); mNotificationService.clear();
} else if (intent.getAction().equals(ACTION_DISABLE_FOREGROUND)) { } else if (action.equals(ACTION_DISABLE_FOREGROUND)) {
getPreferences().edit().putBoolean("keep_foreground_service",false).commit(); getPreferences().edit().putBoolean("keep_foreground_service",false).commit();
toggleForegroundService(); toggleForegroundService();
} }
@ -419,37 +418,36 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
} }
} }
if (account.getStatus() == Account.State.ONLINE) { if (account.getStatus() == Account.State.ONLINE) {
long lastReceived = account.getXmppConnection() long lastReceived = account.getXmppConnection().getLastPacketReceived();
.getLastPacketReceived(); long lastSent = account.getXmppConnection().getLastPingSent();
long lastSent = account.getXmppConnection() long pingInterval = "ui".equals(action) ? Config.PING_MIN_INTERVAL * 1000 : Config.PING_MAX_INTERVAL * 1000;
.getLastPingSent(); long secondsToNextPing = ((lastReceived + pingInterval) - SystemClock.elapsedRealtime()) / 1000;
if (lastSent - lastReceived >= Config.PING_TIMEOUT * 1000) { if (lastSent > lastReceived && (lastSent + Config.PING_TIMEOUT * 1000) < SystemClock.elapsedRealtime()) {
Log.d(Config.LOGTAG, account.getJid() Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": ping timeout");
+ ": ping timeout");
this.reconnectAccount(account, true); this.reconnectAccount(account, true);
} else if (SystemClock.elapsedRealtime() - lastReceived >= Config.PING_MIN_INTERVAL * 1000) { } else if (secondsToNextPing <= 0) {
account.getXmppConnection().sendPing(); account.getXmppConnection().sendPing();
this.scheduleWakeupCall(2, false); Log.d(Config.LOGTAG, account.getJid().toBareJid()+" send ping");
this.scheduleWakeUpCall(Config.PING_TIMEOUT,account.getUuid().hashCode());
} else {
this.scheduleWakeUpCall((int) secondsToNextPing, account.getUuid().hashCode());
} }
} else if (account.getStatus() == Account.State.OFFLINE) { } else if (account.getStatus() == Account.State.OFFLINE) {
if (account.getXmppConnection() == null) { if (account.getXmppConnection() == null) {
account.setXmppConnection(this account.setXmppConnection(this.createConnection(account));
.createConnection(account));
} }
new Thread(account.getXmppConnection()).start(); new Thread(account.getXmppConnection()).start();
} else if ((account.getStatus() == Account.State.CONNECTING) } else if ((account.getStatus() == Account.State.CONNECTING)
&& ((SystemClock.elapsedRealtime() - account && ((SystemClock.elapsedRealtime() - account
.getXmppConnection().getLastConnect()) / 1000 >= Config.CONNECT_TIMEOUT)) { .getXmppConnection().getLastConnect()) / 1000 >= Config.CONNECT_TIMEOUT)) {
Log.d(Config.LOGTAG, account.getJid() Log.d(Config.LOGTAG, account.getJid()+ ": time out during connect reconnecting");
+ ": time out during connect reconnecting");
reconnectAccount(account, true); reconnectAccount(account, true);
} else { } else {
if (account.getXmppConnection().getTimeToNextAttempt() <= 0) { if (account.getXmppConnection().getTimeToNextAttempt() <= 0) {
reconnectAccount(account, true); reconnectAccount(account, true);
} }
} }
// in any case. reschedule wakup call
this.scheduleWakeupCall(Config.PING_MAX_INTERVAL, true);
} }
if (mOnAccountUpdate != null) { if (mOnAccountUpdate != null) {
mOnAccountUpdate.onAccountUpdate(); mOnAccountUpdate.onAccountUpdate();
@ -546,42 +544,16 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
stopSelf(); stopSelf();
} }
protected void scheduleWakeupCall(int seconds, boolean ping) { protected void scheduleWakeUpCall(int seconds, int requestCode) {
long timeToWake = SystemClock.elapsedRealtime() + seconds * 1000; final long timeToWake = SystemClock.elapsedRealtime() + seconds * 1000;
Context context = getApplicationContext(); Context context = getApplicationContext();
AlarmManager alarmManager = (AlarmManager) context AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
.getSystemService(Context.ALARM_SERVICE);
if (ping) {
if (this.pingIntent == null) {
this.pingIntent = new Intent(context, EventReceiver.class);
this.pingIntent.setAction("ping");
this.pingIntent.putExtra("time", timeToWake);
this.pendingPingIntent = PendingIntent.getBroadcast(context, 0,
this.pingIntent, 0);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
timeToWake, pendingPingIntent);
} else {
long scheduledTime = this.pingIntent.getLongExtra("time", 0);
if (scheduledTime < SystemClock.elapsedRealtime()
|| (scheduledTime > timeToWake)) {
this.pingIntent.putExtra("time", timeToWake);
alarmManager.cancel(this.pendingPingIntent);
this.pendingPingIntent = PendingIntent.getBroadcast(
context, 0, this.pingIntent, 0);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
timeToWake, pendingPingIntent);
}
}
} else {
Intent intent = new Intent(context, EventReceiver.class); Intent intent = new Intent(context, EventReceiver.class);
intent.setAction("ping_check"); intent.setAction("ping");
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, PendingIntent alarmIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
intent, 0); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeToWake, alarmIntent);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, timeToWake,
alarmIntent);
}
} }
public XmppConnection createConnection(final Account account) { public XmppConnection createConnection(final Account account) {
@ -1862,8 +1834,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
} }
Thread thread = new Thread(account.getXmppConnection()); Thread thread = new Thread(account.getXmppConnection());
thread.start(); thread.start();
scheduleWakeupCall((int) (Config.CONNECT_TIMEOUT * 1.2), scheduleWakeUpCall(Config.CONNECT_TIMEOUT,account.getUuid().hashCode());
false);
} else { } else {
account.getRoster().clearPresences(); account.getRoster().clearPresences();
account.setXmppConnection(null); account.setXmppConnection(null);