Skip to content

Commit 0c85eef

Browse files
committed
Archive extraction, correct paths and permissions
1 parent 3e0d461 commit 0c85eef

File tree

3 files changed

+87
-24
lines changed

3 files changed

+87
-24
lines changed

src/processing/mode/android/AndroidMode.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,23 @@ protected File getCoreZipLocation() {
116116
// return sdk;
117117
// }
118118

119+
public void loadSDK() {
120+
try {
121+
sdk = AndroidSDK.load();
122+
} catch (BadSDKException e) {
123+
e.printStackTrace();
124+
} catch (IOException e) {
125+
e.printStackTrace();
126+
}
127+
}
119128

120129
public void checkSDK(Editor parent) {
121130
if (sdk == null) {
122131
try {
123132
sdk = AndroidSDK.load();
124133
// FIXME REVERT THIS STATEMENT AFTER TESTING (should be ==)
125-
if (sdk != null) {
126-
sdk = AndroidSDK.locate(parent);
134+
if (sdk == null) {
135+
sdk = AndroidSDK.locate(parent, this);
127136
}
128137
} catch (BadSDKException e) {
129138
e.printStackTrace();

src/processing/mode/android/AndroidSDK.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package processing.mode.android;
22

33
import processing.app.Base;
4+
import processing.app.Editor;
45
import processing.app.Platform;
56
import processing.app.Preferences;
67
import processing.app.exec.ProcessHelper;
@@ -233,7 +234,7 @@ public static AndroidSDK load() throws BadSDKException, IOException {
233234
}
234235

235236

236-
static public AndroidSDK locate(final Frame window)
237+
static public AndroidSDK locate(final Frame window, final AndroidMode androidMode)
237238
throws BadSDKException, IOException {
238239
final int result = showLocateDialog(window);
239240
if (result == JOptionPane.CANCEL_OPTION) {
@@ -244,7 +245,7 @@ static public AndroidSDK locate(final Frame window)
244245
//Base.openURL(ANDROID_SDK_URL);
245246
//throw new BadSDKException("No SDK installed.");
246247

247-
return download();
248+
return download(androidMode);
248249
}
249250
while (true) {
250251
// TODO this is really a yucky way to do this stuff. fix it.
@@ -263,13 +264,13 @@ static public AndroidSDK locate(final Frame window)
263264
}
264265
}
265266

266-
static public AndroidSDK download() throws BadSDKException {
267+
static public AndroidSDK download(final AndroidMode androidMode) throws BadSDKException {
267268
AndroidMode.sdkDownloadInProgress = true;
268269

269270
SwingUtilities.invokeLater(new Runnable() {
270271
@Override
271272
public void run() {
272-
SDKDownloader downloader = new SDKDownloader();
273+
SDKDownloader downloader = new SDKDownloader(androidMode);
273274
downloader.startDownload();
274275
}
275276
});

src/processing/mode/android/SDKDownloader.java

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
import java.awt.event.ActionListener;
1919
import java.beans.PropertyChangeEvent;
2020
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.*;
2522
import java.net.URL;
2623
import java.net.URLConnection;
24+
import java.util.Enumeration;
25+
import java.util.zip.ZipEntry;
26+
import java.util.zip.ZipFile;
2727

2828
public 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

Comments
 (0)