/** * Schedules the saving of game preview screenshot. * * @param saveDirPath to save folder */ public void takeGamePreview(final Path saveDirPath) { this.savingGamePreview = true; this.savedGamePath = GamePreviewImageProvider.getNextGamePreviewImagePath(saveDirPath); this.saveScreenshot(); } }
private static List<Path> getAllPathsToFilesInFolder(final Path dirPath) { // create folder if not exists yet createDirectory(dirPath); try (Stream<Path> stream = Files.list(dirPath).filter(Files::isRegularFile)) { return stream.collect(Collectors.toList()); } catch (Exception e) { logger.warn("Can't correctly read files from {}", dirPath); return Collections.emptyList(); } }
/** * Gets a path to next game preview image. * * @param savePath a path to saves directory * @return a path to preview image */ public static Path getNextGamePreviewImagePath(final Path savePath) { final StoragePathProvider storagePathProvider = new StoragePathProvider(savePath); final Path previewsDirPath = storagePathProvider.getPreviewsPath(); final List<Path> previewsPaths = getAllPathsToFilesInFolder(previewsDirPath); final String fileName = getNextPreviewImageName(previewsPaths); return previewsDirPath.resolve(fileName); }
/** * Gets next preview image name. Names are looped and starts from 1.jpg. * If there are less than limit files. It takes next number, else the oldest file. */ private static String getNextPreviewImageName(final List<Path> paths) { if (paths.size() < LIMIT) { return getNextNumberFileName(paths); } return getOldestFileName(paths); }
private void loadPreviewImages(final GameInfo gameInfo) { List<Texture> textures = new ArrayList<>(); if (gameInfo != null && gameInfo.getSavePath() != null) { final List<BufferedImage> bufferedImages = GamePreviewImageProvider.getAllPreviewImages(gameInfo.getSavePath()); textures = bufferedImages .stream() .map(buffImage -> { TextureData textureData; try { textureData = AWTTextureFormat.convertToTextureData(buffImage, Texture.FilterMode.LINEAR); } catch (IOException e) { logger.error("Converting preview image to texture data {} failed", e); return null; } return Assets.generateAsset(new ResourceUrn(PREVIEW_IMAGE_URI_PATTERN + bufferedImages.indexOf(buffImage)), textureData, Texture.class); }) .filter(Objects::nonNull) .collect(Collectors.toList()); } if (textures.isEmpty()) { textures.add(Assets.getTexture(DEFAULT_PREVIEW_IMAGE_URI).get()); } previewSlideshow.clean(); textures.forEach(tex -> { UIImage image = new UIImage(null, tex, true); previewSlideshow.addImage(image); }); }
/** * Gets all images for saved game. * * @param savePath a path to saves directory * @return all preview images */ public static List<BufferedImage> getAllPreviewImages(final Path savePath) { final List<BufferedImage> result = new ArrayList<>(); final StoragePathProvider storagePathProvider = new StoragePathProvider(savePath); final Path previewsDirPath = storagePathProvider.getPreviewsPath(); for (Path previewPath : getAllPathsToFilesInFolder(previewsDirPath)) { try (InputStream in = new BufferedInputStream(Files.newInputStream(previewPath))) { result.add(ImageIO.read(in)); } catch (IOException ex) { logger.warn("Can't load an image", ex); } } result.removeIf(Objects::isNull); return result; }
@Test public void getAllPreviewImagesNotEmptyFolderButEmptyFileTest() throws IOException { Files.createDirectories(TMP_PREVIEWS_FOLDER); Files.createFile(TMP_PREVIEWS_FOLDER.resolve(DEFAULT_IMAGE_NAME)); final List<BufferedImage> result = GamePreviewImageProvider.getAllPreviewImages(TMP_FOLDER); Assert.assertNotNull(result); Assert.assertTrue(result.isEmpty()); }
@Test public void getNextGamePreviewImagePathNotEmptyFolderTest() throws IOException { Files.createDirectories(TMP_PREVIEWS_FOLDER); Files.createFile(TMP_PREVIEWS_FOLDER.resolve(DEFAULT_IMAGE_NAME)); final Path imagePath = GamePreviewImageProvider.getNextGamePreviewImagePath(TMP_FOLDER); Assert.assertNotNull(imagePath); Assert.assertEquals(TMP_PREVIEWS_FOLDER.resolve("2.jpg"), imagePath); }
@Test public void getAllPreviewImagesEmptyTest() { final List<BufferedImage> result = GamePreviewImageProvider.getAllPreviewImages(TMP_FOLDER); Assert.assertNotNull(result); Assert.assertTrue(result.isEmpty()); }
@Test public void getNextGamePreviewImagePathOldestFileTest() throws IOException, InterruptedException { Files.createDirectories(TMP_PREVIEWS_FOLDER); Files.createFile(TMP_PREVIEWS_FOLDER.resolve("1.jpg")); Files.createFile(TMP_PREVIEWS_FOLDER.resolve("2.jpg")); Files.createFile(TMP_PREVIEWS_FOLDER.resolve("3.jpg")); Files.createFile(TMP_PREVIEWS_FOLDER.resolve("4.jpg")); Files.createFile(TMP_PREVIEWS_FOLDER.resolve("5.jpg")); final Path expectedOldestFile = TMP_PREVIEWS_FOLDER.resolve("3.jpg"); Files.setLastModifiedTime(expectedOldestFile, FileTime.fromMillis(0)); final Path imagePath = GamePreviewImageProvider.getNextGamePreviewImagePath(TMP_FOLDER); Assert.assertNotNull(imagePath); Assert.assertEquals(expectedOldestFile, imagePath); } }
@Test public void getNextGamePreviewImagePathEmptyFolderTest() { final Path imagePath = GamePreviewImageProvider.getNextGamePreviewImagePath(TMP_FOLDER); Assert.assertNotNull(imagePath); Assert.assertEquals(TMP_PREVIEWS_FOLDER.resolve(DEFAULT_IMAGE_NAME), imagePath); }