/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.server; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.common.eventbus.Subscribe; import com.happydroids.HappyDroidConsts; import com.happydroids.droidtowers.TowerAssetManager; import com.happydroids.droidtowers.events.AssetLoadErrorEvent; import com.happydroids.droidtowers.events.AssetLoadEvent; import com.happydroids.droidtowers.gamestate.GameSaveFactory; import com.happydroids.droidtowers.gamestate.server.RunnableQueue; import com.happydroids.droidtowers.tasks.DownloadMovieAssetsTask; import com.happydroids.droidtowers.tasks.MovieState; import com.happydroids.server.HappyDroidServiceObject; import org.apach3.commons.io.FilenameUtils; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC; @JsonAutoDetect(fieldVisibility = PROTECTED_AND_PUBLIC) public class Movie extends HappyDroidServiceObject { protected String title; protected int atlasFps; protected String atlasTxt; protected String atlasPng; protected String youtubeTrailerUrl; protected String ticketsPurchaseUrl; @JsonIgnore private FileHandle atlasTxtFile; @JsonIgnore private FileHandle atlasPngFile; @JsonIgnore private MovieState state; @JsonIgnore private int refs; @JsonIgnore private RunnableQueue postLoad; @JsonIgnore private TextureAtlas textureAtlas; public Movie() { state = MovieState.Queued; postLoad = new RunnableQueue(); } @Override public String getBaseResourceUri() { return HappyDroidConsts.HAPPYDROIDS_URI + "/api/v1/movie/"; } @Override protected boolean requireAuthentication() { return false; } @Override protected int getCacheMaxAge() { return HappyDroidConsts.ONE_DAY; } @Override protected boolean isCachingAllowed() { return true; } public void loadAssets(final Runnable runnable) { postLoad.push(runnable); TowerAssetManager.assetManager().events().register(this); TowerAssetManager.assetManager().load(atlasTxtFile.file().getAbsolutePath(), TextureAtlas.class); } public void queueForDownload() { if (state.equals(MovieState.Loaded) || state.equals(MovieState.Downloading)) { return; } final FileHandle movieStorageRoot = GameSaveFactory.getStorageRoot().child("movies/"); if (!movieStorageRoot.exists()) { movieStorageRoot.mkdirs(); } setAtlasTxtFile(movieStorageRoot.child(FilenameUtils.getName(atlasTxt))); setAtlasPngFile(movieStorageRoot.child(FilenameUtils.getName(atlasPng))); new DownloadMovieAssetsTask(this).run(); } public TextureAtlas getTextureAtlas() { if (textureAtlas == null) { textureAtlas = TowerAssetManager.textureAtlas(getAtlasTxtFile().file().getAbsolutePath()); } return textureAtlas; } public int getAtlasFps() { return atlasFps; } public String getYoutubeTrailerUrl() { return youtubeTrailerUrl; } public String getTicketsPurchaseUrl() { return ticketsPurchaseUrl; } public String getTitle() { return title; } public void decrementRefCount() { refs -= 1; if (refs == 0) { textureAtlas.dispose(); textureAtlas = null; } } public void incrementRefCount() { refs += 1; } public FileHandle getAtlasTxtFile() { return atlasTxtFile; } public void setAtlasTxtFile(FileHandle atlasTxtFile) { this.atlasTxtFile = atlasTxtFile; } public FileHandle getAtlasPngFile() { return atlasPngFile; } public void setAtlasPngFile(FileHandle atlasPngFile) { this.atlasPngFile = atlasPngFile; } public String getAtlasPngUrl() { return HappyDroidConsts.HAPPYDROIDS_URI + atlasPng; } public String getAtlasTxtUrl() { return HappyDroidConsts.HAPPYDROIDS_URI + atlasTxt; } public void setState(MovieState state) { this.state = state; } public MovieState getState() { return state; } @Subscribe public void AssetManager_onAssetLoad(AssetLoadEvent event) { if (!event.getFileName().contains(atlasPngFile.name()) && !event.getFileName().contains(atlasTxtFile.name())) { return; } TowerAssetManager.events().unregister(this); setState(event instanceof AssetLoadErrorEvent ? MovieState.Failed : MovieState.Loaded); if (getState().equals(MovieState.Failed)) { if (atlasPngFile.exists()) { atlasPngFile.delete(); } if (atlasTxtFile.exists()) { atlasTxtFile.delete(); } MovieServer.instance().removeMovieFromPlayQueue(this); } postLoad.runAll(); } }