package org.limewire.ui.swing.friends.login;
import java.util.concurrent.ExecutionException;
import javax.swing.Action;
import javax.swing.SwingUtilities;
import org.limewire.concurrent.FutureEvent;
import org.limewire.concurrent.ListeningFuture;
import org.limewire.friend.api.FriendConnection;
import org.limewire.friend.api.FriendConnectionFactory;
import org.limewire.friend.api.FriendException;
import org.limewire.inject.EagerSingleton;
import org.limewire.lifecycle.Service;
import org.limewire.lifecycle.ServiceRegistry;
import org.limewire.listener.EventListener;
import org.limewire.listener.SwingEDTEvent;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.ui.swing.friends.settings.FriendAccountConfiguration;
import org.limewire.ui.swing.friends.settings.FriendAccountConfigurationManager;
import com.google.inject.Inject;
import com.google.inject.Provider;
@EagerSingleton
public class AutoLoginService implements Service {
private static final Log LOG = LogFactory.getLog(AutoLoginService.class);
private final FriendAccountConfigurationManager accountManager;
private volatile boolean hasAttemptedLogin = false;
private final FriendConnectionFactory friendConnectionFactory;
private final Provider<LoginPopupPanel> friendsSignInPanel;
@Inject
public AutoLoginService(FriendAccountConfigurationManager accountManager,
FriendConnectionFactory friendConnectionFactory,
Provider<LoginPopupPanel> friendsSignInPanel) {
this.accountManager = accountManager;
this.friendConnectionFactory = friendConnectionFactory;
this.friendsSignInPanel = friendsSignInPanel;
}
/**
* Used to identify whether or not this service will attempt to automatically login.
*/
public boolean hasLoginConfig() {
return accountManager.getAutoLoginConfig() != null;
}
/**
* Whether or not the service has attempted a login yet.
*/
public boolean hasAttemptedLogin() {
return hasAttemptedLogin;
}
/**
* If an auto login is in process.
*/
public boolean isAttemptingLogin() {
return !hasAttemptedLogin() && hasLoginConfig();
}
@Inject
void register(ServiceRegistry registry) {
registry.register(this);
}
@Override
public String getServiceName() {
return "Auto-Login Serivce";
}
@Override
public void initialize() {
}
@Override
public void start() {
// If there's an auto-login account, select it and log in
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if(hasLoginConfig()) {
final FriendAccountConfiguration config = accountManager.getAutoLoginConfig();
ListeningFuture<FriendConnection> connectionListenerFuture = friendConnectionFactory.login(config);
connectionListenerFuture.addFutureListener(new EventListener<FutureEvent<FriendConnection>>() {
@SwingEDTEvent
@Override
public void handleEvent(FutureEvent<FriendConnection> event) {
if(event.getType() == FutureEvent.Type.EXCEPTION) {
ExecutionException exception = event.getException();
if(exception.getCause() instanceof FriendException) {
LoginPopupPanel loginPanel = friendsSignInPanel.get();
loginPanel.setVisible(true);
Action login = loginPanel.getServiceSelectionLoginPanel().getLoginActions().get(config);
login.actionPerformed(null);
} else {
LOG.debug("auto-login failed", exception);
}
}
}
});
}
hasAttemptedLogin = true;
}
});
}
@Override
public void stop() {
}
}