mirror of
https://github.com/processing/processing4.git
synced 2026-06-16 04:26:26 +02:00
AndroidSDK now has a single static method, "find", which checks your environment and the Processing preferences for a legit SDK, then prompts the user if all else fails.
This commit is contained in:
@@ -1,13 +1,19 @@
|
||||
package processing.app.tools.android;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import javax.swing.JOptionPane;
|
||||
import processing.app.Base;
|
||||
import processing.app.Editor;
|
||||
import processing.app.Platform;
|
||||
import processing.app.Preferences;
|
||||
|
||||
class AndroidSDK {
|
||||
private final File sdk;
|
||||
private final File tools;
|
||||
private final File androidTool;
|
||||
|
||||
public AndroidSDK(final String sdkPath) throws BadSDKException {
|
||||
public AndroidSDK(final String sdkPath) throws BadSDKException, IOException {
|
||||
sdk = new File(sdkPath);
|
||||
if (!sdk.exists()) {
|
||||
throw new BadSDKException(sdk + " does not exist");
|
||||
@@ -19,6 +25,11 @@ class AndroidSDK {
|
||||
}
|
||||
|
||||
androidTool = findAndroidTool(tools);
|
||||
|
||||
final Platform p = Base.getPlatform();
|
||||
p.setenv("ANDROID_SDK", sdk.getCanonicalPath());
|
||||
p.setenv("PATH", tools.getCanonicalPath() + File.pathSeparator
|
||||
+ p.getenv("PATH"));
|
||||
}
|
||||
|
||||
public File getAndroidTool() {
|
||||
@@ -50,4 +61,94 @@ class AndroidSDK {
|
||||
}
|
||||
throw new BadSDKException("Cannot find the android tool in " + tools);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for the ANDROID_SDK environment variable. If the variable is set, and refers
|
||||
* to a legitimate android SDK, then use that, and save the preference.
|
||||
*
|
||||
* Check for a previously set android.sdk.path preference. If the pref is set, and refers
|
||||
* to a legitimate android SDK, then use that.
|
||||
*
|
||||
* Prompt the user to select an android SDK. If the user selects a legitimate
|
||||
* android SDK, then use that, and save the preference.
|
||||
*
|
||||
* @return an AndroidSDK
|
||||
* @throws BadSDKException
|
||||
* @throws IOException
|
||||
*/
|
||||
public static AndroidSDK find(final Editor editor) throws BadSDKException,
|
||||
IOException {
|
||||
final Platform platform = Base.getPlatform();
|
||||
|
||||
// The environment variable is king. The preferences.txt entry is a page.
|
||||
final String sdkEnvPath = platform.getenv("ANDROID_SDK");
|
||||
if (sdkEnvPath != null) {
|
||||
try {
|
||||
final AndroidSDK androidSDK = new AndroidSDK(sdkEnvPath);
|
||||
// Set this value in preferences.txt, in case ANDROID_SDK
|
||||
// gets knocked out later. For instance, by that pesky Eclipse,
|
||||
// which nukes all env variables when launching from the IDE.
|
||||
Preferences.set("android.sdk.path", sdkEnvPath);
|
||||
return androidSDK;
|
||||
} catch (final BadSDKException drop) {
|
||||
}
|
||||
}
|
||||
|
||||
// If android.sdk.path exists as a preference, make sure that the folder
|
||||
// is not bogus, otherwise the SDK may have been removed or deleted.
|
||||
final String sdkPrefsPath = Preferences.get("android.sdk.path");
|
||||
if (sdkPrefsPath != null) {
|
||||
try {
|
||||
final AndroidSDK androidSDK = new AndroidSDK(sdkPrefsPath);
|
||||
// Set this value in preferences.txt, in case ANDROID_SDK
|
||||
// gets knocked out later. For instance, by that pesky Eclipse,
|
||||
// which nukes all env variables when launching from the IDE.
|
||||
Preferences.set("android.sdk.path", sdkPrefsPath);
|
||||
return androidSDK;
|
||||
} catch (final BadSDKException wellThatsThat) {
|
||||
Preferences.unset("android.sdk.path");
|
||||
}
|
||||
}
|
||||
|
||||
final int result = Base.showYesNoQuestion(editor, "Android SDK",
|
||||
ANDROID_SDK_PRIMARY, ANDROID_SDK_SECONDARY);
|
||||
if (result == JOptionPane.CANCEL_OPTION) {
|
||||
throw new BadSDKException("User cancelled attempt to find SDK.");
|
||||
}
|
||||
if (result == JOptionPane.NO_OPTION) {
|
||||
// user admitted they don't have the SDK installed, and need help.
|
||||
Base.openURL(ANDROID_SDK_URL);
|
||||
throw new BadSDKException("No SDK installed.");
|
||||
}
|
||||
while (true) {
|
||||
final File folder = Base.selectFolder(SELECT_ANDROID_SDK_FOLDER, null,
|
||||
editor);
|
||||
if (folder == null) {
|
||||
throw new BadSDKException("User cancelled attempt to find SDK.");
|
||||
}
|
||||
|
||||
final String selectedPath = folder.getAbsolutePath();
|
||||
try {
|
||||
final AndroidSDK androidSDK = new AndroidSDK(selectedPath);
|
||||
Preferences.set("android.sdk.path", selectedPath);
|
||||
return androidSDK;
|
||||
} catch (final BadSDKException nope) {
|
||||
JOptionPane.showMessageDialog(editor, NOT_ANDROID_SDK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final String ANDROID_SDK_PRIMARY = "Is the Android SDK installed?";
|
||||
|
||||
private static final String ANDROID_SDK_SECONDARY = "The Android SDK does not appear to be installed, <br>"
|
||||
+ "because the ANDROID_SDK variable is not set. <br>"
|
||||
+ "If it is installed, click “Yes” to select the <br>"
|
||||
+ "location of the SDK, or “No” to visit the SDK<br>"
|
||||
+ "download site at http://developer.android.com/sdk.";
|
||||
|
||||
private static final String SELECT_ANDROID_SDK_FOLDER = "Choose the location of the Android SDK";
|
||||
|
||||
private static final String NOT_ANDROID_SDK = "The selected folder does not appear to contain an Android SDK.";
|
||||
|
||||
private static final String ANDROID_SDK_URL = "http://developer.android.com/sdk/";
|
||||
}
|
||||
|
||||
@@ -22,17 +22,13 @@
|
||||
package processing.app.tools.android;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import processing.app.Base;
|
||||
import processing.app.Editor;
|
||||
import processing.app.Platform;
|
||||
import processing.app.Sketch;
|
||||
import processing.app.tools.Tool;
|
||||
import processing.core.PApplet;
|
||||
@@ -63,32 +59,14 @@ public class AndroidTool implements Tool {
|
||||
public void run() {
|
||||
editor.statusNotice("Loading Android tools.");
|
||||
|
||||
final Platform platform = Base.getPlatform();
|
||||
|
||||
// check for ANDROID_SDK environment variable
|
||||
final String sdkPath = platform.getenv("ANDROID_SDK");
|
||||
if (sdkPath == null) {
|
||||
Base
|
||||
.showWarning("Android Tools Error",
|
||||
"Before using Android mode, you must first set the\n"
|
||||
+ "ANDROID_SDK environment variable, and restart Processing.",
|
||||
null);
|
||||
editor.statusNotice("Android mode canceled.");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
sdk = new AndroidSDK(sdkPath);
|
||||
} catch (final BadSDKException e) {
|
||||
sdk = AndroidSDK.find(editor);
|
||||
} catch (final Exception e) {
|
||||
Base.showWarning("Android Tools Error", e.getMessage(), null);
|
||||
editor.statusNotice("Android mode canceled.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!checkPath()) {
|
||||
editor.statusNotice("Android mode canceled.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure that the processing.android.core.* classes are available
|
||||
if (!checkCore()) {
|
||||
editor.statusNotice("Android mode canceled.");
|
||||
@@ -101,136 +79,6 @@ public class AndroidTool implements Tool {
|
||||
editor.statusNotice("Done loading Android tools.");
|
||||
}
|
||||
|
||||
private static final Pattern quotedPathElement = Pattern
|
||||
.compile("^\"([^\"]*)\"$");
|
||||
|
||||
// make sure that $ANDROID_SDK/tools has been added to the PATH
|
||||
private boolean checkPath() {
|
||||
final String canonicalTools;
|
||||
try {
|
||||
canonicalTools = sdk.getTools().getCanonicalPath();
|
||||
} catch (final IOException unexpected) {
|
||||
Base.showWarning("Android Tools Error", "Unexpected internal error.",
|
||||
unexpected);
|
||||
return false;
|
||||
}
|
||||
|
||||
final String envPath = Base.getPlatform().getenv("PATH");
|
||||
for (String entry : PApplet.split(envPath, File.pathSeparatorChar)) {
|
||||
entry = entry.trim();
|
||||
if (entry.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
final Matcher m = quotedPathElement.matcher(entry);
|
||||
if (m.matches()) {
|
||||
entry = m.group(1); // unquote
|
||||
}
|
||||
try {
|
||||
if (canonicalTools.equals(new File(entry).getCanonicalPath())) {
|
||||
return true;
|
||||
}
|
||||
} catch (final IOException unexpected) {
|
||||
System.err.println(unexpected);
|
||||
}
|
||||
}
|
||||
|
||||
Base.showWarning("Android Tools Error",
|
||||
"You need to add the tools folder of the Android SDK\n"
|
||||
+ "to your PATH environment variable and restart Processing.\n"
|
||||
+ "The folder is: " + sdk.getTools().getAbsolutePath() + ".", null);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
protected boolean checkPath_orig() {
|
||||
// If android.sdk.path exists as a preference, make sure that the folder
|
||||
// exists, otherwise the SDK may have been removed or deleted.
|
||||
final String oldPath = Preferences.get("android.sdk.path");
|
||||
if (oldPath != null) {
|
||||
final File oldFolder = new File(oldPath);
|
||||
if (!oldFolder.exists()) {
|
||||
// Clear the preference so that it's updated below
|
||||
Preferences.unset("android.sdk.path");
|
||||
}
|
||||
}
|
||||
|
||||
// The environment variable is king. The preferences.txt entry is a page.
|
||||
final Platform platform = Base.getPlatform();
|
||||
sdkPath = findAndroidTool(platform.getenv("ANDROID_SDK"));
|
||||
if (sdkPath != null) {
|
||||
// Set this value in preferences.txt, in case ANDROID_SDK
|
||||
// gets knocked out later. For instance, by that pesky Eclipse,
|
||||
// which nukes all env variables when launching from the IDE.
|
||||
Preferences.set("android.sdk.path", sdkPath);
|
||||
} else {
|
||||
// See if the path was set earlier
|
||||
sdkPath = findAndroidTool(Preferences.get("android.sdk.path"));
|
||||
|
||||
if (sdkPath == null) {
|
||||
final int result = Base.showYesNoQuestion(editor, "Android SDK",
|
||||
ANDROID_SDK_PRIMARY, ANDROID_SDK_SECONDARY);
|
||||
if (result == JOptionPane.YES_OPTION) {
|
||||
final File folder = Base.selectFolder(SELECT_ANDROID_SDK_FOLDER,
|
||||
null, editor);
|
||||
if (folder != null) {
|
||||
sdkPath = findAndroidTool(folder.getAbsolutePath());
|
||||
if (sdkPath != null) {
|
||||
Preferences.set("android.sdk.path", sdkPath);
|
||||
} else {
|
||||
// tools/android not found in the selected folder
|
||||
System.err
|
||||
.println("Could not find the android executable inside "
|
||||
+ folder.getAbsolutePath() + "/tools/");
|
||||
JOptionPane.showMessageDialog(editor, NOT_ANDROID_SDK);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (result == JOptionPane.NO_OPTION) {
|
||||
// user admitted they don't have the SDK installed, and need help.
|
||||
Base.openURL(ANDROID_SDK_URL);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sdkPath == null) {
|
||||
return false;
|
||||
}
|
||||
// if (envPath == null) {
|
||||
platform.setenv("ANDROID_SDK", sdkPath);
|
||||
// }
|
||||
|
||||
// platform.setenv("ANDROID_SDK", "/opt/android");
|
||||
// sdkPath = platform.getenv("ANDROID_SDK");
|
||||
// System.out.println("sdk path is " + sdkPath);
|
||||
// sdkPath = "/opt/android";
|
||||
|
||||
// // Make sure that the tools are in the PATH
|
||||
// String toolsPath = sdkPath + File.separator + "tools";
|
||||
// String path = platform.getenv("PATH");
|
||||
// System.out.println("path before set is " + path);
|
||||
// platform.setenv("PATH", path + File.pathSeparator + toolsPath);
|
||||
// System.out.println("path after set is " +
|
||||
// Base.getPlatform().getenv("PATH"));
|
||||
//
|
||||
// try {
|
||||
// PApplet.println(Device.list());
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
//
|
||||
// String[] cmd = { "echo", "$PATH" };
|
||||
// try {
|
||||
// ProcessHelper p = new ProcessHelper(cmd);
|
||||
// int result = p.waitFor();
|
||||
// if (result == 0) {
|
||||
// PApplet.println(p.getOutputLines());
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
static protected File getCoreZipFile() {
|
||||
// for debugging only, check to see if this is an svn checkout
|
||||
File debugFile = new File("../../../android/core.zip");
|
||||
@@ -373,22 +221,4 @@ public class AndroidTool implements Tool {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
private static final String ANDROID_SDK_PRIMARY = "Is the Android SDK installed?";
|
||||
|
||||
private static final String ANDROID_SDK_SECONDARY = "The Android SDK does not appear to be installed, <br>"
|
||||
+ "because the ANDROID_SDK variable is not set. <br>"
|
||||
+ "If it is installed, click “Yes” to select the <br>"
|
||||
+ "location of the SDK, or “No” to visit the SDK<br>"
|
||||
+ "download site at http://developer.android.com/sdk.";
|
||||
|
||||
private static final String SELECT_ANDROID_SDK_FOLDER = "Choose the location of the Android SDK";
|
||||
|
||||
private static final String NOT_ANDROID_SDK = "The selected folder does not appear to contain an Android SDK.";
|
||||
|
||||
private static final String ANDROID_SDK_URL = "http://developer.android.com/sdk/";
|
||||
|
||||
private static final String ADB_SOCKET_PORT = "29892";
|
||||
*/
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user