diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index 0a7b1ea2b..ee487ebc1 100644 --- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java @@ -41,6 +41,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.inject.Inject; @@ -80,10 +81,10 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private final Context appContext; // The following must only be accessed on the main UI thread - private final Map contactCounts = - new HashMap(); - private final Map forumCounts = - new HashMap(); + private final Map contactCounts = new HashMap<>(); + private final Map forumCounts = new HashMap<>(); + private final AtomicBoolean used = new AtomicBoolean(false); + private int contactTotal = 0, forumTotal = 0; private int nextRequestId = 0; private GroupId visibleGroup = null; @@ -105,6 +106,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, @Override public void startService() throws ServiceException { + if (used.getAndSet(true)) throw new IllegalStateException(); try { settings = settingsManager.getSettings(SETTINGS_NAMESPACE); } catch (DbException e) { @@ -115,6 +117,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, @Override public void stopService() throws ServiceException { Future f = androidExecutor.submit(new Callable() { + @Override public Void call() { clearPrivateMessageNotification(); clearForumPostNotification(); @@ -124,9 +127,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, }); try { f.get(); - } catch (InterruptedException e) { - throw new ServiceException(e); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { throw new ServiceException(e); } } @@ -149,6 +150,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, nm.cancel(INTRODUCTION_SUCCESS_NOTIFICATION_ID); } + @Override public void eventOccurred(Event e) { if (e instanceof SettingsUpdatedEvent) { SettingsUpdatedEvent s = (SettingsUpdatedEvent) e; @@ -176,6 +178,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private void loadSettings() { dbExecutor.execute(new Runnable() { + @Override public void run() { try { settings = settingsManager.getSettings(SETTINGS_NAMESPACE); @@ -187,8 +190,10 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, }); } + @Override public void showPrivateMessageNotification(final GroupId g) { androidExecutor.execute(new Runnable() { + @Override public void run() { Integer count = contactCounts.get(g); if (count == null) contactCounts.put(g, 1); @@ -200,8 +205,10 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, }); } + @Override public void clearPrivateMessageNotification(final GroupId g) { androidExecutor.execute(new Runnable() { + @Override public void run() { Integer count = contactCounts.remove(g); if (count == null) return; // Already cleared @@ -271,9 +278,12 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, return defaults; } + @Override public void showForumPostNotification(final GroupId g) { androidExecutor.execute(new Runnable() { - public void run() { + @Override + public void + run() { Integer count = forumCounts.get(g); if (count == null) forumCounts.put(g, 1); else forumCounts.put(g, count + 1); @@ -284,8 +294,10 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, }); } + @Override public void clearForumPostNotification(final GroupId g) { androidExecutor.execute(new Runnable() { + @Override public void run() { Integer count = forumCounts.remove(g); if (count == null) return; // Already cleared @@ -343,16 +355,20 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } } + @Override public void blockNotification(final GroupId g) { androidExecutor.execute(new Runnable() { + @Override public void run() { visibleGroup = g; } }); } + @Override public void unblockNotification(final GroupId g) { androidExecutor.execute(new Runnable() { + @Override public void run() { if (g.equals(visibleGroup)) visibleGroup = null; } @@ -361,6 +377,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private void showIntroductionNotifications(final ContactId c) { androidExecutor.execute(new Runnable() { + @Override public void run() { try { GroupId group = messagingManager.getConversationId(c); @@ -375,6 +392,7 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, private void showIntroductionSucceededNotification(final Contact c) { androidExecutor.execute(new Runnable() { + @Override public void run() { NotificationCompat.Builder b = new NotificationCompat.Builder(appContext); diff --git a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java index b93756b18..852fe3dc9 100644 --- a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java +++ b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java @@ -39,6 +39,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.inject.Inject; @@ -61,6 +62,7 @@ class PluginManagerImpl implements PluginManager, Service { private final Map plugins; private final List simplexPlugins; private final List duplexPlugins; + private final AtomicBoolean used = new AtomicBoolean(false); @Inject PluginManagerImpl(@IoExecutor Executor ioExecutor, EventBus eventBus, @@ -82,6 +84,7 @@ class PluginManagerImpl implements PluginManager, Service { @Override public void startService() throws ServiceException { + if (used.getAndSet(true)) throw new IllegalStateException(); Collection simplexFactories = pluginConfig.getSimplexFactories(); Collection duplexFactories = diff --git a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java index a5d02b5cc..52121c706 100644 --- a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java +++ b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.inject.Inject; @@ -44,6 +45,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private final Executor cryptoExecutor; private final Map validators; private final Map hooks; + private final AtomicBoolean used = new AtomicBoolean(false); @Inject ValidationManagerImpl(DatabaseComponent db, @@ -58,6 +60,7 @@ class ValidationManagerImpl implements ValidationManager, Service, @Override public void startService() { + if (used.getAndSet(true)) throw new IllegalStateException(); for (ClientId c : validators.keySet()) getMessagesToValidate(c); } @@ -78,6 +81,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private void getMessagesToValidate(final ClientId c) { dbExecutor.execute(new Runnable() { + @Override public void run() { try { Queue unvalidated = new LinkedList(); @@ -100,6 +104,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private void validateNextMessage(final Queue unvalidated) { if (unvalidated.isEmpty()) return; dbExecutor.execute(new Runnable() { + @Override public void run() { try { Message m = null; @@ -141,6 +146,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private void validateMessage(final Message m, final Group g) { cryptoExecutor.execute(new Runnable() { + @Override public void run() { MessageValidator v = validators.get(g.getClientId()); if (v == null) { @@ -156,6 +162,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private void storeValidationResult(final Message m, final ClientId c, final Metadata meta) { dbExecutor.execute(new Runnable() { + @Override public void run() { try { Transaction txn = db.startTransaction(false); @@ -193,6 +200,7 @@ class ValidationManagerImpl implements ValidationManager, Service, private void loadGroupAndValidate(final Message m) { dbExecutor.execute(new Runnable() { + @Override public void run() { try { Group g; diff --git a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java index fdcbe8f30..03b2c1366 100644 --- a/briar-core/src/org/briarproject/transport/KeyManagerImpl.java +++ b/briar-core/src/org/briarproject/transport/KeyManagerImpl.java @@ -28,6 +28,7 @@ import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; import javax.inject.Inject; @@ -47,6 +48,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { private final Clock clock; private final Map activeContacts; private final ConcurrentHashMap managers; + private final AtomicBoolean used = new AtomicBoolean(false); @Inject KeyManagerImpl(DatabaseComponent db, CryptoComponent crypto, @@ -66,6 +68,7 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { @Override public void startService() throws ServiceException { + if (used.getAndSet(true)) throw new IllegalStateException(); Map transports = new HashMap(); for (SimplexPluginFactory f : pluginConfig.getSimplexFactories())