package AndroidDevToolbox;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import org.apache.commons.io.FilenameUtils;
import org.imgscalr.Scalr;
import utils.AppConfig;
import utils.FileHelper;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
public class AppIconResizeController extends BaseController implements Initializable {
private static final String APP_FILE_NAME = "ic_launcher";
public Button fileSelectBrowseBtn;
public TextField singleFileTextField;
public GridPane imageFileInfoPane;
public GridPane selectImageNoticePane;
public ImageView fileInfoImageView;
public Label imageWidthLabel;
public Label imageHeightLabel;
public Label fileSizeLabel;
public Button outputSelectBrowseBtn;
public TextField outputFolderTextField;
public Button imageResizeBtn;
private ResourceBundle resourceBundle;
private ImageResizeService imageResizeService;
private String outputFolderPath;
private String imageFilePath;
private boolean imageFileSelected;
private boolean outputFolderSelected;
private interface AppIconSize {
int M_DPI = 48;
int H_DPI = 72;
int XH_DPI = 96;
int XXH_DPI = 144;
int XXXH_DPI = 192;
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
// fileInfoImageView.fitWidthProperty().bind(imageFileInfoPane.widthProperty());
// fileInfoImageView.fitHeightProperty().bind(imageFileInfoPane.heightProperty());
updateFileInfoContent(null);
imageResizeService = new ImageResizeService();
}
public void browseForImageFile() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(resourceBundle.getString("ResizeSelectImageFile"));
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("All Images", "*.*"),
new FileChooser.ExtensionFilter("JPG", "*.jpg"),
new FileChooser.ExtensionFilter("PNG", "*.png")
);
// open file dialog
File file = fileChooser.showOpenDialog(fileSelectBrowseBtn.getScene().getWindow());
if (file != null) {
singleFileTextField.setText(file.getPath());
imageFilePath = file.getPath();
imageFileSelected = true;
updateStartBtnState();
updateFileInfoContent(file);
}
}
public void browseForOutputFolder() {
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setTitle(resourceBundle.getString("ResizeSelectOutputFolder"));
File outputFolder = directoryChooser.showDialog(outputSelectBrowseBtn.getScene().getWindow());
if (outputFolder != null) {
outputFolderTextField.setText(outputFolder.getPath());
outputFolderSelected = true;
outputFolderPath = outputFolder.getPath();
updateStartBtnState();
}
}
public void startResizeImage() {
imageResizeService.restart();
}
private boolean isImageFileExtension(String fileName) {
return FilenameUtils.getExtension(fileName).equalsIgnoreCase("JPG")
|| FilenameUtils.getExtension(fileName).equalsIgnoreCase("PNG");
}
private void updateFileInfoContent(File file) {
if (file == null) {
if (imageFileInfoPane != null && selectImageNoticePane != null) {
imageFileInfoPane.setVisible(false);
selectImageNoticePane.setVisible(true);
}
return;
}
imageFileInfoPane.setVisible(true);
selectImageNoticePane.setVisible(false);
Image image = new Image("file:" + file.getPath());
fileInfoImageView.setImage(image);
imageWidthLabel.setText(
resourceBundle.getString("ResizeFileWidth") + " " + (int)image.getWidth() + "px");
imageHeightLabel.setText(
resourceBundle.getString("ResizeFileHeight") + " " + (int)image.getHeight() + "px");
fileSizeLabel.setText(
resourceBundle.getString("ResizeFileSize") + " " +
FileHelper.readableFileSize(file.length()));
}
private void updateStartBtnState() {
if (imageFileSelected && outputFolderSelected) {
imageResizeBtn.setDisable(false);
} else {
if (imageResizeBtn != null) {
imageResizeBtn.setDisable(true);
}
}
}
private class ImageResizeService extends Service<Void> {
@Override
protected Task<Void> createTask() {
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
updateMessage(resourceBundle.getString("ResizeStarted"));
// create folders
String rootFolder = outputFolderPath + File.separator +
AppConfig.FOLDER_APP_ICON_RESIZE_PREFIX + "_" + System.currentTimeMillis();
FileHelper.makeFolder(rootFolder);
String mdpiPath = rootFolder + File.separator + AppConfig.FOLDER_DRAWABLE_MDPI;
String hdpiPath = rootFolder + File.separator + AppConfig.FOLDER_DRAWABLE_HDPI;
String xhdpiPath = rootFolder + File.separator + AppConfig.FOLDER_DRAWABLE_XHDPI;
String xxhdpiPath = rootFolder + File.separator + AppConfig.FOLDER_DRAWABLE_XXHDPI;
String xxxhdpiPath = rootFolder + File.separator + AppConfig.FOLDER_DRAWABLE_XXXHDPI;
FileHelper.makeFolder(mdpiPath);
FileHelper.makeFolder(hdpiPath);
FileHelper.makeFolder(xhdpiPath);
FileHelper.makeFolder(xxhdpiPath);
FileHelper.makeFolder(xxxhdpiPath);
String fileExt = FilenameUtils.getExtension(new File(imageFilePath).getName());
// resize app icon
BufferedImage bufferedImage = null;
try {
bufferedImage = ImageIO.read(new File(imageFilePath));
int sourceWidth = bufferedImage.getWidth();
int sourceHeight = bufferedImage.getHeight();
if (sourceHeight != sourceWidth) {
int padding = Math.abs(sourceHeight - sourceWidth);
int halfPadding = (int) (padding / 2.0f);
bufferedImage = Scalr.pad(bufferedImage, padding, new Color(0, 0, 0, 0), null);
int newWidth = bufferedImage.getWidth();
int newHeight = bufferedImage.getHeight();
boolean isWidthLarger = sourceWidth > sourceHeight;
int maxSize = isWidthLarger ? sourceWidth : sourceHeight;
int cropStartX = (int) (isWidthLarger?
(newWidth-sourceWidth)/2.0f:halfPadding);
int cropStartY = (int) (isWidthLarger?
halfPadding:(newHeight-sourceHeight)/2.0f);
bufferedImage = Scalr.crop(
bufferedImage, cropStartX, cropStartY, maxSize, maxSize, null);
}
BufferedImage resizedImage = Scalr.resize(bufferedImage
, Scalr.Method.QUALITY
, AppIconSize.M_DPI
, AppIconSize.M_DPI);
ImageIO.write(resizedImage, fileExt
, new File(mdpiPath + File.separator + APP_FILE_NAME + "." + fileExt));
resizedImage = Scalr.resize(bufferedImage
, Scalr.Method.QUALITY
, AppIconSize.H_DPI
, AppIconSize.H_DPI);
ImageIO.write(resizedImage, fileExt
, new File(hdpiPath + File.separator + APP_FILE_NAME + "." + fileExt));
resizedImage = Scalr.resize(bufferedImage
, Scalr.Method.QUALITY
, AppIconSize.XH_DPI
, AppIconSize.XH_DPI);
ImageIO.write(resizedImage, fileExt
, new File(xhdpiPath + File.separator + APP_FILE_NAME + "." + fileExt));
resizedImage = Scalr.resize(bufferedImage
, Scalr.Method.QUALITY
, AppIconSize.XXH_DPI
, AppIconSize.XXH_DPI);
ImageIO.write(resizedImage, fileExt
, new File(xxhdpiPath + File.separator + APP_FILE_NAME + "." + fileExt));
resizedImage = Scalr.resize(bufferedImage
, Scalr.Method.QUALITY
, AppIconSize.XXXH_DPI
, AppIconSize.XXXH_DPI);
ImageIO.write(resizedImage, fileExt
, new File(xxxhdpiPath + File.separator + APP_FILE_NAME + "." + fileExt));
} catch (Exception e) {
e.printStackTrace();
}
updateMessage(resourceBundle.getString("ResizeCompleted"));
return null;
}
};
getStatusBarLabel().textProperty().bind(task.messageProperty());
return task;
}
@Override
protected void succeeded() {
super.succeeded();
getStatusBarLabel().textProperty().unbind();
if (getBackgroundTaskExecutionListener() != null) {
getBackgroundTaskExecutionListener().taskComplete();
}
imageResizeBtn.setDisable(false);
fileSelectBrowseBtn.setDisable(false);
outputSelectBrowseBtn.setDisable(false);
}
@Override
protected void running() {
super.running();
if (getBackgroundTaskExecutionListener() != null) {
getBackgroundTaskExecutionListener().taskStart();
}
imageResizeBtn.setDisable(true);
fileSelectBrowseBtn.setDisable(true);
outputSelectBrowseBtn.setDisable(true);
}
}
}