1818import java .awt .event .ActionListener ;
1919import java .beans .PropertyChangeEvent ;
2020import java .beans .PropertyChangeListener ;
21- import java .io .File ;
22- import java .io .FileOutputStream ;
23- import java .io .IOException ;
24- import java .io .InputStream ;
21+ import java .io .*;
2522import java .net .URL ;
2623import java .net .URLConnection ;
24+ import java .util .Enumeration ;
25+ import java .util .zip .ZipEntry ;
26+ import java .util .zip .ZipFile ;
2727
2828public class SDKDownloader extends JFrame implements PropertyChangeListener {
2929
@@ -35,6 +35,8 @@ public class SDKDownloader extends JFrame implements PropertyChangeListener {
3535 public static final String PROPERTY_CHANGE_EVENT_TOTAL = "total" ;
3636 private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded" ;
3737
38+ private AndroidMode androidMode ;
39+
3840 JProgressBar progressBar ;
3941 JLabel downloadedTextArea ;
4042
@@ -56,41 +58,45 @@ protected Object doInBackground() throws Exception {
5658 String hostOs = getOsString ();
5759 File modeFolder = new File (Base .getSketchbookModesFolder () + "/AndroidMode" );
5860
59- // creating sdk root folder
61+ // creating sdk folders
6062 File sdkFolder = new File (modeFolder , "sdk" );
6163 if (!sdkFolder .exists ()) sdkFolder .mkdir ();
64+ File platformsFolder = new File (sdkFolder , "platforms" );
65+ if (!platformsFolder .exists ()) platformsFolder .mkdir ();
66+ File buildToolsFolder = new File (sdkFolder , "build-tools" );
67+ if (!buildToolsFolder .exists ()) buildToolsFolder .mkdir ();
6268
6369 // creating temp folder for downloaded zip packages
6470 File tempFolder = new File (modeFolder , "temp" );
6571 if (!tempFolder .exists ()) tempFolder .mkdir ();
6672
67- // creating sdk folders
68- File toolsFolder = new File (sdkFolder , "tools" ); toolsFolder .mkdir ();
69- File platformToolsFolder = new File (sdkFolder , "platform-tools" ); platformToolsFolder .mkdir ();
70- File buildToolsFolder = new File (sdkFolder , "build-tools" ); buildToolsFolder .mkdir ();
71- File platformsFoolder = new File (sdkFolder , "platforms" ); platformsFoolder .mkdir ();
72- File platformFolder = new File (platformsFoolder , "android-10" ); platformFolder .mkdir ();
73-
7473 try {
7574 SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , hostOs );
7675 firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
7776 totalSize = downloadUrls .totalSize ;
7877
7978 // tools
8079 File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
81- downloadFile (downloadUrls .toolsUrl , downloadedTools );
80+ downloadAndUnpack (downloadUrls .toolsUrl , downloadedTools , sdkFolder );
8281
8382 // platform-tools
8483 File downloadedPlatformTools = new File (tempFolder , downloadUrls .platformToolsFilename );
85- downloadFile (downloadUrls .platformToolsUrl , downloadedPlatformTools );
84+ downloadAndUnpack (downloadUrls .platformToolsUrl , downloadedPlatformTools , sdkFolder );
8685
8786 // build-tools
8887 File downloadedBuildTools = new File (tempFolder , downloadUrls .buildToolsFilename );
89- downloadFile (downloadUrls .buildToolsUrl , downloadedBuildTools );
88+ downloadAndUnpack (downloadUrls .buildToolsUrl , downloadedBuildTools , buildToolsFolder );
9089
9190 // platform
9291 File downloadedPlatform = new File (tempFolder , downloadUrls .platformFilename );
93- downloadFile (downloadUrls .platformUrl , downloadedPlatform );
92+ downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder );
93+
94+ if (Base .isLinux () || Base .isMacOS ()) {
95+ Runtime .getRuntime ().exec ("chmod -R 755 " + sdkFolder .getAbsolutePath ());
96+ }
97+
98+ Base .getPlatform ().setenv ("ANDROID_SDK" , sdkFolder .getAbsolutePath ());
99+ androidMode .loadSDK ();
94100 } catch (ParserConfigurationException e ) {
95101 // TODO Handle exceptions here somehow (ie show error message) and handle at least mkdir() results (above)
96102 e .printStackTrace ();
@@ -105,9 +111,10 @@ protected Object doInBackground() throws Exception {
105111 @ Override
106112 protected void done () {
107113 super .done ();
114+ setVisible (false );
108115 }
109116
110- private void downloadFile (String urlString , File saveTo ) throws IOException {
117+ private void downloadAndUnpack (String urlString , File saveTo , File unpackTo ) throws IOException {
111118 URL url = new URL (urlString );
112119 URLConnection conn = url .openConnection ();
113120
@@ -126,6 +133,8 @@ private void downloadFile(String urlString, File saveTo) throws IOException {
126133
127134 inputStream .close ();
128135 outputStream .close ();
136+
137+ extractFolder (saveTo , unpackTo );
129138 }
130139
131140 private String getOsString () {
@@ -229,9 +238,11 @@ public static String humanReadableByteCount(long bytes, boolean si) {
229238 return String .format ("%.1f %sB" , bytes / Math .pow (unit , exp ), pre );
230239 }
231240
232- public SDKDownloader () {
241+ public SDKDownloader (AndroidMode androidMode ) {
233242 super ("Android SDK downloading..." );
234243
244+ this .androidMode = androidMode ;
245+
235246 createLayout ();
236247 }
237248
@@ -320,4 +331,46 @@ public void actionPerformed(ActionEvent actionEvent) {
320331 setVisible (true );
321332 setAlwaysOnTop (true );
322333 }
334+
335+ static public void extractFolder (File file , File newPath ) throws IOException {
336+ int BUFFER = 2048 ;
337+ ZipFile zip = new ZipFile (file );
338+ Enumeration zipFileEntries = zip .entries ();
339+
340+ // Process each entry
341+ while (zipFileEntries .hasMoreElements ())
342+ {
343+ // grab a zip file entry
344+ ZipEntry entry = (ZipEntry ) zipFileEntries .nextElement ();
345+ String currentEntry = entry .getName ();
346+ File destFile = new File (newPath , currentEntry );
347+ //destFile = new File(newPath, destFile.getName());
348+ File destinationParent = destFile .getParentFile ();
349+
350+ // create the parent directory structure if needed
351+ destinationParent .mkdirs ();
352+
353+ if (!entry .isDirectory ())
354+ {
355+ BufferedInputStream is = new BufferedInputStream (zip
356+ .getInputStream (entry ));
357+ int currentByte ;
358+ // establish buffer for writing file
359+ byte data [] = new byte [BUFFER ];
360+
361+ // write the current file to disk
362+ FileOutputStream fos = new FileOutputStream (destFile );
363+ BufferedOutputStream dest = new BufferedOutputStream (fos ,
364+ BUFFER );
365+
366+ // read and write until last byte is encountered
367+ while ((currentByte = is .read (data , 0 , BUFFER )) != -1 ) {
368+ dest .write (data , 0 , currentByte );
369+ }
370+ dest .flush ();
371+ dest .close ();
372+ is .close ();
373+ }
374+ }
375+ }
323376}
0 commit comments