package net.thesocialos.client.presenter; import java.util.Date; import net.thesocialos.client.CacheLayer; import net.thesocialos.client.TheSocialOS; import net.thesocialos.client.helper.ElementWrapper; import net.thesocialos.client.helper.RPCXSRF; import net.thesocialos.client.service.UserService; import net.thesocialos.client.service.UserServiceAsync; import net.thesocialos.shared.LoginResult; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.InputElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.HandlerRegistration; import com.google.web.bindery.event.shared.SimpleEventBus; public class LoginPresenter implements Presenter { ElementWrapper wrapper; HandlerRegistration handlerRegistration; public interface Display { Widget asWidget(); String getEmail(); String getPassword(); boolean getKeepLoged(); InputElement getLoginButton(); DivElement getError(); Anchor getSpainFlag(); Anchor getUsaFlag(); } private final UserServiceAsync userService = GWT.create(UserService.class); private final Display display; public LoginPresenter(SimpleEventBus eventBus, Display display) { this.display = display; } /** * Binds this presenter to its view and adds its handlers. */ public void bind() { wrapper = new ElementWrapper(display.getLoginButton()); wrapper.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (display.getEmail().isEmpty() && display.getPassword().isEmpty()) { display.getError().getStyle().setDisplay(com.google.gwt.dom.client.Style.Display.BLOCK); display.getError().setInnerText(TheSocialOS.getConstants().error_Email()); } doLogin(); } }); handlerRegistration = Event.addNativePreviewHandler(new NativePreviewHandler() { @Override public void onPreviewNativeEvent(NativePreviewEvent event) { // TODO Auto-generated method stub if (event.getNativeEvent().getKeyCode() == 13) { display.getLoginButton().click(); handlerRegistration.removeHandler(); } } }); wrapper.onAttach(); display.getSpainFlag().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { changeLanguage("es"); } }); display.getUsaFlag().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { changeLanguage("en"); } }); } /** * Make a request to the server to check if the user and password entered are correct and in case they are it checks * if the checkbox to remember the user is checked, creates the necessary cookies, logs the user in and loads the * desktop. */ private void doLogin() { new RPCXSRF<LoginResult>(userService) { @Override public void onFailure(Throwable caught) { Window.alert("Error: " + caught.getMessage()); } @Override public void onSuccess(LoginResult result) { if (result == null) { display.getError().getStyle().setDisplay(com.google.gwt.dom.client.Style.Display.BLOCK); display.getError().setInnerText(TheSocialOS.getConstants().error_login()); } else { // The user exists and the password is correct CacheLayer.UserCalls.setUser(result.getUser()); if (result.getDuration() < 0) Cookies.setCookie("sid", result.getSessionID()); else { Date expires = new Date(System.currentTimeMillis() + result.getDuration()); Cookies.setCookie("sid", result.getSessionID(), expires); } CacheLayer.UserCalls.refreshAccounts(); CacheLayer.UserCalls.refreshColumns(); TheSocialOS.startChannelApi(); History.newItem("desktop"); } } @Override protected void XSRFcallService(AsyncCallback<LoginResult> cb) { userService.login(display.getEmail().trim(), display.getPassword().trim(), display.getKeepLoged(), cb); } }.retry(3); } @Override public void go(final HasWidgets container) { container.clear(); // Clear the screen container.add(display.asWidget()); // Print the login screen bind(); } public void changeLanguage(String language) { Cookies.setCookie("_lang", language); String url = Window.Location.getHref(); if (url.contains("locale")) url = url.substring(0, url.indexOf("locale") - 1); else url = url.substring(0, url.indexOf("#")); Window.Location.assign(url); } }