package com.mobilesorcery.sdk.builder.android.launch; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import com.mobilesorcery.sdk.builder.android.Activator; import com.mobilesorcery.sdk.core.AbstractTool; import com.mobilesorcery.sdk.core.CoreMoSyncPlugin; import com.mobilesorcery.sdk.core.LineReader.LineAdapter; public class Android extends AbstractTool { // REFACTOR ME! private static class AVDHandler extends LineAdapter { private final static Pattern NAME_PATTERN = Pattern.compile("\\s*Name:\\s*(.*)\\s*"); // Can we really know this works across all adb versions? Well, never mind, if it does // not work, that's fine too private final static Pattern API_LEVEL_PATTERN = Pattern.compile(".*API level\\s*(\\d*).*"); private final List<AVD> avds = new ArrayList<AVD>(); private AVD currentAVD; @Override public void newLine(String line) { String newName = extractName(line); if (newName != null) { addCurrentAVD(); currentAVD = new AVD(newName, AVD.UNKNOWN_API_LEVEL); } Integer newAPILevel = extractAPILevel(line); if (newAPILevel != null) { currentAVD = new AVD(currentAVD.getName(), newAPILevel); } } private Integer extractAPILevel(String line) { Matcher matcher = API_LEVEL_PATTERN.matcher(line); if (matcher.matches()) { String apiLevelStr = matcher.group(1); return Integer.parseInt(apiLevelStr); } return null; } private String extractName(String line) { Matcher matcher = NAME_PATTERN.matcher(line); if (matcher.matches()) { String avdName = matcher.group(1); return avdName; } return null; } private void addCurrentAVD() { if (currentAVD != null) { avds.add(currentAVD); currentAVD = null; } } public List<AVD> getAVDs() { addCurrentAVD(); return avds; } } private List<AVD> avds; private static IPath externalPath; private static Android external; public Android(IPath pathToAndroid) { super(pathToAndroid); } public static Android getExternal() { IPath sdkPath = Activator.getDefault().getExternalAndroidSDKPath(); if (!sdkPath.equals(externalPath)) { String extension = ""; if(System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) { extension = ".bat"; } IPath path = sdkPath == null ? null : sdkPath.append("tools/android" + extension); external = new Android(path); externalPath = sdkPath; } return external; } public void refresh() { avds = null; } public synchronized List<AVD> listAVDs() throws CoreException { if (avds == null) { AVDHandler avdHandler = new AVDHandler(); execute(new String[] { getToolPath().getAbsolutePath(), "list", "avds" }, avdHandler, null, CoreMoSyncPlugin.LOG_CONSOLE_NAME, false); avds = avdHandler.getAVDs(); } return avds; } @Override protected String getToolName() { return "Android"; } public boolean hasAVD(String avd) throws CoreException { // We make use of how the equals method is impl. return listAVDs().contains(new AVD(avd, AVD.UNKNOWN_API_LEVEL)); } public void launchUI(boolean fork) throws CoreException { execute(new String[] { getToolPath().getAbsolutePath() }, null, null, CoreMoSyncPlugin.LOG_CONSOLE_NAME, fork); } }