package org.limewire.xmpp.client.impl;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Future;
import org.limewire.friend.api.FriendConnectionEvent;
import org.limewire.listener.EventBean;
import org.limewire.listener.EventBroadcaster;
import org.limewire.xmpp.activity.XmppActivityEvent;
import org.limewire.xmpp.activity.XmppActivityEvent.ActivityState;
import com.google.inject.Inject;
import com.google.inject.name.Named;
public class IdleStatusMonitor {
private static final int TWENTY_MINUTES_IN_MILLIS = 1200000;
private final IdleTime idleTime;
private final ScheduledExecutorService backgroundExecutor;
private final EventBroadcaster<XmppActivityEvent> activityBroadcaster;
private EventBean<FriendConnectionEvent> connectionEvent;
private Future task;
@Inject
public IdleStatusMonitor(@Named("backgroundExecutor") ScheduledExecutorService backgroundExecutor,
IdleTime idleTime, EventBroadcaster<XmppActivityEvent> activityBroadcaster,
EventBean<FriendConnectionEvent> connectionSupport) {
this.backgroundExecutor = backgroundExecutor;
this.idleTime = idleTime;
this.activityBroadcaster = activityBroadcaster;
this.connectionEvent = connectionSupport;
}
public void start() {
task = backgroundExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
FriendConnectionEvent lastEvent = connectionEvent.getLastEvent();
if (idleTime.supportsIdleTime() && lastEvent != null && lastEvent.getType().equals(FriendConnectionEvent.Type.CONNECTED)) {
if (idleTime.getIdleTime() > TWENTY_MINUTES_IN_MILLIS) {
activityBroadcaster.broadcast(new XmppActivityEvent(ActivityState.Idle));
} else {
activityBroadcaster.broadcast(new XmppActivityEvent(ActivityState.Active));
}
}
}
}, 0, 1, TimeUnit.SECONDS);
}
public void stop() {
if (task != null) {
task.cancel(false);
}
}
}