18
18
import java .awt .event .ActionListener ;
19
19
import java .beans .PropertyChangeEvent ;
20
20
import 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 .*;
25
22
import java .net .URL ;
26
23
import java .net .URLConnection ;
24
+ import java .util .Enumeration ;
25
+ import java .util .zip .ZipEntry ;
26
+ import java .util .zip .ZipFile ;
27
27
28
28
public class SDKDownloader extends JFrame implements PropertyChangeListener {
29
29
@@ -35,6 +35,8 @@ public class SDKDownloader extends JFrame implements PropertyChangeListener {
35
35
public static final String PROPERTY_CHANGE_EVENT_TOTAL = "total" ;
36
36
private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded" ;
37
37
38
+ private AndroidMode androidMode ;
39
+
38
40
JProgressBar progressBar ;
39
41
JLabel downloadedTextArea ;
40
42
@@ -56,41 +58,45 @@ protected Object doInBackground() throws Exception {
56
58
String hostOs = getOsString ();
57
59
File modeFolder = new File (Base .getSketchbookModesFolder () + "/AndroidMode" );
58
60
59
- // creating sdk root folder
61
+ // creating sdk folders
60
62
File sdkFolder = new File (modeFolder , "sdk" );
61
63
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 ();
62
68
63
69
// creating temp folder for downloaded zip packages
64
70
File tempFolder = new File (modeFolder , "temp" );
65
71
if (!tempFolder .exists ()) tempFolder .mkdir ();
66
72
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
-
74
73
try {
75
74
SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , hostOs );
76
75
firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
77
76
totalSize = downloadUrls .totalSize ;
78
77
79
78
// tools
80
79
File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
81
- downloadFile (downloadUrls .toolsUrl , downloadedTools );
80
+ downloadAndUnpack (downloadUrls .toolsUrl , downloadedTools , sdkFolder );
82
81
83
82
// platform-tools
84
83
File downloadedPlatformTools = new File (tempFolder , downloadUrls .platformToolsFilename );
85
- downloadFile (downloadUrls .platformToolsUrl , downloadedPlatformTools );
84
+ downloadAndUnpack (downloadUrls .platformToolsUrl , downloadedPlatformTools , sdkFolder );
86
85
87
86
// build-tools
88
87
File downloadedBuildTools = new File (tempFolder , downloadUrls .buildToolsFilename );
89
- downloadFile (downloadUrls .buildToolsUrl , downloadedBuildTools );
88
+ downloadAndUnpack (downloadUrls .buildToolsUrl , downloadedBuildTools , buildToolsFolder );
90
89
91
90
// platform
92
91
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 ();
94
100
} catch (ParserConfigurationException e ) {
95
101
// TODO Handle exceptions here somehow (ie show error message) and handle at least mkdir() results (above)
96
102
e .printStackTrace ();
@@ -105,9 +111,10 @@ protected Object doInBackground() throws Exception {
105
111
@ Override
106
112
protected void done () {
107
113
super .done ();
114
+ setVisible (false );
108
115
}
109
116
110
- private void downloadFile (String urlString , File saveTo ) throws IOException {
117
+ private void downloadAndUnpack (String urlString , File saveTo , File unpackTo ) throws IOException {
111
118
URL url = new URL (urlString );
112
119
URLConnection conn = url .openConnection ();
113
120
@@ -126,6 +133,8 @@ private void downloadFile(String urlString, File saveTo) throws IOException {
126
133
127
134
inputStream .close ();
128
135
outputStream .close ();
136
+
137
+ extractFolder (saveTo , unpackTo );
129
138
}
130
139
131
140
private String getOsString () {
@@ -229,9 +238,11 @@ public static String humanReadableByteCount(long bytes, boolean si) {
229
238
return String .format ("%.1f %sB" , bytes / Math .pow (unit , exp ), pre );
230
239
}
231
240
232
- public SDKDownloader () {
241
+ public SDKDownloader (AndroidMode androidMode ) {
233
242
super ("Android SDK downloading..." );
234
243
244
+ this .androidMode = androidMode ;
245
+
235
246
createLayout ();
236
247
}
237
248
@@ -320,4 +331,46 @@ public void actionPerformed(ActionEvent actionEvent) {
320
331
setVisible (true );
321
332
setAlwaysOnTop (true );
322
333
}
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
+ }
323
376
}
0 commit comments