/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.core.client.init;
import org.waveprotocol.wave.client.common.util.UserAgent;
import cc.kune.common.client.log.Log;
import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.common.client.notify.NotifyUser;
import cc.kune.common.client.notify.ProgressHideEvent;
import cc.kune.common.client.notify.UserNotifyEvent;
import cc.kune.common.client.resources.CommonResources;
import cc.kune.common.client.utils.WindowUtils;
import cc.kune.common.shared.utils.SimpleResponseCallback;
import cc.kune.common.shared.utils.TextUtils;
import cc.kune.core.client.events.AppStartEvent;
import cc.kune.core.client.events.AppStopEvent;
import cc.kune.core.client.rpcservices.SiteServiceAsync;
import cc.kune.core.client.state.Session;
import cc.kune.core.client.state.SiteParameters;
import cc.kune.core.shared.CoreConstants;
import cc.kune.core.shared.dto.InitDataDTO;
import com.google.web.bindery.event.shared.EventBus;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.Window.ClosingHandler;
import com.google.gwt.user.client.Window.Navigator;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.inject.Inject;
// TODO: Auto-generated Javadoc
/**
* The Class AppStarterDefault.
*
* @author danigb@gmail.com
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public class AppStarterDefault implements AppStarter {
/** The event bus. */
private final EventBus eventBus;
/** The prefetch utilities. */
private final PrefetchUtilities prefetchUtilities;
/** The res. */
private final CommonResources res;
/** The session. */
private final Session session;
/** The site service. */
private final SiteServiceAsync siteService;
/**
* Instantiates a new app starter default.
*
* @param session
* the session
* @param siteService
* the site service
* @param eventBus
* the event bus
* @param prefetchUtilities
* the prefetch utilities
* @param res
* the res
*/
@Inject
public AppStarterDefault(final Session session, final SiteServiceAsync siteService,
final EventBus eventBus, final PrefetchUtilities prefetchUtilities, final CommonResources res) {
this.session = session;
this.siteService = siteService;
this.eventBus = eventBus;
this.prefetchUtilities = prefetchUtilities;
this.res = res;
Window.addWindowClosingHandler(new ClosingHandler() {
@Override
public void onWindowClosing(final ClosingEvent event) {
eventBus.fireEvent(new AppStopEvent());
}
});
}
/**
* Check navigator compatibility.
*
* @param navSupport
* the nav support
*/
private void checkNavigatorCompatibility(final NavigatorSupport navSupport) {
if (!SiteParameters.checkUA()) {
// htmlunit server parsing
navSupport.onSupported();
} else {
// http://www.useragentstring.com/pages/useragentstring.php
final String userAgent = Navigator.getUserAgent().toLowerCase();
Log.info("User agent: " + userAgent);
if (UserAgent.isFirefox() || UserAgent.isWebkit() || UserAgent.isAndroid() || UserAgent.isChrome()
|| UserAgent.isSafari() || UserAgent.isMobileWebkit()) {
navSupport.onSupported();
} else {
navSupport.onNotSupported();
}
}
}
/**
* Gets the inits the data.
*
* @return the inits the data
*/
private void getInitData() {
siteService.getInitData(session.getUserHash(), new AsyncCallback<InitDataDTO>() {
private void continueStart(final InitDataDTO initData) {
eventBus.fireEvent(new AppStartEvent(initData));
}
private void hideInitialPanels() {
final RootPanel loadingElement = RootPanel.get("k-home-loading");
if (loadingElement != null) {
loadingElement.setVisible(false);
}
}
@Override
public void onFailure(final Throwable error) {
eventBus.fireEvent(new ProgressHideEvent());
eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error,
"Error fetching initial data from Kune server"));
Log.debug(error.getMessage());
hideInitialPanels();
}
@Override
public void onSuccess(final InitDataDTO initData) {
session.setInitData(initData);
session.setCurrentUserInfo(initData.getUserInfo(), null);
hideInitialPanels();
checkNavigatorCompatibility(new NavigatorSupport() {
@Override
public void onNotSupported() {
NotifyUser.askConfirmation(
res.important32(),
"Your browser is currently unsupported",
"Please, use a free/libre modern navigator like "
+ TextUtils.generateHtmlLink(CoreConstants.MOZILLA_FF_LINK, "Mozilla Firefox")
+ " instead. Continue anyway?", new SimpleResponseCallback() {
@Override
public void onCancel() {
WindowUtils.changeHref(CoreConstants.MOZILLA_FF_LINK);
}
@Override
public void onSuccess() {
continueStart(initData);
}
});
}
@Override
public void onSupported() {
continueStart(initData);
}
});
}
});
}
/*
* (non-Javadoc)
*
* @see cc.kune.core.client.init.AppStarter#start()
*/
@Override
public void start() {
prefetchUtilities.preFetchImpImages();
getInitData();
final Timer prefetchTimer = new Timer() {
@Override
public void run() {
prefetchUtilities.doTasksDeferred();
}
};
prefetchTimer.schedule(20000);
}
}