11package processing .mode .android ;
22
3+ import org .w3c .dom .Document ;
4+ import org .w3c .dom .Element ;
5+ import org .w3c .dom .Node ;
6+ import org .w3c .dom .NodeList ;
7+ import org .xml .sax .SAXException ;
8+ import processing .app .Base ;
39import processing .app .Preferences ;
410
511import javax .swing .*;
612import javax .swing .border .EmptyBorder ;
13+ import javax .xml .parsers .DocumentBuilder ;
14+ import javax .xml .parsers .DocumentBuilderFactory ;
15+ import javax .xml .parsers .ParserConfigurationException ;
716import java .awt .*;
817import java .awt .event .ActionEvent ;
918import java .awt .event .ActionListener ;
19+ import java .beans .PropertyChangeEvent ;
20+ import java .beans .PropertyChangeListener ;
21+ import java .io .IOException ;
22+ import java .net .URL ;
1023
11- public class SDKDownloader extends JFrame {
24+ public class SDKDownloader extends JFrame implements PropertyChangeListener {
25+
26+ private static final String URL_SDK_TOOLS_WINDOWS = "http://dl.google.com/android/android-sdk_r23-windows.zip" ;
27+ private static final String URL_SDK_TOOLS_MACOS = "http://dl.google.com/android/android-sdk_r23-macosx.zip" ;
28+ private static final String URL_SDK_TOOLS_LINUX = "http://dl.google.com/android/android-sdk_r23-linux.tgz" ;
29+
30+ private static final String URL_REPOSITORY = "https://dl-ssl.google.com/android/repository/repository-10.xml" ;
31+ private static final String URL_REPOSITORY_FOLDER = "http://dl-ssl.google.com/android/repository/" ;
32+
33+ private static final String PLATFORM_API_LEVEL = "10" ;
34+
35+ class SDKUrlHolder {
36+ public String platformToolsUrl , buildToolsUrl , platformUrl ;
37+ }
38+
39+ class SDKDownloadTask extends SwingWorker {
40+
41+ @ Override
42+ protected Object doInBackground () throws Exception {
43+ String hostOs = getOsString ();
44+ try {
45+ SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , hostOs );
46+ } catch (ParserConfigurationException e ) {
47+ // TODO Handle exceptions here somehow (ie show error message)
48+ e .printStackTrace ();
49+ } catch (IOException e ) {
50+ e .printStackTrace ();
51+ } catch (SAXException e ) {
52+ e .printStackTrace ();
53+ }
54+ return null ;
55+ }
56+
57+ @ Override
58+ protected void done () {
59+ super .done ();
60+ }
61+
62+ private String getOsString () {
63+ if (Base .isWindows ()) {
64+ return "windows" ;
65+ } else if (Base .isLinux ()) {
66+ return "linux" ;
67+ } else {
68+ return "macosx" ;
69+ }
70+ }
71+
72+ private SDKUrlHolder getDownloadUrls (String repositoryUrl , String requiredHostOs ) throws ParserConfigurationException , IOException , SAXException {
73+ SDKUrlHolder urlHolder = new SDKUrlHolder ();
74+
75+ DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
76+ DocumentBuilder db = dbf .newDocumentBuilder ();
77+ Document doc = db .parse (new URL (repositoryUrl ).openStream ());
78+
79+ // platform
80+ NodeList platformList = doc .getElementsByTagName ("sdk:platform" );
81+ for (int i = 0 ; i < platformList .getLength (); i ++) {
82+ Node platform = platformList .item (i );
83+ if (((Element ) platform ).getElementsByTagName ("sdk:api-level" ).item (0 ).getTextContent ().equals (PLATFORM_API_LEVEL )) {
84+ Node archiveListItem = ((Element ) platform ).getElementsByTagName ("sdk:archives" ).item (0 );
85+ Node archiveItem = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" ).item (0 );
86+ urlHolder .platformUrl = ((Element ) archiveItem ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ();
87+ }
88+ }
89+
90+ // platform-tools
91+ Node platformToolItem = doc .getElementsByTagName ("sdk:platform-tool" ).item (0 );
92+ Node archiveListItem = ((Element ) platformToolItem ).getElementsByTagName ("sdk:archives" ).item (0 );
93+ NodeList archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
94+ for (int i = 0 ; i < archiveList .getLength (); i ++) {
95+ Node archive = archiveList .item (i );
96+ String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
97+ if (hostOs .equals (requiredHostOs )) {
98+ String platformToolsUrl = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
99+ if (!platformToolsUrl .startsWith ("http" )) platformToolsUrl = URL_REPOSITORY_FOLDER + platformToolsUrl ;
100+ urlHolder .platformToolsUrl = platformToolsUrl ;
101+ break ;
102+ }
103+ }
104+
105+ // build-tools
106+ Node buildToolsItem = doc .getElementsByTagName ("sdk:build-tool" ).item (doc .getElementsByTagName ("sdk:build-tool" ).getLength ()-1 );
107+ archiveListItem = ((Element ) buildToolsItem ).getElementsByTagName ("sdk:archives" ).item (0 );
108+ archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
109+ for (int i = 0 ; i < archiveList .getLength (); i ++) {
110+ Node archive = archiveList .item (i );
111+ String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
112+ if (hostOs .equals (requiredHostOs )) {
113+ String buildToolsUrl = (((Element ) archive ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ());
114+ if (!buildToolsUrl .startsWith ("http" )) buildToolsUrl = URL_REPOSITORY_FOLDER + buildToolsUrl ;
115+ urlHolder .buildToolsUrl = buildToolsUrl ;
116+ break ;
117+ }
118+ }
119+
120+ return urlHolder ;
121+ }
122+ }
123+
124+ @ Override
125+ public void propertyChange (PropertyChangeEvent evt ) {
126+
127+ }
12128
13129 public SDKDownloader () {
14130 super ("Android SDK downloading..." );
@@ -17,6 +133,9 @@ public SDKDownloader() {
17133 }
18134
19135 public void startDownload () {
136+ SDKDownloadTask downloadTask = new SDKDownloadTask ();
137+ downloadTask .addPropertyChangeListener (this );
138+ downloadTask .execute ();
20139 }
21140
22141 private void createLayout () {
0 commit comments