package AndroidDevToolbox;
import com.google.gson.annotations.SerializedName;
import com.stanfy.gsonxml.GsonXml;
import com.stanfy.gsonxml.GsonXmlBuilder;
import com.stanfy.gsonxml.XmlParserCreator;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import utils.AppConfig;
import utils.FileHelper;
import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
public class DimenValueScaleController extends BaseController implements Initializable {
private static final String LINE_BREAK = "\n";
private static final String TAB = " ";
private static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
private String[] dimenUnits = {
"dp", "dip", "sp", "pt", "px", "mm", "in"
};
public Button fileSelectBrowseBtn;
public TextField singleFileTextField;
public Button outputSelectBrowseBtn;
public TextField outputFolderTextField;
public Button dimenScaleBtn;
public TextField scaleFactorTextField;
private ResourceBundle resourceBundle;
private DimenScaleService dimenScaleService;
private String outputFolderPath;
private String inputFilePath;
private boolean inputFileSelected;
private boolean outputFolderSelected;
public static final XmlParserCreator PARSER_CREATOR = new XmlParserCreator() {
@Override
public XmlPullParser createParser() {
try {
final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
return parser;
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
};
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
this.resourceBundle = resourceBundle;
dimenScaleService = new DimenScaleService();
}
public void browseForDimenFile() {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(resourceBundle.getString("ResizeSelectImageFile"));
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("xml", "*.xml")
);
// open file dialog
File file = fileChooser.showOpenDialog(fileSelectBrowseBtn.getScene().getWindow());
if (file != null) {
singleFileTextField.setText(file.getPath());
inputFilePath = file.getPath();
inputFileSelected = true;
updateStartBtnState();
}
}
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 startDimenScale() {
dimenScaleService.restart();
}
private void updateStartBtnState() {
if (inputFileSelected && outputFolderSelected) {
dimenScaleBtn.setDisable(false);
} else {
if (dimenScaleBtn != null) {
dimenScaleBtn.setDisable(true);
}
}
}
private class DimenResources {
public List<Dimen> dimen;
}
private class Dimen {
@SerializedName("@name")
public String name;
@SerializedName("$")
public String value;
}
private class DimenScaleService extends Service<Void> {
private String getDimenUnit(String dimenValue) {
String unit = "";
for (int i=0; i<dimenUnits.length; i++) {
if (dimenValue.endsWith(dimenUnits[i])) {
unit = dimenUnits[i];
break;
}
}
return unit;
}
@Override
protected Task<Void> createTask() {
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
updateMessage(resourceBundle.getString("DimenScaling"));
double scaleFactor = 1.0;
try {
scaleFactor = Double.parseDouble(scaleFactorTextField.getText());
} catch (Exception e) {
e.printStackTrace();
updateMessage(resourceBundle.getString("DimenScaleInvalidFactor"));
return null;
}
try {
GsonXml gsonXml = new GsonXmlBuilder()
.setXmlParserCreator(PARSER_CREATOR)
.setSameNameLists(true).create();
String xml = FileHelper.readFileAsString(inputFilePath);
xml = xml.replace(XML_HEADER, "");
DimenResources model = gsonXml.fromXml(xml, DimenResources.class);
StringBuilder outXmlBuilder = new StringBuilder("<resources>")
.append(LINE_BREAK);
String scaledValue = "";
String dimenUnit = "";
double originalValue = 0;
for (Dimen dimen : model.dimen) {
scaledValue = dimen.value;
dimenUnit = getDimenUnit(dimen.value);
if (dimenUnit != null && dimenUnit.length() > 0) {
originalValue = Double.parseDouble(dimen.value.replace(dimenUnit, ""));
scaledValue = (int)(Math.round(originalValue * scaleFactor)) + dimenUnit;
}
// construct the value scaled xml
outXmlBuilder.append(TAB)
.append("<dimen name=\"")
.append(dimen.name)
.append("\">")
.append(scaledValue)
.append("</dimen>")
.append(LINE_BREAK);
}
outXmlBuilder.append("</resources>");
// create output folders
String outputFolder = outputFolderPath + File.separator +
AppConfig.FOLDER_DIMEN_SCALE_PREFIX + "_" + System.currentTimeMillis();
FileHelper.makeFolder(outputFolder);
FileHelper.saveToFile(outXmlBuilder.toString(), outputFolder
+ File.separator + "dimens.xml");
} catch (Exception e) {
e.printStackTrace();
updateMessage(resourceBundle.getString("DimenScaleInvalidFile"));
return null;
}
updateMessage(resourceBundle.getString("DimenScaleCompleted"));
return null;
}
};
getStatusBarLabel().textProperty().bind(task.messageProperty());
return task;
}
@Override
protected void succeeded() {
super.succeeded();
getStatusBarLabel().textProperty().unbind();
if (getBackgroundTaskExecutionListener() != null) {
getBackgroundTaskExecutionListener().taskComplete();
}
fileSelectBrowseBtn.setDisable(false);
outputSelectBrowseBtn.setDisable(false);
dimenScaleBtn.setDisable(false);
scaleFactorTextField.setDisable(false);
}
@Override
protected void running() {
super.running();
if (getBackgroundTaskExecutionListener() != null) {
getBackgroundTaskExecutionListener().taskStart();
}
fileSelectBrowseBtn.setDisable(true);
outputSelectBrowseBtn.setDisable(true);
dimenScaleBtn.setDisable(true);
scaleFactorTextField.setDisable(true);
}
}
}