synchronization for listeners

This commit is contained in:
iNPUTmice 2014-10-15 14:41:27 +02:00
parent f063b1c063
commit 9d960f2741

View file

@ -107,14 +107,15 @@ public class XmppConnectionService extends Service {
private CopyOnWriteArrayList<Conversation> conversations = null; private CopyOnWriteArrayList<Conversation> conversations = null;
private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager( private JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager(
this); this);
private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(this); private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(
this);
private OnConversationUpdate mOnConversationUpdate = null; private OnConversationUpdate mOnConversationUpdate = null;
private int convChangedListenerCount = 0; private Integer convChangedListenerCount = 0;
private OnAccountUpdate mOnAccountUpdate = null; private OnAccountUpdate mOnAccountUpdate = null;
private int accountChangedListenerCount = 0; private Integer accountChangedListenerCount = 0;
private OnRosterUpdate mOnRosterUpdate = null; private OnRosterUpdate mOnRosterUpdate = null;
private int rosterChangedListenerCount = 0; private Integer rosterChangedListenerCount = 0;
public OnContactStatusChanged onContactStatusChanged = new OnContactStatusChanged() { public OnContactStatusChanged onContactStatusChanged = new OnContactStatusChanged() {
@Override @Override
@ -976,9 +977,11 @@ public class XmppConnectionService extends Service {
public void setOnConversationListChangedListener( public void setOnConversationListChangedListener(
OnConversationUpdate listener) { OnConversationUpdate listener) {
if (!isScreenOn()) { if (!isScreenOn()) {
Log.d(Config.LOGTAG,"ignoring setOnConversationListChangedListener"); Log.d(Config.LOGTAG,
"ignoring setOnConversationListChangedListener");
return; return;
} }
synchronized (this.convChangedListenerCount) {
this.mNotificationService.deactivateGracePeriod(); this.mNotificationService.deactivateGracePeriod();
if (checkListeners()) { if (checkListeners()) {
switchToForeground(); switchToForeground();
@ -987,10 +990,13 @@ public class XmppConnectionService extends Service {
this.mNotificationService.setIsInForeground(true); this.mNotificationService.setIsInForeground(true);
this.convChangedListenerCount++; this.convChangedListenerCount++;
} }
}
public void removeOnConversationListChangedListener() { public void removeOnConversationListChangedListener() {
synchronized (this.convChangedListenerCount) {
this.convChangedListenerCount--; this.convChangedListenerCount--;
if (this.convChangedListenerCount == 0) { if (this.convChangedListenerCount <= 0) {
this.convChangedListenerCount = 0;
this.mOnConversationUpdate = null; this.mOnConversationUpdate = null;
this.mNotificationService.setIsInForeground(false); this.mNotificationService.setIsInForeground(false);
if (checkListeners()) { if (checkListeners()) {
@ -998,12 +1004,14 @@ public class XmppConnectionService extends Service {
} }
} }
} }
}
public void setOnAccountListChangedListener(OnAccountUpdate listener) { public void setOnAccountListChangedListener(OnAccountUpdate listener) {
if (!isScreenOn()) { if (!isScreenOn()) {
Log.d(Config.LOGTAG,"ignoring setOnAccountListChangedListener"); Log.d(Config.LOGTAG, "ignoring setOnAccountListChangedListener");
return; return;
} }
synchronized (this.accountChangedListenerCount) {
this.mNotificationService.deactivateGracePeriod(); this.mNotificationService.deactivateGracePeriod();
if (checkListeners()) { if (checkListeners()) {
switchToForeground(); switchToForeground();
@ -1011,22 +1019,27 @@ public class XmppConnectionService extends Service {
this.mOnAccountUpdate = listener; this.mOnAccountUpdate = listener;
this.accountChangedListenerCount++; this.accountChangedListenerCount++;
} }
}
public void removeOnAccountListChangedListener() { public void removeOnAccountListChangedListener() {
synchronized (this.accountChangedListenerCount) {
this.accountChangedListenerCount--; this.accountChangedListenerCount--;
if (this.accountChangedListenerCount == 0) { if (this.accountChangedListenerCount <= 0) {
this.mOnAccountUpdate = null; this.mOnAccountUpdate = null;
this.accountChangedListenerCount = 0;
if (checkListeners()) { if (checkListeners()) {
switchToBackground(); switchToBackground();
} }
} }
} }
}
public void setOnRosterUpdateListener(OnRosterUpdate listener) { public void setOnRosterUpdateListener(OnRosterUpdate listener) {
if (!isScreenOn()) { if (!isScreenOn()) {
Log.d(Config.LOGTAG,"ignoring setOnRosterUpdateListener"); Log.d(Config.LOGTAG, "ignoring setOnRosterUpdateListener");
return; return;
} }
synchronized (this.rosterChangedListenerCount) {
this.mNotificationService.deactivateGracePeriod(); this.mNotificationService.deactivateGracePeriod();
if (checkListeners()) { if (checkListeners()) {
switchToForeground(); switchToForeground();
@ -1034,16 +1047,20 @@ public class XmppConnectionService extends Service {
this.mOnRosterUpdate = listener; this.mOnRosterUpdate = listener;
this.rosterChangedListenerCount++; this.rosterChangedListenerCount++;
} }
}
public void removeOnRosterUpdateListener() { public void removeOnRosterUpdateListener() {
synchronized (this.rosterChangedListenerCount) {
this.rosterChangedListenerCount--; this.rosterChangedListenerCount--;
if (this.rosterChangedListenerCount == 0) { if (this.rosterChangedListenerCount <= 0) {
this.rosterChangedListenerCount = 0;
this.mOnRosterUpdate = null; this.mOnRosterUpdate = null;
if (checkListeners()) { if (checkListeners()) {
switchToBackground(); switchToBackground();
} }
} }
} }
}
private boolean checkListeners() { private boolean checkListeners() {
return (this.mOnAccountUpdate == null return (this.mOnAccountUpdate == null
@ -1077,7 +1094,8 @@ public class XmppConnectionService extends Service {
} }
private boolean isScreenOn() { private boolean isScreenOn() {
PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE); PowerManager pm = (PowerManager) this
.getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn(); return pm.isScreenOn();
} }
@ -1799,8 +1817,7 @@ public class XmppConnectionService extends Service {
ArrayList<Contact> contacts = new ArrayList<Contact>(); ArrayList<Contact> contacts = new ArrayList<Contact>();
for (Account account : getAccounts()) { for (Account account : getAccounts()) {
if (!account.isOptionSet(Account.OPTION_DISABLED)) { if (!account.isOptionSet(Account.OPTION_DISABLED)) {
Contact contact = account.getRoster() Contact contact = account.getRoster().getContactFromRoster(jid);
.getContactFromRoster(jid);
if (contact != null) { if (contact != null) {
contacts.add(contact); contacts.add(contact);
} }