package com.alexhulbert.icewind.gui; import static com.alexhulbert.icewind.gui.StaticStage.devices; import static com.alexhulbert.icewind.gui.Utils.fadeIn; import static com.alexhulbert.icewind.gui.Utils.fadeOut; import com.alexhulbert.jmobiledevice.Lockdown; import com.alexhulbert.jmobiledevice.diagnostics.Diagnostics; import com.alexhulbert.jmobiledevice.diagnostics.Info; import com.alexhulbert.jmobiledevice.diagnostics.Keys; import java.io.IOException; import java.util.Locale; import javafx.application.Platform; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class RefreshThread implements Runnable { public String devicePic(String model, String family, boolean isDFU) { return String.format( "https://statici.icloud.com/fmipmobile/deviceImages-2.0/%s/%s/%sline-nolocation_ipad.png", family, family + model, isDFU ? "off" : "on" ); } public String bigPic(String build) { String base = "http://theiphonewiki.com"; Document wiki; try { wiki = Jsoup.connect(base + "/wiki/" + build.toLowerCase(Locale.ENGLISH)).get(); } catch (IOException e) { return null; //Device picture not available } Element devicePicture = wiki.select(".thumbinner").first().select("a img").first(); String url = base + devicePicture.attr("src"); String newBase = url.substring(0, url.lastIndexOf('/') + 1); Document imgs; try { imgs = Jsoup.connect(newBase).get(); } catch (IOException e) { return url; } Element biggest = imgs.select("a").last(); return newBase + biggest.attr("href"); } private final ImageView ImgA; private final ImageView ImgB; private final ImageView ImgC; private final Label NameA; private final Label NameB; private final Label NameC; private final ProgressIndicator ProgA; private final ProgressIndicator ProgB; private final ProgressIndicator ProgC; public RefreshThread( ImageView ImgA, ImageView ImgB, ImageView ImgC, Label NameA, Label NameB, Label NameC, ProgressIndicator ProgA, ProgressIndicator ProgB, ProgressIndicator ProgC ) { this.ImgA = ImgA; this.ImgB = ImgB; this.ImgC = ImgC; this.NameA = NameA; this.NameB = NameB; this.NameC = NameC; this.ProgA = ProgA; this.ProgB = ProgB; this.ProgC = ProgC; } @Override public void run() { //TODO: Disable back button devices.clear(); fadeOut(ImgA, 250); fadeIn(ProgA, 250); fadeOut(ImgB, 250); fadeIn(ProgB, 250); fadeOut(ImgC, 250); fadeIn(ProgC, 250); String[] devUdids = Lockdown.listDevices(); for (int i = 0; i < Math.min(3, devUdids.length); i++) { try { Lockdown ld = new Lockdown(devUdids[i]); devices.add(ld); } catch (Exception e) { break; } } if (devices.size() > 0) { LoadA(); if (devices.size() > 1) { LoadB(); if (devices.size() > 2) { LoadC(); } else { fadeOut(ProgC, 250); ImgC.setImage(null); Platform.runLater(new Runnable() { @Override public void run() { NameC.setText(""); } }); } } else { fadeOut(ProgB, 250); ImgB.setImage(null); fadeOut(ProgC, 250); ImgC.setImage(null); Platform.runLater(new Runnable() { @Override public void run() { NameB.setText(""); NameC.setText(""); } }); } } else { fadeOut(ProgA, 250); ImgA.setImage(null); fadeOut(ProgB, 250); ImgB.setImage(null); fadeOut(ProgC, 250); ImgC.setImage(null); Platform.runLater(new Runnable() { @Override public void run() { NameA.setText(""); NameB.setText(""); NameC.setText(""); } }); } } public void LoadA() { Platform.runLater(new Runnable() { @Override public void run() { NameA.setText("Loading..."); } }); Diagnostics diagA = new Diagnostics(devices.get(0)); final Info infoA = diagA.query( Keys.ProductType.value + //iPod51 Keys.ProductVersion.value + //7.0.6 Keys.DeviceColor.value + //black Keys.DeviceClass.value + //iPod Keys.UserAssignedDeviceName.value + Keys.HWModelStr.value ); String realClass = infoA.getString(Keys.DeviceClass.value); char[] realTypeClass = infoA.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray(); String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers? String bigImg = bigPic(infoA.getString(Keys.HWModelStr.value)); StaticStage.bigImages[0] = bigImg == null ? imgUrl : bigImg; fadeOut(ProgA, 175); ImgA.setImage(new Image(imgUrl)); Platform.runLater(new Runnable() { @Override public void run() { NameA.setText(infoA.getString(Keys.UserAssignedDeviceName.value)); } }); fadeIn(ImgA, 250); } public void LoadB() { Platform.runLater(new Runnable() { @Override public void run() { NameB.setText("Loading..."); } }); Diagnostics diagB = new Diagnostics(devices.get(1)); final Info infoB = diagB.query( Keys.ProductType.value + //iPod51 Keys.ProductVersion.value + //7.0.6 Keys.DeviceColor.value + //black Keys.DeviceClass.value + //iPod Keys.UserAssignedDeviceName.value + Keys.HWModelStr.value ); String realClass = infoB.getString(Keys.DeviceClass.value); char[] realTypeClass = infoB.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray(); String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers? String bigImg = bigPic(infoB.getString(Keys.HWModelStr.value)); StaticStage.bigImages[1] = bigImg == null ? imgUrl : bigImg; fadeOut(ProgB, 175); ImgB.setImage(new Image(imgUrl)); Platform.runLater(new Runnable() { @Override public void run() { NameB.setText(infoB.getString(Keys.UserAssignedDeviceName.value)); } }); fadeIn(ImgB, 250); } public void LoadC() { Platform.runLater(new Runnable() { @Override public void run() { NameC.setText("Loading..."); } }); Diagnostics diagC = new Diagnostics(devices.get(2)); final Info infoC = diagC.query( Keys.ProductType.value + //iPod51 Keys.ProductVersion.value + //7.0.6 Keys.DeviceColor.value + //black Keys.DeviceClass.value + //iPod Keys.UserAssignedDeviceName.value + Keys.HWModelStr.value ); String realClass = infoC.getString(Keys.DeviceClass.value); char[] realTypeClass = infoC.getString(Keys.ProductType.value).substring(realClass.length()).toCharArray(); String imgUrl = devicePic(realTypeClass[0] + "," + realTypeClass[1], realClass, false); //Always 2 1-digit numbers? String bigImg = bigPic(infoC.getString(Keys.HWModelStr.value)); StaticStage.bigImages[2] = bigImg == null ? imgUrl : bigImg; fadeOut(ProgC, 175); ImgB.setImage(new Image(imgUrl)); Platform.runLater(new Runnable() { @Override public void run() { NameB.setText(infoC.getString(Keys.UserAssignedDeviceName.value)); } }); fadeIn(ImgC, 250); } }