package com.acmetensortoys.ctfwstimer.lib;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
public class CtFwSGameStateManager {
return 0 == this.compareTo((Msg)o);
}
}
- private final List<Msg> msgs = new ArrayList<>();
+ private SortedSet<Msg> msgs = new TreeSet<>();
private long lastMsgTimestamp;
public void onNewMessage(String str) {
Msg m = null;
// XXX this is bogus
if (isMessageTimeWithin(t) && (lastMsgTimestamp <= t)) {
lastMsgTimestamp = t;
- if (!msgs.contains(m)) {
- msgs.add(m);
+ if (msgs.add(m)) {
notifyMessages();
}
}
}
public void onMessageReset(long before) {
synchronized(this) {
- while(!msgs.isEmpty()) {
- Msg m = msgs.get(0);
- if (m.when <= before) {
- msgs.remove(0);
- } else {
- break;
- }
+ if (!msgs.isEmpty() && msgs.first().when <= before) {
+ msgs = msgs.tailSet(new Msg(before, ""));
}
notifyMessages();
}
// (or since the last), even though usually one only cares about the most recent
// entry on the list. We reserve the right to trim this list in the future, but
// at the moment we do not. Callees should not alter the list in any way.
- void onCtFwSMessage(CtFwSGameStateManager game, List<Msg> msgs);
+ void onCtFwSMessage(CtFwSGameStateManager game, SortedSet<Msg> msgs);
}
final private Set<Observer> mObsvs = new HashSet<>();
private synchronized void notifyFlags() {
import com.acmetensortoys.ctfwstimer.lib.CtFwSGameStateManager;
import java.text.NumberFormat;
-import java.util.List;
-import java.util.ListIterator;
+import java.util.SortedSet;
import static android.view.View.INVISIBLE;
}
@Override
- public void onCtFwSMessage(CtFwSGameStateManager gs, List<CtFwSGameStateManager.Msg> msgs) {
+ public void onCtFwSMessage(CtFwSGameStateManager gs, SortedSet<CtFwSGameStateManager.Msg> msgs) {
final TextView msgstv = mAct.findViewById(R.id.msgs);
int s = msgs.size();
}
final StringBuffer sb = new StringBuffer();
- for (ListIterator<CtFwSGameStateManager.Msg> news = msgs.listIterator(0);
- news.hasNext(); ) {
-
- CtFwSGameStateManager.Msg m = news.next();
+ for (CtFwSGameStateManager.Msg m : msgs) {
long td = (m.when == 0) ? 0 : (gs.isConfigured()) ? m.when - gs.getStartT() : 0;
import java.text.NumberFormat;
import java.util.List;
+import java.util.SortedSet;
class MainServiceNotification {
final public String CTFWS_GAME_CHANNEL_ID = "GAME";
private int lastMsgIx = 0;
@Override
- public void onCtFwSMessage(CtFwSGameStateManager game, List<CtFwSGameStateManager.Msg> msgs) {
+ public void onCtFwSMessage(CtFwSGameStateManager game, SortedSet<CtFwSGameStateManager.Msg> msgs) {
// Only do anything if we have added something to the list since last we looked
// and if it's in (or after) the current game.
// Always update the length in case this is a reset to zero.
int s = msgs.size();
Log.d("CtFwSNotify", "on msg s=" + s + " lastix=" + lastMsgIx);
if (s > lastMsgIx) {
- CtFwSGameStateManager.Msg m = msgs.get(s-1);
+ CtFwSGameStateManager.Msg m = msgs.last();
Log.d("CtFwsNotify", "msg gst=" + game.getStartT() + " when=" + m.when);
if (game.isConfigured() && m.when >= game.getStartT()) {
notifyUserSomehow(NotificationSource.MESG);