Ensure that Service instances aren't reused.

This commit is contained in:
akwizgran
2016-05-05 17:51:55 +01:00
parent 57be439f08
commit 69f23ead9b
4 changed files with 40 additions and 8 deletions

View File

@@ -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<GroupId, Integer> contactCounts =
new HashMap<GroupId, Integer>();
private final Map<GroupId, Integer> forumCounts =
new HashMap<GroupId, Integer>();
private final Map<GroupId, Integer> contactCounts = new HashMap<>();
private final Map<GroupId, Integer> 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<Void> f = androidExecutor.submit(new Callable<Void>() {
@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);