package org.limewire.friend.impl; import java.util.concurrent.atomic.AtomicLong; import org.limewire.friend.api.FriendConnectionEvent; import org.limewire.inject.EagerSingleton; import org.limewire.inspection.DataCategory; import org.limewire.inspection.Inspectable; import org.limewire.inspection.InspectionPoint; import org.limewire.inspection.InspectableContainer; import org.limewire.listener.EventListener; import org.limewire.listener.ListenerSupport; import com.google.inject.Inject; @EagerSingleton public class SessionTimeListener implements EventListener<FriendConnectionEvent> { private long connectedTime; private final AtomicLong previousSessionTimes = new AtomicLong(); @SuppressWarnings("unused") @InspectableContainer private class LazyInspectableContainer { @SuppressWarnings("unused") @InspectionPoint(value = "friends session time", category = DataCategory.USAGE) private Inspectable sessionTime = new SessionTimeInspectable(); } @Inject void register(ListenerSupport<FriendConnectionEvent> listenerSupport){ listenerSupport.addListener(this); } @Override public void handleEvent(FriendConnectionEvent event) { synchronized (previousSessionTimes) { switch (event.getType()) { case CONNECTED: connectedTime = System.currentTimeMillis(); break; case DISCONNECTED: previousSessionTimes.addAndGet(System.currentTimeMillis() - connectedTime); connectedTime = 0; break; } } } private class SessionTimeInspectable implements Inspectable { @Override public Object inspect() { synchronized (previousSessionTimes) { return connectedTime == 0 ? previousSessionTimes.get() : previousSessionTimes.get() + (System.currentTimeMillis() - connectedTime); } } } }