/*
* Copyright (c) 2012. HappyDroids LLC, All rights reserved.
*/
package com.happydroids.droidtowers.gui;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.happydroids.droidtowers.DroidTowersGame;
import com.happydroids.droidtowers.TowerConsts;
import com.happydroids.droidtowers.gamestate.server.TemporaryToken;
import com.happydroids.droidtowers.gamestate.server.TowerGameService;
import com.happydroids.droidtowers.scenes.MainMenuScene;
import com.happydroids.droidtowers.scenes.components.SceneManager;
import com.happydroids.droidtowers.utils.PeriodicBackgroundTask;
import com.happydroids.platform.LaunchBrowserAfterDelay;
import com.happydroids.server.ApiRunnable;
import com.happydroids.server.HappyDroidServiceObject;
import org.apach3.http.HttpResponse;
public class ConnectToHappyDroidsWindow extends TowerWindow {
private static final String TAG = ConnectToHappyDroidsWindow.class.getSimpleName();
private TemporaryToken token;
private PeriodicBackgroundTask periodicBackgroundTask;
private final TextButton openBrowserButton;
private Runnable postConnectRunnable;
private final Label sessionStatus;
public ConnectToHappyDroidsWindow(Stage stage) {
super("Connect to Happy Droids", stage);
openBrowserButton = FontManager.RobotoBold18.makeTextButton("Open my web browser");
openBrowserButton.setVisible(false);
sessionStatus = FontManager.Roboto24.makeLabel("Waiting for You to login...");
clear();
defaults().center();
add(FontManager.Roboto24.makeLabel("Connect to happydroids.com"));
row();
add(sessionStatus);
row();
add(openBrowserButton);
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
token = new TemporaryToken();
token.save(new TemporaryTokenApiRunnable());
}
});
}
public void setPostConnectRunnable(Runnable postConnectRunnable) {
this.postConnectRunnable = postConnectRunnable;
}
private class TemporaryTokenApiRunnable extends ApiRunnable {
@Override
public void onError(HttpResponse response, int statusCode, HappyDroidServiceObject object) {
sessionStatus.setText(String.format("Login failed: %d!", statusCode));
new Dialog(DroidTowersGame.getRootUiStage())
.setTitle("Connection Error")
.setMessage("Could not contact happydroids.com, please your internet connection and try again.\n\nERROR:ETFAIL2FONHOME")
.addButton("Dismiss", new OnClickCallback() {
@Override
public void onClick(Dialog dialog) {
dialog.dismiss();
ConnectToHappyDroidsWindow.this.dismiss();
}
}).show();
}
@Override
public void onSuccess(HttpResponse response, HappyDroidServiceObject object) {
openBrowserButton.setText("CODE: " + token.getValue());
openBrowserButton.setVisible(true);
sessionStatus.setVisible(true);
openBrowserButton.addListener(new VibrateClickListener() {
@Override
public void onClick(InputEvent event, float x, float y) {
Gdx.app.postRunnable(new LaunchBrowserAfterDelay(token.getClickableUri(), 1.5f));
}
});
InputEvent event = new InputEvent();
event.setType(InputEvent.Type.touchDown);
openBrowserButton.fire(event);
periodicBackgroundTask = new AccessTokenCheckStateTask();
periodicBackgroundTask.run();
setDismissCallback(new Runnable() {
public void run() {
periodicBackgroundTask.cancel();
}
});
}
private class AccessTokenCheckStateTask extends PeriodicBackgroundTask {
public AccessTokenCheckStateTask() {
super(TowerConsts.FACEBOOK_CONNECT_DELAY_BETWEEN_TOKEN_CHECK);
}
@Override
public boolean update() {
if (token == null) {
return false;
}
try {
token.validate();
Gdx.app.debug(TAG, "Checking token: " + token);
return !token.hasSessionToken();
} catch (RuntimeException e) {
Gdx.app.error(TAG, "Error validating the temporary token.", e);
}
return false;
}
@Override
public synchronized void beforeExecute() {
TowerGameService.instance().resetAuthentication();
}
@Override
public synchronized void afterExecute() {
if (token != null && token.hasSessionToken()) {
TowerGameService.instance().setSessionToken(token.getSessionToken());
new Dialog()
.setTitle("Connect to happydroids.com")
.setMessage("Congratulations, you are now connected to happydroids.com.\n\nYou can now share your Towers with friends\nby clicking the view neighbors button in game.")
.addButton("Dismiss", new OnClickCallback() {
@Override
public void onClick(Dialog dialog) {
dialog.dismiss();
dismiss();
if (SceneManager.activeScene() instanceof MainMenuScene) {
SceneManager.restartActiveScene();
}
}
})
.show();
} else {
new Dialog()
.setTitle("Connect to happydroids.com")
.setMessage("Sorry, but we were unable to connect to happydroids.com.\n\nPlease try again later.")
.addButton("Dismiss", new OnClickCallback() {
@Override
public void onClick(Dialog dialog) {
dialog.dismiss();
dismiss();
}
})
.show();
}
if (postConnectRunnable != null) {
postConnectRunnable.run();
}
}
}
}
}