package de.tud.kom.socom.web.client.login;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.safehtml.shared.UriUtils;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import de.tud.kom.socom.web.client.AppController;
import de.tud.kom.socom.web.client.HistoryManager;
import de.tud.kom.socom.web.client.baseelements.AbstractMainPresenter;
import de.tud.kom.socom.web.client.baseelements.ViewInterface;
import de.tud.kom.socom.web.client.baseelements.ViewWithErrorsInterface;
import de.tud.kom.socom.web.client.baseelements.viewerrors.ErrorSocialMediaLoginFailedUserNotFoundView;
import de.tud.kom.socom.web.client.eventhandler.LoginEventHandler;
import de.tud.kom.socom.web.client.events.CommunicationFailureEvent;
import de.tud.kom.socom.web.client.events.LoginErrorNetworkUserNotFoundEvent;
import de.tud.kom.socom.web.client.events.LoginErrorWrongUserIDPasswortEvent;
import de.tud.kom.socom.web.client.events.LoginEvent;
import de.tud.kom.socom.web.client.events.LoginNetworkSuccessEvent;
import de.tud.kom.socom.web.client.events.LogoutEvent;
import de.tud.kom.socom.web.client.sharedmodels.LoginResult;
import de.tud.kom.socom.web.client.sharedmodels.SocialMediaApplications;
public class LoginOAuthWindowPresenter extends AbstractMainPresenter implements LoginEventHandler {
// this could implement a LoginWindowInterface that is used by View to
// callback to presenter
private LoginOAuthWindowViewInterface preLoginView;
private PostLoginOAuthWindowViewInterface postLoginView;
private SafeUri uri;
private Timer secondsTimer;
private int remainingSeconds;
private boolean isPostLogin;
/** Interface for views for this Presenter to implemented **/
public interface LoginOAuthWindowViewInterface extends ViewInterface {
void setVisibility(boolean visibility);
void clear();
void setOAuthLoginURL(SafeUri uri);
}
public interface PostLoginOAuthWindowViewInterface extends ViewWithErrorsInterface {
void setNetworkName(SocialMediaApplications app);
void showSuccess();
void showFailure();
void clear();
void setSecconds(int sec);
void close();
}
private static LoginOAuthWindowPresenter instance;
private LoginOAuthWindowPresenter(AppController appController) {
super(appController);
appController.getEventHandler().addHandler(LoginEvent.TYPE, this);
init();
}
public static LoginOAuthWindowPresenter getInstance(AppController appController) {
if (instance == null)
instance = new LoginOAuthWindowPresenter(appController);
return instance;
}
@Override
public void init() {
try {
String stateParameter = Location.getParameter(getAppController().getLoginManager().getNetworkLoginManager()
.getURLParameterForOAuthTokenProcessing());
isPostLogin = stateParameter != null
&& stateParameter.startsWith(getAppController().getLoginManager().getNetworkLoginManager().getURLParameterValueForOAuthTokenProcessing());
if (isPostLogin)
this.postLoginView = new PostLoginOAuthWindowView(this);
else
this.preLoginView = new LoginOAuthWindowView(this);
} catch (Throwable e) {
}
}
@Override
public void go(RootPanel targetPanel) {
setTargetPanel(targetPanel);
// an idea... setView(isPostLogin?postLoginView:preLoginView);
Widget viewWidget = isPostLogin ? postLoginView.asWidget() : preLoginView.asWidget();
if (!viewWidget.isAttached()) {
targetPanel.add(viewWidget);
} else {
if (isPostLogin)
postLoginView.clear();
else
preLoginView.clear(); // prevent old data to be displayed
}
if (isPostLogin) {
getAppController().getLoginManager().getNetworkLoginManager().receiveToken();
} else {
show();
}
}
public void setOAuthLoginURL(String url) {
this.uri = UriUtils.fromString(url); // maybe change to
// .fromTrustedString in case we
// trust any caller.
preLoginView.setOAuthLoginURL(this.uri);
}
public void hide() {
preLoginView.setVisibility(false);
if (preLoginView.asWidget().isAttached())
preLoginView.asWidget().removeFromParent();
}
public void show() {
if (this.uri != null)
preLoginView.setVisibility(true);
}
/* called by view */
public void onViewClosed() {
String sid = getAppController().getLoginManager().getSessionID();
getAppController().getRPCFactory().getLoginService().isLoggedIn(sid, new AsyncCallback<LoginResult>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(caught.toString());
getAppController().getEventHandler().fireEvent(new CommunicationFailureEvent(caught));
}
@Override
public void onSuccess(LoginResult result) {
if(result.isSuccess()) {
getAppController().getLoginManager().storeLoginInformation(result, false, false);
getAppController().getEventHandler().fireEvent(new LoginNetworkSuccessEvent(result.getUid(), SocialMediaApplications.facebook));
} else {
getAppController().getEventHandler().fireEvent(new LoginErrorNetworkUserNotFoundEvent());
}
}
});
}
@Override
public void onLoginSuccessEvent(LoginEvent event) {
hide();
}
@Override
public void onLogoutEvent(LogoutEvent event) {
hide();
}
@Override
public void onLoginErrorNetworkUserNotFound(LoginErrorNetworkUserNotFoundEvent loginErrorNetworkUserNotFound) {
this.postLoginView.showError(new ErrorSocialMediaLoginFailedUserNotFoundView());
}
@Override
public void onLoginErrorWrongUserIDPasswortEvent(LoginErrorWrongUserIDPasswortEvent loginErrorWrongUserIDPasswortEvent) {
// ignore...not my stuff..?
}
@Override
public void onLoginNetworkSuccessEvent(LoginEvent event) {
if (!this.isPostLogin)
return;
if (event instanceof LoginNetworkSuccessEvent) {
postLoginView.setNetworkName(((LoginNetworkSuccessEvent) event).getSocialMediaApplicationUsed());
}
postLoginView.showSuccess();
postLoginView.hideErrors();
// add a timer counting down the seconds and closing window then
// automatically
this.remainingSeconds = 9;
if (secondsTimer != null) {
secondsTimer.cancel();
} else {
secondsTimer = new Timer() {
public void run() {
if (--remainingSeconds == 0) {
// close
postLoginView.close();
this.cancel();
return;
}
postLoginView.setSecconds(remainingSeconds);
}
};
}
secondsTimer.scheduleRepeating(1000);
}
public void onCloseButtonClick() {
if (this.secondsTimer != null)
this.secondsTimer.cancel();
postLoginView.close();
}
public void onRetryButtonClick() {
HistoryManager.back();
}
}