Skip to content

Commit 8fcc72b

Browse files
committed
Merge branch 'imilka-sdkSelector'
2 parents 46d9b20 + e9ec19e commit 8fcc72b

File tree

4 files changed

+152
-11
lines changed

4 files changed

+152
-11
lines changed

src/processing/mode/android/AndroidBuild.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525
import org.apache.tools.ant.DefaultLogger;
2626
import org.apache.tools.ant.Project;
2727
import org.apache.tools.ant.ProjectHelper;
28+
2829
import processing.app.Base;
2930
import processing.app.Library;
31+
import processing.app.Preferences;
3032
import processing.app.Sketch;
3133
import processing.app.SketchException;
3234
import processing.app.exec.ProcessHelper;
@@ -41,8 +43,8 @@
4143
class AndroidBuild extends JavaBuild {
4244
// static final String basePackage = "changethispackage.beforesubmitting.tothemarket";
4345
static final String basePackage = "processing.test";
44-
static final String sdkName = "2.3.3";
45-
static final String sdkVersion = "10"; // Android 2.3.3 (Gingerbread)
46+
static String sdkName = "2.3.3";
47+
static String sdkVersion = "10"; // Android 2.3.3 (Gingerbread)
4648
static final String sdkTarget = "android-" + sdkVersion;
4749

4850
private final AndroidSDK sdk;
@@ -66,6 +68,15 @@ public AndroidBuild(final Sketch sketch, final AndroidMode mode) {
6668
coreZipFile = mode.getCoreZipLocation();
6769
}
6870

71+
public static void setSdkTarget(AndroidSDK.SDKTarget target, Sketch sketch) {
72+
sdkName = target.name;
73+
sdkVersion = Integer.toString(target.version);
74+
75+
Manifest manifest = new Manifest(sketch);
76+
manifest.setSdkTarget(sdkVersion);
77+
78+
Preferences.set("android.sdk.version", sdkVersion);
79+
}
6980

7081
/**
7182
* Build into temporary folders (needed for the Windows 8.3 bugs in the Android SDK).

src/processing/mode/android/AndroidEditor.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.awt.event.ActionListener;
3333
import java.io.File;
3434
import java.io.IOException;
35+
import java.util.ArrayList;
3536
import java.util.TimerTask;
3637

3738
@SuppressWarnings("serial")
@@ -217,6 +218,29 @@ public void actionPerformed(ActionEvent e) {
217218

218219
menu.addSeparator();
219220

221+
final JMenu sdkMenu = new JMenu("Select target SDK");
222+
JMenuItem defaultItem = new JCheckBoxMenuItem("No available targets");
223+
defaultItem.setEnabled(false);
224+
sdkMenu.add(defaultItem);
225+
226+
new Thread() {
227+
@Override
228+
public void run() {
229+
while(androidMode == null || androidMode.getSDK() == null) {
230+
try {
231+
Thread.sleep(3000);
232+
} catch (InterruptedException e) {
233+
e.printStackTrace();
234+
}
235+
}
236+
updateSdkMenu(sdkMenu);
237+
}
238+
}.start();
239+
240+
menu.add(sdkMenu);
241+
242+
menu.addSeparator();
243+
220244
item = new JMenuItem("Android SDK Manager");
221245
item.addActionListener(new ActionListener() {
222246
public void actionPerformed(ActionEvent e) {
@@ -251,6 +275,65 @@ public void actionPerformed(ActionEvent e) {
251275
return menu;
252276
}
253277

278+
private void updateSdkMenu(final JMenu sdkMenu) {
279+
try {
280+
ArrayList<AndroidSDK.SDKTarget> targets = androidMode.getSDK().getAvailableSdkTargets();
281+
282+
if(targets.size() != 0) sdkMenu.removeAll();
283+
284+
AndroidSDK.SDKTarget lowestTargetAvailable = null;
285+
JCheckBoxMenuItem lowestTargetMenuItem = null;
286+
287+
String savedTargetVersion = Preferences.get("android.sdk.version");
288+
boolean savedTargetSet = false;
289+
290+
for(final AndroidSDK.SDKTarget target : targets) {
291+
final JCheckBoxMenuItem item = new JCheckBoxMenuItem("API " + target.name + " (" + target.version + ")");
292+
293+
if(savedTargetSet == false && (lowestTargetAvailable == null || lowestTargetAvailable.version > target.version)) {
294+
lowestTargetAvailable = target;
295+
lowestTargetMenuItem = item;
296+
}
297+
298+
if(Integer.toString(target.version).equals(savedTargetVersion)) {
299+
AndroidBuild.setSdkTarget(target, sketch);
300+
item.setState(true);
301+
savedTargetSet = true;
302+
}
303+
304+
item.addChangeListener(new ChangeListener() {
305+
@Override
306+
public void stateChanged(ChangeEvent e) {
307+
if (target.name.equals(AndroidBuild.sdkName)) item.setState(true);
308+
else item.setState(false);
309+
}
310+
});
311+
312+
item.addActionListener(new ActionListener() {
313+
@Override
314+
public void actionPerformed(ActionEvent e) {
315+
AndroidBuild.setSdkTarget(target, sketch);
316+
317+
for (int i = 0; i < sdkMenu.getItemCount(); i++) {
318+
((JCheckBoxMenuItem) sdkMenu.getItem(i)).setState(false);
319+
}
320+
321+
item.setState(true);
322+
}
323+
});
324+
325+
sdkMenu.add(item);
326+
}
327+
328+
if(!savedTargetSet) {
329+
AndroidBuild.setSdkTarget(lowestTargetAvailable, sketch);
330+
lowestTargetMenuItem.setState(true);
331+
}
332+
} catch (IOException e) {
333+
e.printStackTrace();
334+
}
335+
}
336+
254337

255338
/**
256339
* Uses the main help menu, and adds a few extra options. If/when there's

src/processing/mode/android/AndroidSDK.java

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

33
import processing.app.Base;
4-
import processing.app.Editor;
54
import processing.app.Platform;
65
import processing.app.Preferences;
76
import processing.app.exec.ProcessHelper;
@@ -10,16 +9,20 @@
109

1110
import javax.swing.*;
1211
import java.awt.*;
12+
import java.io.BufferedReader;
1313
import java.io.File;
14+
import java.io.FileReader;
1415
import java.io.IOException;
1516
import java.text.DateFormat;
1617
import java.text.ParseException;
1718
import java.text.SimpleDateFormat;
19+
import java.util.ArrayList;
1820
import java.util.Date;
1921

2022
class AndroidSDK {
2123
private final File folder;
2224
private final File tools;
25+
private final File platforms;
2326
private final File platformTools;
2427
private final File androidTool;
2528

@@ -62,6 +65,11 @@ public AndroidSDK(File folder) throws BadSDKException, IOException {
6265
throw new BadSDKException("There is no platform-tools folder in " + folder);
6366
}
6467

68+
platforms = new File(folder, "platforms");
69+
if (!platforms.exists()) {
70+
throw new BadSDKException("There is no platforms folder in " + folder);
71+
}
72+
6573
androidTool = findAndroidTool(tools);
6674

6775
final Platform p = Base.getPlatform();
@@ -385,4 +393,39 @@ public static ProcessResult runADB(final String... cmd)
385393
// throw ioe;
386394
// }
387395
}
396+
397+
public static class SDKTarget {
398+
public int version = 0;
399+
public String name;
400+
}
401+
402+
public ArrayList<SDKTarget> getAvailableSdkTargets() throws IOException {
403+
ArrayList<SDKTarget> targets = new ArrayList<SDKTarget>();
404+
405+
for(File platform : platforms.listFiles()) {
406+
File propFile = new File(platform, "build.prop");
407+
if(!propFile.exists()) continue;
408+
409+
SDKTarget target = new SDKTarget();
410+
411+
BufferedReader br = new BufferedReader(new FileReader(propFile));
412+
String line;
413+
while ((line = br.readLine()) != null) {
414+
String[] lineData = line.split("=");
415+
if(lineData[0].equals("ro.build.version.sdk")) {
416+
target.version = Integer.valueOf(lineData[1]);
417+
}
418+
419+
if(lineData[0].equals("ro.build.version.release")) {
420+
target.name = lineData[1];
421+
break;
422+
}
423+
}
424+
br.close();
425+
426+
if(target.version != 0 && target.name != null) targets.add(target);
427+
}
428+
429+
return targets;
430+
}
388431
}

src/processing/mode/android/Manifest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,18 @@
2121

2222
package processing.mode.android;
2323

24+
import org.xml.sax.SAXException;
25+
import processing.app.Base;
26+
import processing.app.Sketch;
27+
import processing.core.PApplet;
28+
import processing.data.XML;
29+
30+
import javax.xml.parsers.ParserConfigurationException;
2431
import java.io.File;
2532
import java.io.FileNotFoundException;
2633
import java.io.IOException;
2734
import java.io.PrintWriter;
2835

29-
import javax.xml.parsers.ParserConfigurationException;
30-
31-
import org.xml.sax.SAXException;
32-
33-
import processing.app.*;
34-
import processing.core.PApplet;
35-
import processing.data.XML;
36-
3736

3837
public class Manifest {
3938
static final String MANIFEST_XML = "AndroidManifest.xml";
@@ -90,6 +89,11 @@ public void setPackageName(String packageName) {
9089
save();
9190
}
9291

92+
public void setSdkTarget(String version) {
93+
XML usesSdk = xml.getChild("uses-sdk");
94+
usesSdk.setString("android:minSdkVersion", version);
95+
save();
96+
}
9397

9498
//writer.println(" <uses-permission android:name=\"android.permission.INTERNET\" />");
9599
//writer.println(" <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />");

0 commit comments

Comments
 (0)