From 9d960f27415c009db0549f309c3e847d9570e1d5 Mon Sep 17 00:00:00 2001 From: iNPUTmice Date: Wed, 15 Oct 2014 14:41:27 +0200 Subject: [PATCH] synchronization for listeners --- .../services/XmppConnectionService.java | 103 ++++++++++-------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index 5b0d9ea57..07897f8cd 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -107,14 +107,15 @@ public class XmppConnectionService extends Service { private CopyOnWriteArrayList conversations = null; private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager( this); - private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(this); + private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager( + this); private OnConversationUpdate mOnConversationUpdate = null; - private int convChangedListenerCount = 0; + private Integer convChangedListenerCount = 0; private OnAccountUpdate mOnAccountUpdate = null; - private int accountChangedListenerCount = 0; + private Integer accountChangedListenerCount = 0; private OnRosterUpdate mOnRosterUpdate = null; - private int rosterChangedListenerCount = 0; + private Integer rosterChangedListenerCount = 0; public OnContactStatusChanged onContactStatusChanged = new OnContactStatusChanged() { @Override @@ -976,71 +977,87 @@ public class XmppConnectionService extends Service { public void setOnConversationListChangedListener( OnConversationUpdate listener) { if (!isScreenOn()) { - Log.d(Config.LOGTAG,"ignoring setOnConversationListChangedListener"); + Log.d(Config.LOGTAG, + "ignoring setOnConversationListChangedListener"); return; } - this.mNotificationService.deactivateGracePeriod(); - if (checkListeners()) { - switchToForeground(); + synchronized (this.convChangedListenerCount) { + this.mNotificationService.deactivateGracePeriod(); + if (checkListeners()) { + switchToForeground(); + } + this.mOnConversationUpdate = listener; + this.mNotificationService.setIsInForeground(true); + this.convChangedListenerCount++; } - this.mOnConversationUpdate = listener; - this.mNotificationService.setIsInForeground(true); - this.convChangedListenerCount++; } public void removeOnConversationListChangedListener() { - this.convChangedListenerCount--; - if (this.convChangedListenerCount == 0) { - this.mOnConversationUpdate = null; - this.mNotificationService.setIsInForeground(false); - if (checkListeners()) { - switchToBackground(); + synchronized (this.convChangedListenerCount) { + this.convChangedListenerCount--; + if (this.convChangedListenerCount <= 0) { + this.convChangedListenerCount = 0; + this.mOnConversationUpdate = null; + this.mNotificationService.setIsInForeground(false); + if (checkListeners()) { + switchToBackground(); + } } } } public void setOnAccountListChangedListener(OnAccountUpdate listener) { if (!isScreenOn()) { - Log.d(Config.LOGTAG,"ignoring setOnAccountListChangedListener"); + Log.d(Config.LOGTAG, "ignoring setOnAccountListChangedListener"); return; } - this.mNotificationService.deactivateGracePeriod(); - if (checkListeners()) { - switchToForeground(); + synchronized (this.accountChangedListenerCount) { + this.mNotificationService.deactivateGracePeriod(); + if (checkListeners()) { + switchToForeground(); + } + this.mOnAccountUpdate = listener; + this.accountChangedListenerCount++; } - this.mOnAccountUpdate = listener; - this.accountChangedListenerCount++; } public void removeOnAccountListChangedListener() { - this.accountChangedListenerCount--; - if (this.accountChangedListenerCount == 0) { - this.mOnAccountUpdate = null; - if (checkListeners()) { - switchToBackground(); + synchronized (this.accountChangedListenerCount) { + this.accountChangedListenerCount--; + if (this.accountChangedListenerCount <= 0) { + this.mOnAccountUpdate = null; + this.accountChangedListenerCount = 0; + if (checkListeners()) { + switchToBackground(); + } } } } public void setOnRosterUpdateListener(OnRosterUpdate listener) { if (!isScreenOn()) { - Log.d(Config.LOGTAG,"ignoring setOnRosterUpdateListener"); + Log.d(Config.LOGTAG, "ignoring setOnRosterUpdateListener"); return; } - this.mNotificationService.deactivateGracePeriod(); - if (checkListeners()) { - switchToForeground(); + synchronized (this.rosterChangedListenerCount) { + this.mNotificationService.deactivateGracePeriod(); + if (checkListeners()) { + switchToForeground(); + } + this.mOnRosterUpdate = listener; + this.rosterChangedListenerCount++; } - this.mOnRosterUpdate = listener; - this.rosterChangedListenerCount++; } public void removeOnRosterUpdateListener() { - this.rosterChangedListenerCount--; - if (this.rosterChangedListenerCount == 0) { - this.mOnRosterUpdate = null; - if (checkListeners()) { - switchToBackground(); + synchronized (this.rosterChangedListenerCount) { + this.rosterChangedListenerCount--; + if (this.rosterChangedListenerCount <= 0) { + this.rosterChangedListenerCount = 0; + this.mOnRosterUpdate = null; + if (checkListeners()) { + switchToBackground(); + } } } } @@ -1075,9 +1092,10 @@ public class XmppConnectionService extends Service { } } } - + private boolean isScreenOn() { - PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE); + PowerManager pm = (PowerManager) this + .getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } @@ -1799,8 +1817,7 @@ public class XmppConnectionService extends Service { ArrayList contacts = new ArrayList(); for (Account account : getAccounts()) { if (!account.isOptionSet(Account.OPTION_DISABLED)) { - Contact contact = account.getRoster() - .getContactFromRoster(jid); + Contact contact = account.getRoster().getContactFromRoster(jid); if (contact != null) { contacts.add(contact); }