From 7d6104387d7f5a99a6d9c01e011c2cc7e9312cf4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Mon, 9 Feb 2015 15:42:53 +0100
Subject: [PATCH] #7 Tablexia abstract screen lifecycle

 * screen loading transactions delay
 * screen fully visible handler
---
 .../cz/nic/tablexia/TablexiaApplication.java  | 85 ++++++++++++-------
 .../game/games/robbery/DebugScreen.java       |  2 +-
 .../game/games/robbery/GameScreen.java        |  4 +-
 .../game/games/robbery/RuleScreen.java        |  7 +-
 .../screen/AbstractTablexiaScreen.java        | 79 +++++++++++++----
 .../cz/nic/tablexia/screen/LoaderScreen.java  |  4 +-
 .../tablexia/screen/about/AboutScreen.java    |  2 +-
 .../encyclopedia/EncyclopediaScreen.java      |  2 +-
 .../screen/gamemenu/GameMenuScreen.java       |  5 +-
 .../screen/halloffame/HallOfFameScreen.java   |  2 +-
 .../screen/statistics/StatisticsScreen.java   |  6 +-
 11 files changed, 134 insertions(+), 64 deletions(-)

diff --git a/core/src/cz/nic/tablexia/TablexiaApplication.java b/core/src/cz/nic/tablexia/TablexiaApplication.java
index c843bad35..5959f6491 100644
--- a/core/src/cz/nic/tablexia/TablexiaApplication.java
+++ b/core/src/cz/nic/tablexia/TablexiaApplication.java
@@ -12,14 +12,15 @@ import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.InputMultiplexer;
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.GL20;
-import com.badlogic.gdx.graphics.Pixmap.Format;
 import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.Batch;
 import com.badlogic.gdx.math.Interpolation;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 
+import cz.nic.tablexia.graphics.ColorTexture;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
+import cz.nic.tablexia.screen.AbstractTablexiaScreen.ScreenLoadingListener;
 
 /**
  * Abstract Tablexia libGDX application listener with screen transactions implementation.
@@ -144,7 +145,7 @@ public abstract class TablexiaApplication implements ApplicationListener {
 	 * @param newScreen new screen to change for
 	 * @param screenTransaction screen transaction type
 	 */
-	public void setScreen (AbstractTablexiaScreen newScreen, ScreenTransaction screenTransaction) {
+	public void setScreen (final AbstractTablexiaScreen newScreen, ScreenTransaction screenTransaction) {
 		if (screenTransaction == null) {
 			setScreen(newScreen);
 		} else {			
@@ -165,6 +166,13 @@ public abstract class TablexiaApplication implements ApplicationListener {
 				public void run() {
 					processLastScreen(lastScreen);
 				}
+			},
+			
+			new Runnable() {
+				@Override
+				public void run() {
+					newScreen.performScreenVisible();
+				}
 			});
 		}
 	}
@@ -205,7 +213,7 @@ public abstract class TablexiaApplication implements ApplicationListener {
 		FADE		(new FadeAnimation());
 		
 		private interface ScreenTransactionImplementation {
-			public void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, Runnable finishHandler);
+			public void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, Runnable lastScreenHandler, Runnable finishHandler);
 		}
 		
 		private ScreenTransactionImplementation screenTransactionImplementation;
@@ -214,8 +222,8 @@ public abstract class TablexiaApplication implements ApplicationListener {
 			this.screenTransactionImplementation = screenTransactionImplementation;
 		}
 		
-		private void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, Runnable finishHandler) {
-			screenTransactionImplementation.processTransaction(stage, lastScreen, newScreen, startHandler, finishHandler);
+		private void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, Runnable lastScreenHandler, Runnable finishHandler) {
+			screenTransactionImplementation.processTransaction(stage, lastScreen, newScreen, newScreenHandler, lastScreenHandler, finishHandler);
 		}
 	}
 	
@@ -225,35 +233,46 @@ public abstract class TablexiaApplication implements ApplicationListener {
 		protected float newScreenMoveTo 	= 0;
 		protected float lastScreenMoveTo 	= Gdx.graphics.getWidth();
 		
-		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, final Runnable finishHandler) {
-			int transactionSpeed = 2;
-			if (lastScreen != null) {
-				lastScreen.addAction(sequence(moveTo(lastScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out),
-											  run(finishHandler)));
-			}
-			if (newScreen != null) {
-				newScreen.setPosition(newScreenMoveFrom, 0);
-				newScreen.addAction(moveTo(newScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out));
-				startHandler.run();
-			}
+		@Override
+		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) {
+			final int transactionSpeed = 2;
+			newScreen.setLoadingListener(new ScreenLoadingListener() {
+				
+				@Override
+				public void loadingComplete() {
+					newScreen.resetLoadingListener();
+					if (lastScreen != null) {
+						lastScreen.addAction(sequence(moveTo(lastScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out),
+													  run(lastScreenHandler)));
+					}
+					if (newScreen != null) {
+						newScreen.setPosition(newScreenMoveFrom, 0);
+						newScreen.addAction(sequence(moveTo(newScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out),
+													 run(finishHandler)));
+					}
+				}
+			});
+			newScreenHandler.run();
 		}
 	}
 	
 	private static class MoveLeftAnimation extends MoveRightAnimation {
 		
-		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, final Runnable finishHandler) {
+		@Override
+		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) {
 			newScreenMoveFrom 	= Gdx.graphics.getWidth();
 			newScreenMoveTo 	= 0;
 			lastScreenMoveTo 	= -Gdx.graphics.getWidth();
-			super.processTransaction(stage, lastScreen, newScreen, startHandler, finishHandler);
+			super.processTransaction(stage, lastScreen, newScreen, newScreenHandler, lastScreenHandler, finishHandler);
 		}
 	}
 	
 	private static class FadeAnimation implements cz.nic.tablexia.TablexiaApplication.ScreenTransaction.ScreenTransactionImplementation {
 		
-		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, final Runnable startHandler, final Runnable finishHandler) {
-			int transactionSpeed = 1;
-			final Texture texture = new Texture(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Format.RGB565);
+		@Override
+		public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, final Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) {
+			final int transactionSpeed = 1;
+			final Texture texture = new ColorTexture(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Color.BLACK);
 			final Actor screenDimmer = new Actor(){
 				
 				public void draw(Batch batch, float parentAlpha) {
@@ -262,16 +281,24 @@ public abstract class TablexiaApplication implements ApplicationListener {
 					batch.setColor(Color.WHITE);
 				};
 			};
+			newScreen.setLoadingListener(new ScreenLoadingListener() {
+				
+				@Override
+				public void loadingComplete() {
+					newScreen.resetLoadingListener();
+					screenDimmer.addAction(sequence(fadeOut(transactionSpeed, Interpolation.pow4In),
+													run(finishHandler),
+													run(new Runnable() {
+														public void run() {
+															screenDimmer.remove();
+														}
+													})));
+				}
+			});
 			screenDimmer.addAction(alpha(0));
 			screenDimmer.addAction(sequence(fadeIn(transactionSpeed, Interpolation.pow4Out),
-											run(startHandler),
-											run(finishHandler),
-											fadeOut(transactionSpeed, Interpolation.pow4In),
-											run(new Runnable() {
-												public void run() {
-													screenDimmer.remove();
-												}
-											})));
+											run(newScreenHandler),
+											run(lastScreenHandler)));
 			stage.addActor(screenDimmer);
 		}
 	}
diff --git a/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java
index 5b9fbb3bf..1257e8c00 100644
--- a/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java
+++ b/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java
@@ -40,7 +40,7 @@ public class DebugScreen extends AbstractTablexiaScreen {
     }
 	
 	@Override
-	protected void showScreen() {		
+	protected void screenLoaded() {		
 		displayAllCreatures(RobberyDataManager.getInstance().getResult().getCreatures(), getStage());
 	}
 	
diff --git a/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java
index ac98cad6b..4aca56691 100644
--- a/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java
+++ b/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java
@@ -248,7 +248,7 @@ public class GameScreen extends AbstractTablexiaScreen {
 	private int 	creatureNumber = -1;
 
 	@Override
-	public void showScreen() {
+	public void screenLoaded() {
 		super.show();
 		
 		getStage().addActor(new GameBackground());
@@ -264,7 +264,7 @@ public class GameScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	public void resizeScreen(int width, int height) {
+	public void screenResized(int width, int height) {
 		InfoItem.calculateDimensions(width, height);
 		prepareCreaturePositions(width, height);
 	}
diff --git a/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java
index 76ebbc549..cc1145d12 100644
--- a/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java
+++ b/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java
@@ -90,7 +90,7 @@ public class RuleScreen extends AbstractTablexiaScreen {
 	}
 
 	@Override
-	public void showScreen() {
+	public void screenLoaded() {
 		super.show();
 		
 		if (!loadingComplete) {			
@@ -265,7 +265,7 @@ public class RuleScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	public void resizeScreen(int width, int height) {
+	public void screenResized(int width, int height) {
 		if (loadingComplete) {			
 			background.setSize(width, height);
 			paper.setSize(width, height);
@@ -275,8 +275,7 @@ public class RuleScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	public void dispose() {
-		super.dispose();
+	public void screenDisposed() {
 		//TODO move to gameEnd method
 		RobberyTextureManager.getInstance().dispose();
 		RobberyDataManager.getInstance().dispose();
diff --git a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
index 95b98e246..22ee1c4b8 100644
--- a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
+++ b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
@@ -20,6 +20,7 @@ import com.badlogic.gdx.utils.viewport.ScreenViewport;
 
 import cz.nic.tablexia.game.loader.AbstractDataManager;
 import cz.nic.tablexia.loader.IApplicationLoader;
+import cz.nic.tablexia.util.Log;
 
 public abstract class AbstractTablexiaScreen extends ScreenAdapter {
 	
@@ -49,23 +50,45 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter {
 		}
 	}
 	
-	private Stage 			stage;
-	private AssetManager 	textureManager;
-	private TextManager 	textManager;
-	private boolean			loadingComplete;
-	private boolean			loadingStarted;
+	public static interface ScreenLoadingListener {
+		void loadingComplete();
+	}
+	
+	private Stage 					stage;
+	private AssetManager 			textureManager;
+	private TextManager 			textManager;
+	private ScreenLoadingListener 	screenLoadingListener;
+	private boolean					loadingComplete;
+	private boolean					loadingStarted;
+	
 	
 	public AbstractTablexiaScreen() {
 		stage = prepareStage();
 		textureManager 	= new AssetManager();
 		textManager 	= new TextManager();
 		
-		
 		loadingComplete = false;
 		loadingStarted = false;
 	}
 	
 	
+//////////////////////////// LOADING LISTENER
+	
+	private void notifyLoadingCompleteListeners() {
+		if (screenLoadingListener != null) {
+			screenLoadingListener.loadingComplete();
+		}
+	}
+	
+	public void setLoadingListener(ScreenLoadingListener listener) {
+		screenLoadingListener = listener;
+	}
+	
+	public void resetLoadingListener() {
+		screenLoadingListener = null;
+	}
+	
+	
 //////////////////////////// STAGE
 
 	private Stage prepareStage() {
@@ -101,7 +124,7 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter {
 		super.resize(width, height);
 		stage.getViewport().update(width, height, true);
 		if (loadingComplete) {
-			resizeScreen(width, height);
+			performScreenResized(width, height);
 		}
 	}
 
@@ -112,32 +135,54 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter {
 				if (!textureManager.update()) return;
 				if (!textManager.update()) return;
 				loadingComplete = true;
-				showScreen();
-				resizeScreen((int)stage.getWidth(), (int)stage.getHeight());
+				performScreenLoaded();
+				performScreenResized((int)stage.getWidth(), (int)stage.getHeight());
+				notifyLoadingCompleteListeners();
 			}
-		} else {			
+		} else {
 			stage.act(Gdx.graphics.getDeltaTime());
 			stage.draw();
 		}
 	};
 	
 	@Override
-	public void dispose() {
+	public final void dispose() {
 		stage.dispose();
 		textureManager.dispose();
 		textManager.dispose();
+		performScreenDisposed();
 	}
 	
 	
 //////////////////////////// TABLEXIA SCREEN LIFECYCLE
 	
-	protected abstract void showScreen();
+	private final void performScreenLoaded() {
+		Log.info(getClass().getName(), "[ ------- Screen Loaded ------- ]");
+		screenLoaded();
+	}
 	
-	protected void resizeScreen(int width, int height) {};
+	public final void performScreenVisible() {
+		Log.info(getClass().getName(), "[ ------- Screen Visible ------- ]");
+		screenVisible();
+	}
+	
+	private final void performScreenResized(int width, int height) {
+		Log.info(getClass().getName(), "[ ------- Screen Resized ------- ]");
+		screenResized(width, height);
+	}
+	
+	private final void performScreenDisposed() {
+		Log.info(getClass().getName(), "[ ------- Screen Disposed ------- ]");
+		screenDisposed();
+	}
 	
-	protected void prepareTextureAssetNames(List<String> texturesFileNames) {}
+	protected void screenLoaded() {};
+	protected void screenVisible() {};
+	protected void screenResized(int width, int height) {};
+	protected void screenDisposed() {};
 	
-	protected String prepareTextResourcesAssetName() {
+	protected void 			prepareScreenTextureAssetNames(List<String> texturesFileNames) {}
+	protected String 		prepareScreenTextResourcesAssetName() {
 		return null;
 	}
 	
@@ -146,14 +191,14 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter {
 	
 	private void startTextureLoader() {
 		List<String> texturesFileNames = new ArrayList<String>();
-		prepareTextureAssetNames(texturesFileNames);
+		prepareScreenTextureAssetNames(texturesFileNames);
 		for (String textureFileName : texturesFileNames) {
 			textureManager.load(textureFileName, Texture.class);
 		}
 	}
 	
 	private void startTextLoader() {
-		textManager.load(new Locale("cs", "CZ"), prepareTextResourcesAssetName());
+		textManager.load(new Locale("cs", "CZ"), prepareScreenTextResourcesAssetName());
 	}
 	
 	
diff --git a/core/src/cz/nic/tablexia/screen/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/LoaderScreen.java
index 5c9472de4..6816c7bb2 100644
--- a/core/src/cz/nic/tablexia/screen/LoaderScreen.java
+++ b/core/src/cz/nic/tablexia/screen/LoaderScreen.java
@@ -31,13 +31,13 @@ public class LoaderScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		background = new LoaderBackground();
 		getStage().addActor(background);
 	}
 	
 	@Override
-	public void resizeScreen(int width, int height) {
+	public void screenResized(int width, int height) {
 		background.setSize(width, height);
 	}
 
diff --git a/core/src/cz/nic/tablexia/screen/about/AboutScreen.java b/core/src/cz/nic/tablexia/screen/about/AboutScreen.java
index ab9f93857..acca98915 100644
--- a/core/src/cz/nic/tablexia/screen/about/AboutScreen.java
+++ b/core/src/cz/nic/tablexia/screen/about/AboutScreen.java
@@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 public class AboutScreen extends AbstractTablexiaScreen {
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE));
 		Table table = new Table();
 		table.add(label);
diff --git a/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java b/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java
index dfb70f367..f221d6fa2 100644
--- a/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java
+++ b/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java
@@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 public class EncyclopediaScreen extends AbstractTablexiaScreen {
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE));
 		Table table = new Table();
 		table.add(label);
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
index 6f7c65339..c9288c651 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
@@ -31,14 +31,13 @@ public class GameMenuScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		background = new GameMenuBackground();
 		getStage().addActor(background);
 	}
 	
 	@Override
-	public void resizeScreen(int width, int height) {
+	public void screenResized(int width, int height) {
 		background.setSize(width, height);
 	}
-
 }
diff --git a/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java b/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java
index 7effc96ae..e64440f6a 100644
--- a/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java
+++ b/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java
@@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 public class HallOfFameScreen extends AbstractTablexiaScreen {
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE));
 		Table table = new Table();
 		table.add(label);
diff --git a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java
index 5f8898d02..70b1ec942 100644
--- a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java
+++ b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java
@@ -22,12 +22,12 @@ public class StatisticsScreen extends AbstractTablexiaScreen {
 	private Container<Label> 	backgroundLayout;
 
 	@Override
-	protected void prepareTextureAssetNames(List<String> texturesFileNames) {
+	protected void prepareScreenTextureAssetNames(List<String> texturesFileNames) {
 		texturesFileNames.add(BACKGROUND_TEXTURE);
 	}
 	
 	@Override
-	protected void showScreen() {
+	protected void screenLoaded() {
 		backgroundLayout = new Container<Label>();
 		backgroundLayout.setBackground(new TextureRegionDrawable(new TextureRegion(getTexture(BACKGROUND_TEXTURE))));
 		
@@ -40,7 +40,7 @@ public class StatisticsScreen extends AbstractTablexiaScreen {
 	}
 	
 	@Override
-	protected void resizeScreen(int width, int height) {		
+	protected void screenResized(int width, int height) {		
 		backgroundLayout.setBounds(0, 0, getStage().getWidth(), getStage().getHeight());
 	}
 
-- 
GitLab