1
1
package processing .mode .android ;
2
2
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 ;
3
9
import processing .app .Preferences ;
4
10
5
11
import javax .swing .*;
6
12
import javax .swing .border .EmptyBorder ;
13
+ import javax .xml .parsers .DocumentBuilder ;
14
+ import javax .xml .parsers .DocumentBuilderFactory ;
15
+ import javax .xml .parsers .ParserConfigurationException ;
7
16
import java .awt .*;
8
17
import java .awt .event .ActionEvent ;
9
18
import java .awt .event .ActionListener ;
19
+ import java .beans .PropertyChangeEvent ;
20
+ import java .beans .PropertyChangeListener ;
21
+ import java .io .IOException ;
22
+ import java .net .URL ;
10
23
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
+ }
12
128
13
129
public SDKDownloader () {
14
130
super ("Android SDK downloading..." );
@@ -17,6 +133,9 @@ public SDKDownloader() {
17
133
}
18
134
19
135
public void startDownload () {
136
+ SDKDownloadTask downloadTask = new SDKDownloadTask ();
137
+ downloadTask .addPropertyChangeListener (this );
138
+ downloadTask .execute ();
20
139
}
21
140
22
141
private void createLayout () {
0 commit comments