50
50
51
51
@ SuppressWarnings ("serial" )
52
52
public class SDKDownloader extends JDialog implements PropertyChangeListener {
53
- private static final String URL_REPOSITORY = "https://dl-ssl.google.com/android/repository/repository-11.xml" ;
54
- private static final String URL_REPOSITORY_FOLDER = "http://dl-ssl.google.com/android/repository/" ;
55
- private static final String URL_USB_DRIVER = "https://dl-ssl.google.com//android/repository/latest_usb_driver_windows.zip" ;
53
+ private static final String REPOSITORY_URL = "http://dl-ssl.google.com/android/repository/" ;
54
+ private static final String REPOSITORY_LIST = "repository-11.xml" ;
55
+ private static final String ADDON_LIST = "addon.xml" ;
56
+
57
+ // The Android Support Repository does not include the android-support-v4 jar
58
+ // file, so downloading the latest support library package available.
59
+ // More info on the Support Library and latest releases:
60
+ // https://developer.android.com/topic/libraries/support-library/index.html
61
+ private static final String LEGACY_SUPPORT_LIBRARY = "support_r23.2.1.zip" ;
62
+ private static final int SUPPORT_LIBRARY_SIZE = 10850402 ;
56
63
57
64
private static final String PROPERTY_CHANGE_EVENT_TOTAL = "total" ;
58
65
private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded" ;
@@ -73,9 +80,11 @@ class SDKUrlHolder {
73
80
public String platformVersion , buildToolsVersion ;
74
81
public String platformToolsUrl , buildToolsUrl , platformUrl , toolsUrl ;
75
82
public String platformToolsFilename , buildToolsFilename , platformFilename , toolsFilename ;
83
+ public String supportRepoUrl , googleRepoUrl , usbDriverUrl ;
84
+ public String supportRepoFilename , googleRepoFilename , usbDriverFilename ;
76
85
public int totalSize = 0 ;
77
86
}
78
-
87
+
79
88
class SDKDownloadTask extends SwingWorker <Object , Object > {
80
89
81
90
private int downloadedSize = 0 ;
@@ -93,16 +102,24 @@ protected Object doInBackground() throws Exception {
93
102
File buildToolsFolder = new File (sdkFolder , "build-tools" );
94
103
if (!buildToolsFolder .exists ()) buildToolsFolder .mkdir ();
95
104
File extrasFolder = new File (sdkFolder , "extras" );
96
- if (!extrasFolder .exists ()) extrasFolder .mkdir ();
97
-
105
+ if (!extrasFolder .exists ()) extrasFolder .mkdir ();
106
+ File googleRepoFolder = new File (extrasFolder , "google" );
107
+ if (!googleRepoFolder .exists ()) googleRepoFolder .mkdir ();
108
+ File androidRepoFolder = new File (extrasFolder , "android" );
109
+ if (!androidRepoFolder .exists ()) androidRepoFolder .mkdir ();
110
+
98
111
// creating temp folder for downloaded zip packages
99
112
File tempFolder = new File (modeFolder , "temp" );
100
113
if (!tempFolder .exists ()) tempFolder .mkdir ();
101
114
102
115
try {
103
- SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , Platform .getName ());
116
+ SDKUrlHolder downloadUrls = new SDKUrlHolder ();
117
+ String repositoryUrl = REPOSITORY_URL + REPOSITORY_LIST ;
118
+ String addonUrl = REPOSITORY_URL + ADDON_LIST ;
119
+ getMainDownloadUrls (downloadUrls , repositoryUrl , Platform .getName ());
120
+ getExtrasDownloadUrls (downloadUrls , addonUrl , Platform .getName ());
104
121
firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
105
- totalSize = downloadUrls .totalSize ;
122
+ totalSize = downloadUrls .totalSize + SUPPORT_LIBRARY_SIZE ;
106
123
107
124
// tools
108
125
File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
@@ -120,11 +137,23 @@ protected Object doInBackground() throws Exception {
120
137
File downloadedPlatform = new File (tempFolder , downloadUrls .platformFilename );
121
138
downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder , false );
122
139
140
+ // google repository
141
+ File downloadedGoogleRepo = new File (tempFolder , downloadUrls .googleRepoFilename );
142
+ downloadAndUnpack (downloadUrls .googleRepoUrl , downloadedGoogleRepo , googleRepoFolder , false );
143
+
144
+ // android repository
145
+ File downloadedSupportRepo = new File (tempFolder , downloadUrls .supportRepoFilename );
146
+ downloadAndUnpack (downloadUrls .supportRepoUrl , downloadedSupportRepo , androidRepoFolder , false );
147
+
148
+ // support library
149
+ File downloadedSupportLibrary = new File (tempFolder , LEGACY_SUPPORT_LIBRARY );
150
+ String supportLibraryUrl = REPOSITORY_URL + LEGACY_SUPPORT_LIBRARY ;
151
+ downloadAndUnpack (supportLibraryUrl , downloadedSupportLibrary , androidRepoFolder , false );
152
+
123
153
// usb driver
124
154
if (Platform .isWindows ()) {
125
- File usbDriverFolder = new File (extrasFolder , "google" );
126
- File downloadedFolder = new File (tempFolder , "latest_usb_driver_windows.zip" );
127
- downloadAndUnpack (URL_USB_DRIVER , downloadedFolder , usbDriverFolder , false );
155
+ File downloadedFolder = new File (tempFolder , downloadUrls .usbDriverFilename );
156
+ downloadAndUnpack (downloadUrls .usbDriverUrl , downloadedFolder , googleRepoFolder , false );
128
157
}
129
158
130
159
if (Platform .isLinux () || Platform .isMacOS ()) {
@@ -170,7 +199,7 @@ private void downloadAndUnpack(String urlString, File saveTo,
170
199
} catch (MalformedURLException e ) {
171
200
//This is expected for API level 14 and more
172
201
try {
173
- url = new URL (URL_REPOSITORY_FOLDER + urlString );
202
+ url = new URL (REPOSITORY_URL + urlString );
174
203
} catch (MalformedURLException e1 ) {
175
204
//This exception is not expected. Need to return.
176
205
e1 .printStackTrace ();
@@ -198,10 +227,9 @@ private void downloadAndUnpack(String urlString, File saveTo,
198
227
AndroidMode .extractFolder (saveTo , unpackTo , setExec );
199
228
}
200
229
201
- private SDKUrlHolder getDownloadUrls (String repositoryUrl , String requiredHostOs )
230
+ private void getMainDownloadUrls (SDKUrlHolder urlHolder ,
231
+ String repositoryUrl , String requiredHostOs )
202
232
throws ParserConfigurationException , IOException , SAXException {
203
- SDKUrlHolder urlHolder = new SDKUrlHolder ();
204
-
205
233
DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
206
234
DocumentBuilder db = dbf .newDocumentBuilder ();
207
235
Document doc = db .parse (new URL (repositoryUrl ).openStream ());
@@ -237,7 +265,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
237
265
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
238
266
if (hostOs .equals (requiredHostOs )) {
239
267
urlHolder .platformToolsFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
240
- urlHolder .platformToolsUrl = URL_REPOSITORY_FOLDER + urlHolder .platformToolsFilename ;
268
+ urlHolder .platformToolsUrl = REPOSITORY_URL + urlHolder .platformToolsFilename ;
241
269
urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
242
270
break ;
243
271
}
@@ -260,7 +288,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
260
288
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
261
289
if (hostOs .equals (requiredHostOs )) {
262
290
urlHolder .buildToolsFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
263
- urlHolder .buildToolsUrl = URL_REPOSITORY_FOLDER + urlHolder .buildToolsFilename ;
291
+ urlHolder .buildToolsUrl = REPOSITORY_URL + urlHolder .buildToolsFilename ;
264
292
urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
265
293
break ;
266
294
}
@@ -278,17 +306,65 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
278
306
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
279
307
if (hostOs .equals (requiredHostOs )) {
280
308
urlHolder .toolsFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
281
- urlHolder .toolsUrl = URL_REPOSITORY_FOLDER + urlHolder .toolsFilename ;
309
+ urlHolder .toolsUrl = REPOSITORY_URL + urlHolder .toolsFilename ;
282
310
urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
283
311
break ;
284
312
}
285
313
}
286
- }
287
-
288
- return urlHolder ;
314
+ }
289
315
}
290
316
}
291
317
318
+ private void getExtrasDownloadUrls (SDKUrlHolder urlHolder ,
319
+ String repositoryUrl , String requiredHostOs )
320
+ throws ParserConfigurationException , IOException , SAXException {
321
+ DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
322
+ DocumentBuilder db = dbf .newDocumentBuilder ();
323
+ Document doc = db .parse (new URL (repositoryUrl ).openStream ());
324
+ Node archiveListItem ;
325
+ NodeList archiveList ;
326
+
327
+ NodeList nodeList = doc .getElementsByTagName ("sdk:extra" );
328
+ for (int i = 0 ; i < nodeList .getLength (); i ++) {
329
+ Node sdkExtraItem = nodeList .item (i );
330
+ if (sdkExtraItem != null ) {
331
+ String name = ((Element ) sdkExtraItem ).getElementsByTagName ("sdk:name-display" ).item (0 ).getTextContent ();
332
+ // ---------------------------------------------------------------------
333
+ // Android Support repository
334
+ if (name .equals ("Android Support Repository" )) {
335
+ archiveListItem = ((Element ) sdkExtraItem ).getElementsByTagName ("sdk:archives" ).item (0 );
336
+ archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
337
+ Node archive = archiveList .item (0 );
338
+ urlHolder .supportRepoFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
339
+ urlHolder .supportRepoUrl = REPOSITORY_URL + urlHolder .supportRepoFilename ;
340
+ urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
341
+ }
342
+
343
+ // ---------------------------------------------------------------------
344
+ // Google repository
345
+ if (name .equals ("Google Repository" )) {
346
+ archiveListItem = ((Element ) sdkExtraItem ).getElementsByTagName ("sdk:archives" ).item (0 );
347
+ archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
348
+ Node archive = archiveList .item (0 );
349
+ urlHolder .googleRepoFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
350
+ urlHolder .googleRepoUrl = REPOSITORY_URL + urlHolder .googleRepoFilename ;
351
+ urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
352
+ }
353
+
354
+ // ---------------------------------------------------------------------
355
+ // USB driver
356
+ if (name .equals ("Google USB Driver" )) {
357
+ archiveListItem = ((Element ) sdkExtraItem ).getElementsByTagName ("sdk:archives" ).item (0 );
358
+ archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
359
+ Node archive = archiveList .item (0 );
360
+ urlHolder .usbDriverFilename = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
361
+ urlHolder .usbDriverUrl = REPOSITORY_URL + urlHolder .usbDriverFilename ;
362
+ urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
363
+ }
364
+ }
365
+ }
366
+ }
367
+
292
368
private Node getLatestPlatform (NodeList platformList ) {
293
369
Node latest = null ;
294
370
int maxRevision = -1 ;
0 commit comments