package com.todoroo.astrid.actfm.sync;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.actfm.sync.messages.ClientToServerMessage;
public class ActFmSyncWaitingPool {
private static volatile ActFmSyncWaitingPool instance;
public static ActFmSyncWaitingPool getInstance() {
if (instance == null) {
synchronized(ActFmSyncWaitingPool.class) {
if (instance == null) {
instance = new ActFmSyncWaitingPool();
}
}
}
return instance;
}
private static final long WAIT_TIME = 15 * 1000L;
private final ExecutorService singleThreadPool;
private final List<ClientToServerMessage<?>> pendingMessages;
private final Runnable delayMessageRunnable = new Runnable() {
@Override
public void run() {
if (pendingMessages.isEmpty())
return;
AndroidUtilities.sleepDeep(WAIT_TIME);
while (!pendingMessages.isEmpty()) {
ActFmSyncThread.getInstance().enqueueMessage(pendingMessages.remove(0), ActFmSyncThread.DEFAULT_REFRESH_RUNNABLE);
}
}
};
private ActFmSyncWaitingPool() {
super();
singleThreadPool = Executors.newSingleThreadExecutor();
pendingMessages = Collections.synchronizedList(new LinkedList<ClientToServerMessage<?>>());
}
public synchronized void enqueueMessage(ClientToServerMessage<?> message) {
if (!pendingMessages.contains(message)) {
pendingMessages.add(message);
singleThreadPool.submit(delayMessageRunnable);
}
}
}