24
24
import org .w3c .dom .Document ;
25
25
import org .w3c .dom .Element ;
26
26
import org .w3c .dom .NodeList ;
27
+ import org .w3c .dom .ProcessingInstruction ;
27
28
import org .xml .sax .SAXException ;
28
29
import processing .app .Platform ;
29
30
import processing .app .Preferences ;
30
31
import processing .app .ui .Toolkit ;
31
32
32
33
import javax .swing .*;
34
+ import javax .swing .border .Border ;
33
35
import javax .swing .border .EmptyBorder ;
34
36
import javax .xml .parsers .DocumentBuilder ;
35
37
import javax .xml .parsers .DocumentBuilderFactory ;
51
53
import java .util .ArrayList ;
52
54
import java .util .Collections ;
53
55
56
+ import static java .awt .GridBagConstraints .NORTHWEST ;
57
+ import static processing .mode .android .AndroidBuild .TARGET_SDK ;
58
+
54
59
@ SuppressWarnings ("serial" )
55
60
public class SDKDownloader extends JDialog implements PropertyChangeListener {
56
61
final static private int BOX_BORDER = Toolkit .zoom (13 );
@@ -94,12 +99,21 @@ class SDKUrlHolder {
94
99
95
100
class SDKDownloadTask extends SwingWorker <Object , Object > {
96
101
102
+ SDKUrlHolder urlHolder ;
103
+ File downloadFolder ;
97
104
private int downloadedSize = 0 ;
98
105
private int BUFFER_SIZE = 4096 ;
99
106
107
+ public SDKDownloadTask (){}
108
+
109
+ public SDKDownloadTask (SDKUrlHolder urlHolder ,File sdkFolder ){
110
+ this .urlHolder = urlHolder ;
111
+ this .downloadFolder = sdkFolder ;
112
+ }
113
+
100
114
@ Override
101
115
protected Object doInBackground () throws Exception {
102
- File sketchbookFolder = processing . app . Base . getSketchbookFolder () ;
116
+ File sketchbookFolder = downloadFolder ;
103
117
File androidFolder = new File (sketchbookFolder , "android" );
104
118
if (!androidFolder .exists ()) androidFolder .mkdir ();
105
119
@@ -126,23 +140,9 @@ protected Object doInBackground() throws Exception {
126
140
if (!tempFolder .exists ()) tempFolder .mkdir ();
127
141
128
142
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 ;
136
144
firePropertyChange (AndroidMode .getTextString ("download_property.change_event_total" ), 0 , downloadUrls .totalSize );
137
145
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
-
146
146
// tools
147
147
File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
148
148
downloadAndUnpack (downloadUrls .toolsUrl , downloadedTools , sdkFolder , true );
@@ -192,22 +192,18 @@ protected Object doInBackground() throws Exception {
192
192
193
193
// Normalize built-tools and platform folders to android-<API LEVEL>
194
194
String actualName = platformsFolder .listFiles ()[0 ].getName ();
195
- renameFolder (platformsFolder , "android-" + AndroidBuild . TARGET_SDK , actualName );
195
+ renameFolder (platformsFolder , "android-" + TARGET_SDK , actualName );
196
196
actualName = buildToolsFolder .listFiles ()[0 ].getName ();
197
197
renameFolder (buildToolsFolder , downloadUrls .buildToolsVersion , actualName );
198
198
199
199
// Done, let's set the environment and load the new SDK!
200
200
Platform .setenv ("ANDROID_SDK" , sdkFolder .getAbsolutePath ());
201
201
Preferences .set ("android.sdk.path" , sdkFolder .getAbsolutePath ());
202
202
sdk = AndroidSDK .load (false , null );
203
- } catch (ParserConfigurationException e ) {
203
+ } catch (IOException e ) {
204
204
// TODO Handle exceptions here somehow (ie show error message)
205
205
// and handle at least mkdir() results (above)
206
206
e .printStackTrace ();
207
- } catch (IOException e ) {
208
- e .printStackTrace ();
209
- } catch (SAXException e ) {
210
- e .printStackTrace ();
211
207
}
212
208
return null ;
213
209
}
@@ -603,17 +599,35 @@ public static String humanReadableByteCount(long bytes, boolean si) {
603
599
public SDKDownloader (Frame editor ) {
604
600
super (editor , AndroidMode .getTextString ("sdk_downloader.download_title" ), true );
605
601
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 );
608
624
}
609
625
610
- public void run () {
626
+ public void run (SDKUrlHolder downloadUrls , File sdkFolder ) {
611
627
cancelled = false ;
612
- downloadTask = new SDKDownloadTask ();
628
+ downloadTask = new SDKDownloadTask (downloadUrls , sdkFolder );
613
629
downloadTask .addPropertyChangeListener (this );
614
630
downloadTask .execute ();
615
- setAlwaysOnTop (true );
616
- setVisible (true );
617
631
}
618
632
619
633
public boolean cancelled () {
@@ -623,6 +637,111 @@ public boolean cancelled() {
623
637
public AndroidSDK getSDK () {
624
638
return sdk ;
625
639
}
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
+ }
626
745
627
746
private void createLayout () {
628
747
Container outer = getContentPane ();
0 commit comments