Skip to content

Commit 29a62b6

Browse files
[FEAT] Pre-Downloader window, Path Selection
1 parent 3335e56 commit 29a62b6

File tree

2 files changed

+148
-29
lines changed

2 files changed

+148
-29
lines changed

mode/src/processing/mode/android/AndroidSDK.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ static public boolean locateSysImage(final Frame window,
448448
static public AndroidSDK download(final Frame editor, final AndroidMode androidMode)
449449
throws BadSDKException, CancelException {
450450
final SDKDownloader downloader = new SDKDownloader(editor);
451-
downloader.run(); // This call blocks until the SDK download complete, or user cancels.
451+
//downloader.run(); // This call blocks until the SDK download complete, or user cancels.
452452

453453
if (downloader.cancelled()) {
454454
throw new CancelException(AndroidMode.getTextString("android_sdk.error.sdk_download_canceled"));

mode/src/processing/mode/android/SDKDownloader.java

Lines changed: 147 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
import org.w3c.dom.Document;
2525
import org.w3c.dom.Element;
2626
import org.w3c.dom.NodeList;
27+
import org.w3c.dom.ProcessingInstruction;
2728
import org.xml.sax.SAXException;
2829
import processing.app.Platform;
2930
import processing.app.Preferences;
3031
import processing.app.ui.Toolkit;
3132

3233
import javax.swing.*;
34+
import javax.swing.border.Border;
3335
import javax.swing.border.EmptyBorder;
3436
import javax.xml.parsers.DocumentBuilder;
3537
import javax.xml.parsers.DocumentBuilderFactory;
@@ -51,6 +53,9 @@
5153
import java.util.ArrayList;
5254
import java.util.Collections;
5355

56+
import static java.awt.GridBagConstraints.NORTHWEST;
57+
import static processing.mode.android.AndroidBuild.TARGET_SDK;
58+
5459
@SuppressWarnings("serial")
5560
public class SDKDownloader extends JDialog implements PropertyChangeListener {
5661
final static private int BOX_BORDER = Toolkit.zoom(13);
@@ -94,12 +99,21 @@ class SDKUrlHolder {
9499

95100
class SDKDownloadTask extends SwingWorker<Object, Object> {
96101

102+
SDKUrlHolder urlHolder;
103+
File downloadFolder;
97104
private int downloadedSize = 0;
98105
private int BUFFER_SIZE = 4096;
99106

107+
public SDKDownloadTask(){}
108+
109+
public SDKDownloadTask(SDKUrlHolder urlHolder,File sdkFolder){
110+
this.urlHolder = urlHolder;
111+
this.downloadFolder = sdkFolder;
112+
}
113+
100114
@Override
101115
protected Object doInBackground() throws Exception {
102-
File sketchbookFolder = processing.app.Base.getSketchbookFolder();
116+
File sketchbookFolder = downloadFolder;
103117
File androidFolder = new File(sketchbookFolder, "android");
104118
if (!androidFolder.exists()) androidFolder.mkdir();
105119

@@ -126,23 +140,9 @@ protected Object doInBackground() throws Exception {
126140
if (!tempFolder.exists()) tempFolder.mkdir();
127141

128142
try {
129-
SDKUrlHolder downloadUrls = new SDKUrlHolder();
130-
String repositoryUrl = REPOSITORY_URL + REPOSITORY_LIST;
131-
String addonUrl = REPOSITORY_URL + ADDON_LIST;
132-
String haxmUrl = HAXM_URL + ADDON_LIST;
133-
getMainDownloadUrls(downloadUrls, repositoryUrl, Platform.getName());
134-
getExtrasDownloadUrls(downloadUrls, addonUrl, Platform.getName());
135-
getHaxmDownloadUrl(downloadUrls, haxmUrl, Platform.getName());
143+
SDKUrlHolder downloadUrls = this.urlHolder;
136144
firePropertyChange(AndroidMode.getTextString("download_property.change_event_total"), 0, downloadUrls.totalSize);
137145

138-
//TODO convert log messages to proper window before download task begins
139-
System.out.println("Platform Downloaded:" + downloadUrls.platformVersion);
140-
System.out.println("BuildTools Version: " + downloadUrls.buildToolsVersion);
141-
System.out.println("Tools Version: " + downloadUrls.toolsVersion);
142-
System.out.println("Platform Tools Version: " + downloadUrls.platformToolsVersion);
143-
System.out.println("Emulator Version : " + downloadUrls.emulatorVersion);
144-
System.out.println("HAXM Version : " + downloadUrls.haxmVersion);
145-
146146
// tools
147147
File downloadedTools = new File(tempFolder, downloadUrls.toolsFilename);
148148
downloadAndUnpack(downloadUrls.toolsUrl, downloadedTools, sdkFolder, true);
@@ -192,22 +192,18 @@ protected Object doInBackground() throws Exception {
192192

193193
// Normalize built-tools and platform folders to android-<API LEVEL>
194194
String actualName = platformsFolder.listFiles()[0].getName();
195-
renameFolder(platformsFolder, "android-" + AndroidBuild.TARGET_SDK, actualName);
195+
renameFolder(platformsFolder, "android-" + TARGET_SDK, actualName);
196196
actualName = buildToolsFolder.listFiles()[0].getName();
197197
renameFolder(buildToolsFolder, downloadUrls.buildToolsVersion, actualName);
198198

199199
// Done, let's set the environment and load the new SDK!
200200
Platform.setenv("ANDROID_SDK", sdkFolder.getAbsolutePath());
201201
Preferences.set("android.sdk.path", sdkFolder.getAbsolutePath());
202202
sdk = AndroidSDK.load(false, null);
203-
} catch (ParserConfigurationException e) {
203+
} catch (IOException e) {
204204
// TODO Handle exceptions here somehow (ie show error message)
205205
// and handle at least mkdir() results (above)
206206
e.printStackTrace();
207-
} catch (IOException e) {
208-
e.printStackTrace();
209-
} catch (SAXException e) {
210-
e.printStackTrace();
211207
}
212208
return null;
213209
}
@@ -603,17 +599,35 @@ public static String humanReadableByteCount(long bytes, boolean si) {
603599
public SDKDownloader(Frame editor) {
604600
super(editor, AndroidMode.getTextString("sdk_downloader.download_title"), true);
605601
this.editor = editor;
606-
this.sdk = null;
607-
createLayout();
602+
this.sdk = null;
603+
downloadTask = new SDKDownloadTask();
604+
SDKUrlHolder downloadUrls = new SDKUrlHolder();
605+
String repositoryUrl = REPOSITORY_URL + REPOSITORY_LIST;
606+
String addonUrl = REPOSITORY_URL + ADDON_LIST;
607+
String haxmUrl = HAXM_URL + ADDON_LIST;
608+
try {
609+
downloadTask.getMainDownloadUrls(downloadUrls, repositoryUrl, Platform.getName());
610+
getExtrasDownloadUrls(downloadUrls, addonUrl, Platform.getName());
611+
getHaxmDownloadUrl(downloadUrls, haxmUrl, Platform.getName());
612+
} catch (IOException e) {
613+
e.printStackTrace();
614+
} catch (XPathException e) {
615+
e.printStackTrace();
616+
} catch (ParserConfigurationException e) {
617+
e.printStackTrace();
618+
} catch (SAXException e) {
619+
e.printStackTrace();
620+
}
621+
createInitLayout(downloadUrls);
622+
setAlwaysOnTop(true);
623+
setVisible(true);
608624
}
609625

610-
public void run() {
626+
public void run(SDKUrlHolder downloadUrls, File sdkFolder) {
611627
cancelled = false;
612-
downloadTask = new SDKDownloadTask();
628+
downloadTask = new SDKDownloadTask(downloadUrls,sdkFolder);
613629
downloadTask.addPropertyChangeListener(this);
614630
downloadTask.execute();
615-
setAlwaysOnTop(true);
616-
setVisible(true);
617631
}
618632

619633
public boolean cancelled() {
@@ -623,6 +637,111 @@ public boolean cancelled() {
623637
public AndroidSDK getSDK() {
624638
return sdk;
625639
}
640+
641+
private void addPackage(GridBagConstraints gc, int gridy, JPanel packagesPanel,
642+
String packageName, String packageVersion){
643+
gc.gridx = 0; gc.gridy = gridy;
644+
gc.weightx = 0.5;
645+
JLabel packageLabel = new JLabel(packageName);
646+
packagesPanel.add(packageLabel,gc);
647+
JLabel versionLabel = new JLabel(packageVersion);
648+
gc.gridx = 1; gc.gridy = gridy;
649+
gc.weightx = 1;
650+
packagesPanel.add(versionLabel,gc);
651+
}
652+
653+
private void createInitLayout(SDKUrlHolder downloadUrls) {
654+
Container outer = getContentPane();
655+
outer.removeAll();
656+
final SDKUrlHolder urlHolder = downloadUrls;
657+
658+
outer.setLayout(new BorderLayout());
659+
660+
JPanel mainPanel = new JPanel();
661+
mainPanel.setPreferredSize(Toolkit.zoom(250,225));
662+
outer.add(mainPanel,BorderLayout.EAST);
663+
664+
//List Packages to be downloaded here:
665+
JPanel packagesPanel = new JPanel();
666+
packagesPanel.setPreferredSize(Toolkit.zoom(250,125));
667+
packagesPanel.setAlignmentX(RIGHT_ALIGNMENT);
668+
Border border = BorderFactory.createLineBorder(Color.black,1,true);
669+
packagesPanel.setBorder(BorderFactory.createTitledBorder(border,"Packages to download: "));
670+
packagesPanel.setLayout(new GridBagLayout());
671+
672+
mainPanel.add(packagesPanel);
673+
674+
GridBagConstraints gc = new GridBagConstraints();
675+
gc.anchor = NORTHWEST;
676+
gc.weighty = 0.5;
677+
678+
addPackage(gc,0,packagesPanel,"SDK Platform: ",downloadUrls.platformVersion);
679+
addPackage(gc,1,packagesPanel,"SDK PlatformTools: ",downloadUrls.platformToolsVersion);
680+
addPackage(gc,2,packagesPanel,"Android Build Tools: ",downloadUrls.buildToolsVersion);
681+
addPackage(gc,3,packagesPanel,"Android Tools: ",downloadUrls.toolsVersion);
682+
addPackage(gc,4,packagesPanel,"Android Emulator: ",downloadUrls.emulatorVersion);
683+
if(Platform.getName()!="linux") addPackage(gc,5,packagesPanel,"Android Build Tools: ",downloadUrls.haxmVersion);
684+
685+
//SDK_Path selection Panel
686+
JPanel downloadPathPanel = new JPanel();
687+
downloadPathPanel.setLayout(new BorderLayout());
688+
JLabel pathLabel = new JLabel("Installation Path: ");
689+
downloadPathPanel.add(pathLabel,BorderLayout.NORTH);
690+
final JLabel locationLabel = new JLabel(processing.app.Base.getSketchbookFolder().getAbsolutePath());
691+
downloadPathPanel.add(locationLabel,BorderLayout.WEST);
692+
JButton selectPathButton = new JButton("Change");
693+
Dimension dim = new Dimension(Toolkit.getButtonWidth(),
694+
Toolkit.zoom(selectPathButton.getPreferredSize().height));
695+
selectPathButton.addActionListener(new ActionListener() {
696+
@Override
697+
public void actionPerformed(ActionEvent e) {
698+
JFileChooser fc = new JFileChooser();
699+
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
700+
fc.showOpenDialog(SDKDownloader.super.rootPane); //To put it on top of the modalDialog
701+
if(fc.getSelectedFile()!=null) locationLabel.setText(fc.getSelectedFile().getAbsolutePath());
702+
}
703+
});
704+
downloadPathPanel.add(selectPathButton,BorderLayout.EAST);
705+
mainPanel.add(downloadPathPanel);
706+
707+
//Buttons Panel on the bottom
708+
JPanel buttons = new JPanel();
709+
buttons.setAlignmentX(LEFT_ALIGNMENT);
710+
JButton continueButton = new JButton("Continue");
711+
continueButton.setPreferredSize(dim);
712+
continueButton.addActionListener(new ActionListener() {
713+
@Override
714+
public void actionPerformed(ActionEvent e) {
715+
File sdkFolder = new File(locationLabel.getText());
716+
run(urlHolder,sdkFolder);
717+
createLayout();
718+
}
719+
});
720+
buttons.add(continueButton);
721+
722+
JButton cancelButton = new JButton("Cancel");
723+
cancelButton.setPreferredSize(dim);
724+
buttons.add(cancelButton);
725+
cancelButton.addActionListener(new ActionListener() {
726+
@Override
727+
public void actionPerformed(ActionEvent e) {
728+
dispose();
729+
}
730+
});
731+
mainPanel.add(buttons);
732+
733+
//The side panel with image Icon
734+
JPanel sidePanel = new JPanel(new BorderLayout());
735+
sidePanel.setPreferredSize(Toolkit.zoom(100,0));
736+
sidePanel.setBackground(Color.white);
737+
outer.add(sidePanel,BorderLayout.WEST);
738+
sidePanel.setAlignmentY(CENTER_ALIGNMENT);
739+
JLabel logo = new JLabel(Toolkit.getLibIcon("/icons/pde-64.png"));
740+
sidePanel.add(logo,BorderLayout.CENTER);
741+
742+
pack();
743+
setLocationRelativeTo(editor);
744+
}
626745

627746
private void createLayout() {
628747
Container outer = getContentPane();

0 commit comments

Comments
 (0)