5050
5151@ SuppressWarnings ("serial" )
5252public 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 ;
5663
5764 private static final String PROPERTY_CHANGE_EVENT_TOTAL = "total" ;
5865 private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded" ;
@@ -73,9 +80,11 @@ class SDKUrlHolder {
7380 public String platformVersion , buildToolsVersion ;
7481 public String platformToolsUrl , buildToolsUrl , platformUrl , toolsUrl ;
7582 public String platformToolsFilename , buildToolsFilename , platformFilename , toolsFilename ;
83+ public String supportRepoUrl , googleRepoUrl , usbDriverUrl ;
84+ public String supportRepoFilename , googleRepoFilename , usbDriverFilename ;
7685 public int totalSize = 0 ;
7786 }
78-
87+
7988 class SDKDownloadTask extends SwingWorker <Object , Object > {
8089
8190 private int downloadedSize = 0 ;
@@ -93,16 +102,24 @@ protected Object doInBackground() throws Exception {
93102 File buildToolsFolder = new File (sdkFolder , "build-tools" );
94103 if (!buildToolsFolder .exists ()) buildToolsFolder .mkdir ();
95104 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+
98111 // creating temp folder for downloaded zip packages
99112 File tempFolder = new File (modeFolder , "temp" );
100113 if (!tempFolder .exists ()) tempFolder .mkdir ();
101114
102115 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 ());
104121 firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
105- totalSize = downloadUrls .totalSize ;
122+ totalSize = downloadUrls .totalSize + SUPPORT_LIBRARY_SIZE ;
106123
107124 // tools
108125 File downloadedTools = new File (tempFolder , downloadUrls .toolsFilename );
@@ -120,11 +137,23 @@ protected Object doInBackground() throws Exception {
120137 File downloadedPlatform = new File (tempFolder , downloadUrls .platformFilename );
121138 downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder , false );
122139
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+
123153 // usb driver
124154 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 );
128157 }
129158
130159 if (Platform .isLinux () || Platform .isMacOS ()) {
@@ -170,7 +199,7 @@ private void downloadAndUnpack(String urlString, File saveTo,
170199 } catch (MalformedURLException e ) {
171200 //This is expected for API level 14 and more
172201 try {
173- url = new URL (URL_REPOSITORY_FOLDER + urlString );
202+ url = new URL (REPOSITORY_URL + urlString );
174203 } catch (MalformedURLException e1 ) {
175204 //This exception is not expected. Need to return.
176205 e1 .printStackTrace ();
@@ -198,10 +227,9 @@ private void downloadAndUnpack(String urlString, File saveTo,
198227 AndroidMode .extractFolder (saveTo , unpackTo , setExec );
199228 }
200229
201- private SDKUrlHolder getDownloadUrls (String repositoryUrl , String requiredHostOs )
230+ private void getMainDownloadUrls (SDKUrlHolder urlHolder ,
231+ String repositoryUrl , String requiredHostOs )
202232 throws ParserConfigurationException , IOException , SAXException {
203- SDKUrlHolder urlHolder = new SDKUrlHolder ();
204-
205233 DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
206234 DocumentBuilder db = dbf .newDocumentBuilder ();
207235 Document doc = db .parse (new URL (repositoryUrl ).openStream ());
@@ -237,7 +265,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
237265 String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
238266 if (hostOs .equals (requiredHostOs )) {
239267 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 ;
241269 urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
242270 break ;
243271 }
@@ -260,7 +288,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
260288 String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
261289 if (hostOs .equals (requiredHostOs )) {
262290 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 ;
264292 urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
265293 break ;
266294 }
@@ -278,17 +306,65 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
278306 String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
279307 if (hostOs .equals (requiredHostOs )) {
280308 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 ;
282310 urlHolder .totalSize += Integer .parseInt (((Element ) archive ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
283311 break ;
284312 }
285313 }
286- }
287-
288- return urlHolder ;
314+ }
289315 }
290316 }
291317
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+
292368 private Node getLatestPlatform (NodeList platformList ) {
293369 Node latest = null ;
294370 int maxRevision = -1 ;
0 commit comments