aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java221
-rw-r--r--src/main/java/de/pixart/messenger/ui/XmppActivity.java37
2 files changed, 93 insertions, 165 deletions
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
index 5fa2c1127..58370c08c 100644
--- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
+++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
@@ -245,7 +245,6 @@ public class XmppConnectionService extends Service {
private AvatarService mAvatarService = new AvatarService(this);
private MessageArchiveService mMessageArchiveService = new MessageArchiveService(this);
private PushManagementService mPushManagementService = new PushManagementService(this);
- private OnConversationUpdate mOnConversationUpdate = null;
private final ConversationsFileObserver fileObserver = new ConversationsFileObserver(
Environment.getExternalStorageDirectory().getAbsolutePath()
) {
@@ -268,21 +267,19 @@ public class XmppConnectionService extends Service {
}
}
};
- private int convChangedListenerCount = 0;
- private OnShowErrorToast mOnShowErrorToast = null;
- private int showErrorToastListenerCount = 0;
+
private int unreadCount = -1;
- private OnAccountUpdate mOnAccountUpdate = null;
- private OnCaptchaRequested mOnCaptchaRequested = null;
- private int accountChangedListenerCount = 0;
- private int captchaRequestedListenerCount = 0;
- private OnRosterUpdate mOnRosterUpdate = null;
- private OnUpdateBlocklist mOnUpdateBlocklist = null;
- private int updateBlocklistListenerCount = 0;
- private int rosterChangedListenerCount = 0;
- private OnMucRosterUpdate mOnMucRosterUpdate = null;
- private int mucRosterChangedListenerCount = 0;
- private OnKeyStatusUpdated mOnKeyStatusUpdated = null;
+
+ //Ui callback listeners
+ private final List<OnConversationUpdate> mOnConversationUpdates = new ArrayList<>();
+ private final List<OnShowErrorToast> mOnShowErrorToasts = new ArrayList<>();
+ private final List<OnAccountUpdate> mOnAccountUpdates = new ArrayList<>();
+ private final List<OnCaptchaRequested> mOnCaptchaRequested = new ArrayList<>();
+ private final List<OnRosterUpdate> mOnRosterUpdates = new ArrayList<>();
+ private final List<OnUpdateBlocklist> mOnUpdateBlocklist = new ArrayList<>();
+ private final List<OnMucRosterUpdate> mOnMucRosterUpdate = new ArrayList<>();
+ private final List<OnKeyStatusUpdated> mOnKeyStatusUpdated = new ArrayList<>();
+
private final OnBindListener mOnBindListener = new OnBindListener() {
@Override
@@ -321,7 +318,6 @@ public class XmppConnectionService extends Service {
syncDirtyContacts(account);
}
};
- private int keyStatusUpdatedListenerCount = 0;
private AtomicLong mLastExpiryRun = new AtomicLong(0);
private SecureRandom mRandom;
private LruCache<Pair<String, String>, ServiceDiscoveryResult> discoCache = new LruCache<>(20);
@@ -330,9 +326,7 @@ public class XmppConnectionService extends Service {
@Override
public void onStatusChanged(final Account account) {
XmppConnection connection = account.getXmppConnection();
- if (mOnAccountUpdate != null) {
- mOnAccountUpdate.onAccountUpdate();
- }
+ updateAccountUi();
if (account.getStatus() == Account.State.ONLINE) {
synchronized (mLowPingTimeoutMode) {
if (mLowPingTimeoutMode.remove(account.getJid().asBareJid())) {
@@ -2126,24 +2120,17 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnConversationUpdate = listener;
- this.mNotificationService.setIsInForeground(true);
- if (this.convChangedListenerCount < 2) {
- this.convChangedListenerCount++;
- }
+ this.mOnConversationUpdates.add(listener);
+ this.mNotificationService.setIsInForeground(this.mOnConversationUpdates.size() > 0);
}
}
- public void removeOnConversationListChangedListener() {
+ public void removeOnConversationListChangedListener(OnConversationUpdate listener) {
synchronized (this) {
- this.convChangedListenerCount--;
- if (this.convChangedListenerCount <= 0) {
- this.convChangedListenerCount = 0;
- this.mOnConversationUpdate = null;
- this.mNotificationService.setIsInForeground(false);
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnConversationUpdates.remove(listener);
+ this.mNotificationService.setIsInForeground(this.mOnConversationUpdates.size() > 0);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2153,23 +2140,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnShowErrorToast = onShowErrorToast;
- if (this.showErrorToastListenerCount < 2) {
- this.showErrorToastListenerCount++;
- }
+ this.mOnShowErrorToasts.add(onShowErrorToast);
}
- this.mOnShowErrorToast = onShowErrorToast;
}
- public void removeOnShowErrorToastListener() {
+ public void removeOnShowErrorToastListener(OnShowErrorToast onShowErrorToast) {
synchronized (this) {
- this.showErrorToastListenerCount--;
- if (this.showErrorToastListenerCount <= 0) {
- this.showErrorToastListenerCount = 0;
- this.mOnShowErrorToast = null;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnShowErrorToasts.remove(onShowErrorToast);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2179,22 +2158,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnAccountUpdate = listener;
- if (this.accountChangedListenerCount < 2) {
- this.accountChangedListenerCount++;
- }
+ this.mOnAccountUpdates.add(listener);
}
}
- public void removeOnAccountListChangedListener() {
+ public void removeOnAccountListChangedListener(OnAccountUpdate listener) {
synchronized (this) {
- this.accountChangedListenerCount--;
- if (this.accountChangedListenerCount <= 0) {
- this.mOnAccountUpdate = null;
- this.accountChangedListenerCount = 0;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnAccountUpdates.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2204,22 +2176,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnCaptchaRequested = listener;
- if (this.captchaRequestedListenerCount < 2) {
- this.captchaRequestedListenerCount++;
- }
+ this.mOnCaptchaRequested.add(listener);
}
}
- public void removeOnCaptchaRequestedListener() {
+ public void removeOnCaptchaRequestedListener(OnCaptchaRequested listener) {
synchronized (this) {
- this.captchaRequestedListenerCount--;
- if (this.captchaRequestedListenerCount <= 0) {
- this.mOnCaptchaRequested = null;
- this.captchaRequestedListenerCount = 0;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnCaptchaRequested.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2229,22 +2194,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnRosterUpdate = listener;
- if (this.rosterChangedListenerCount < 2) {
- this.rosterChangedListenerCount++;
- }
+ this.mOnRosterUpdates.add(listener);
}
}
- public void removeOnRosterUpdateListener() {
+ public void removeOnRosterUpdateListener(final OnRosterUpdate listener) {
synchronized (this) {
- this.rosterChangedListenerCount--;
- if (this.rosterChangedListenerCount <= 0) {
- this.rosterChangedListenerCount = 0;
- this.mOnRosterUpdate = null;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnRosterUpdates.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2254,22 +2212,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnUpdateBlocklist = listener;
- if (this.updateBlocklistListenerCount < 2) {
- this.updateBlocklistListenerCount++;
- }
+ this.mOnUpdateBlocklist.add(listener);
}
}
- public void removeOnUpdateBlocklistListener() {
+ public void removeOnUpdateBlocklistListener(final OnUpdateBlocklist listener) {
synchronized (this) {
- this.updateBlocklistListenerCount--;
- if (this.updateBlocklistListenerCount <= 0) {
- this.updateBlocklistListenerCount = 0;
- this.mOnUpdateBlocklist = null;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnUpdateBlocklist.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2279,22 +2230,15 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnKeyStatusUpdated = listener;
- if (this.keyStatusUpdatedListenerCount < 2) {
- this.keyStatusUpdatedListenerCount++;
- }
+ this.mOnKeyStatusUpdated.add(listener);
}
}
- public void removeOnNewKeysAvailableListener() {
+ public void removeOnNewKeysAvailableListener(final OnKeyStatusUpdated listener) {
synchronized (this) {
- this.keyStatusUpdatedListenerCount--;
- if (this.keyStatusUpdatedListenerCount <= 0) {
- this.keyStatusUpdatedListenerCount = 0;
- this.mOnKeyStatusUpdated = null;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnKeyStatusUpdated.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
@@ -2304,34 +2248,27 @@ public class XmppConnectionService extends Service {
if (checkListeners()) {
switchToForeground();
}
- this.mOnMucRosterUpdate = listener;
- if (this.mucRosterChangedListenerCount < 2) {
- this.mucRosterChangedListenerCount++;
- }
+ this.mOnMucRosterUpdate.add(listener);
}
}
- public void removeOnMucRosterUpdateListener() {
+ public void removeOnMucRosterUpdateListener(final OnMucRosterUpdate listener) {
synchronized (this) {
- this.mucRosterChangedListenerCount--;
- if (this.mucRosterChangedListenerCount <= 0) {
- this.mucRosterChangedListenerCount = 0;
- this.mOnMucRosterUpdate = null;
- if (checkListeners()) {
- switchToBackground();
- }
+ this.mOnMucRosterUpdate.remove(listener);
+ if (checkListeners()) {
+ switchToBackground();
}
}
}
public boolean checkListeners() {
- return (this.mOnAccountUpdate == null
- && this.mOnConversationUpdate == null
- && this.mOnRosterUpdate == null
- && this.mOnCaptchaRequested == null
- && this.mOnUpdateBlocklist == null
- && this.mOnShowErrorToast == null
- && this.mOnKeyStatusUpdated == null);
+ return (this.mOnAccountUpdates.size() == 0
+ && this.mOnConversationUpdates.size() == 0
+ && this.mOnRosterUpdates.size() == 0
+ && this.mOnCaptchaRequested.size() == 0
+ && this.mOnUpdateBlocklist.size() == 0
+ && this.mOnShowErrorToasts.size() == 0
+ && this.mOnKeyStatusUpdated.size() == 0);
}
private void switchToForeground() {
@@ -3535,56 +3472,58 @@ public class XmppConnectionService extends Service {
}
public void showErrorToastInUi(int resId) {
- if (mOnShowErrorToast != null) {
- mOnShowErrorToast.onShowErrorToast(resId);
+ for(OnShowErrorToast listener : this.mOnShowErrorToasts) {
+ listener.onShowErrorToast(resId);
}
}
public void updateConversationUi() {
- if (mOnConversationUpdate != null) {
- mOnConversationUpdate.onConversationUpdate();
+ for(OnConversationUpdate listener : this.mOnConversationUpdates) {
+ listener.onConversationUpdate();
}
}
public void updateAccountUi() {
- if (mOnAccountUpdate != null) {
- mOnAccountUpdate.onAccountUpdate();
+ for(OnAccountUpdate listener : this.mOnAccountUpdates) {
+ listener.onAccountUpdate();
}
}
public void updateRosterUi() {
- if (mOnRosterUpdate != null) {
- mOnRosterUpdate.onRosterUpdate();
+ for(OnRosterUpdate listener : this.mOnRosterUpdates) {
+ listener.onRosterUpdate();
}
}
public boolean displayCaptchaRequest(Account account, String id, Data data, Bitmap captcha) {
- if (mOnCaptchaRequested != null) {
+ if (mOnCaptchaRequested.size() > 0) {
DisplayMetrics metrics = getApplicationContext().getResources().getDisplayMetrics();
Bitmap scaled = Bitmap.createScaledBitmap(captcha, (int) (captcha.getWidth() * metrics.scaledDensity),
(int) (captcha.getHeight() * metrics.scaledDensity), false);
- mOnCaptchaRequested.onCaptchaRequested(account, id, data, scaled);
+ for(OnCaptchaRequested listener : this.mOnCaptchaRequested) {
+ listener.onCaptchaRequested(account, id, data, scaled);
+ }
return true;
}
return false;
}
public void updateBlocklistUi(final OnUpdateBlocklist.Status status) {
- if (mOnUpdateBlocklist != null) {
- mOnUpdateBlocklist.OnUpdateBlocklist(status);
+ for(OnUpdateBlocklist listener : this.mOnUpdateBlocklist) {
+ listener.OnUpdateBlocklist(status);
}
}
public void updateMucRosterUi() {
- if (mOnMucRosterUpdate != null) {
- mOnMucRosterUpdate.onMucRosterUpdate();
+ for(OnMucRosterUpdate listener : this.mOnMucRosterUpdate) {
+ listener.onMucRosterUpdate();
}
}
public void keyStatusUpdated(AxolotlService.FetchStatus report) {
- if (mOnKeyStatusUpdated != null) {
- mOnKeyStatusUpdated.onKeyStatusUpdated(report);
+ for(OnKeyStatusUpdated listener : this.mOnKeyStatusUpdated) {
+ listener.onKeyStatusUpdated(report);
}
}
diff --git a/src/main/java/de/pixart/messenger/ui/XmppActivity.java b/src/main/java/de/pixart/messenger/ui/XmppActivity.java
index c77545be6..c7dba686d 100644
--- a/src/main/java/de/pixart/messenger/ui/XmppActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/XmppActivity.java
@@ -59,6 +59,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import de.pixart.messenger.Config;
@@ -94,7 +95,7 @@ public abstract class XmppActivity extends ActionBarActivity {
public XmppConnectionService xmppConnectionService;
public boolean xmppConnectionServiceBound = false;
- protected boolean registeredListeners = false;
+ protected final AtomicBoolean registeredListeners = new AtomicBoolean(false);
protected int mColorRed;
protected int mColorWarningButton;
@@ -119,9 +120,8 @@ public abstract class XmppActivity extends ActionBarActivity {
XmppConnectionBinder binder = (XmppConnectionBinder) service;
xmppConnectionService = binder.getService();
xmppConnectionServiceBound = true;
- if (!registeredListeners && shouldRegisterListeners()) {
+ if (registeredListeners.compareAndSet(false, true)) {
registerListeners();
- registeredListeners = true;
}
invalidateOptionsMenu();
onBackendConnected();
@@ -226,23 +226,13 @@ public abstract class XmppActivity extends ActionBarActivity {
connectToBackend();
}
} else {
- if (!registeredListeners) {
+ if (registeredListeners.compareAndSet(false, true)) {
this.registerListeners();
- this.registeredListeners = true;
}
this.onBackendConnected();
}
}
- @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
- protected boolean shouldRegisterListeners() {
- if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- return !isDestroyed() && !isFinishing();
- } else {
- return !isFinishing();
- }
- }
-
public void connectToBackend() {
Intent intent = new Intent(this, XmppConnectionService.class);
intent.setAction("ui");
@@ -254,9 +244,8 @@ public abstract class XmppActivity extends ActionBarActivity {
protected void onStop() {
super.onStop();
if (xmppConnectionServiceBound) {
- if (registeredListeners) {
+ if (registeredListeners.compareAndSet(true, false)) {
this.unregisterListeners();
- this.registeredListeners = false;
}
unbindService(mConnection);
xmppConnectionServiceBound = false;
@@ -337,28 +326,28 @@ public abstract class XmppActivity extends ActionBarActivity {
protected void unregisterListeners() {
if (this instanceof XmppConnectionService.OnConversationUpdate) {
- this.xmppConnectionService.removeOnConversationListChangedListener();
+ this.xmppConnectionService.removeOnConversationListChangedListener((XmppConnectionService.OnConversationUpdate) this);
}
if (this instanceof XmppConnectionService.OnAccountUpdate) {
- this.xmppConnectionService.removeOnAccountListChangedListener();
+ this.xmppConnectionService.removeOnAccountListChangedListener((XmppConnectionService.OnAccountUpdate) this);
}
if (this instanceof XmppConnectionService.OnCaptchaRequested) {
- this.xmppConnectionService.removeOnCaptchaRequestedListener();
+ this.xmppConnectionService.removeOnCaptchaRequestedListener((XmppConnectionService.OnCaptchaRequested) this);
}
if (this instanceof XmppConnectionService.OnRosterUpdate) {
- this.xmppConnectionService.removeOnRosterUpdateListener();
+ this.xmppConnectionService.removeOnRosterUpdateListener((XmppConnectionService.OnRosterUpdate) this);
}
if (this instanceof XmppConnectionService.OnMucRosterUpdate) {
- this.xmppConnectionService.removeOnMucRosterUpdateListener();
+ this.xmppConnectionService.removeOnMucRosterUpdateListener((XmppConnectionService.OnMucRosterUpdate) this);
}
if (this instanceof OnUpdateBlocklist) {
- this.xmppConnectionService.removeOnUpdateBlocklistListener();
+ this.xmppConnectionService.removeOnUpdateBlocklistListener((OnUpdateBlocklist) this);
}
if (this instanceof XmppConnectionService.OnShowErrorToast) {
- this.xmppConnectionService.removeOnShowErrorToastListener();
+ this.xmppConnectionService.removeOnShowErrorToastListener((XmppConnectionService.OnShowErrorToast) this);
}
if (this instanceof OnKeyStatusUpdated) {
- this.xmppConnectionService.removeOnNewKeysAvailableListener();
+ this.xmppConnectionService.removeOnNewKeysAvailableListener((OnKeyStatusUpdated) this);
}
}