blob: 7cab7e024d5281941f91d061283c21808302944a [file] [log] [blame]
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.android.sdk;
import com.android.sdklib.AndroidVersion;
import com.android.sdklib.IAndroidTarget;
import com.android.tools.idea.sdk.Jdks;
import com.google.common.collect.Lists;
import com.intellij.CommonBundle;
import com.intellij.openapi.projectRoots.*;
import com.intellij.openapi.projectRoots.impl.JavaDependentSdkType;
import com.intellij.openapi.roots.AnnotationOrderRootType;
import com.intellij.openapi.roots.JavadocOrderRootType;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.ui.Messages;
import icons.AndroidIcons;
import org.jdom.Element;
import org.jetbrains.android.actions.RunAndroidSdkManagerAction;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import static com.android.tools.idea.sdk.SdkPaths.validateAndroidSdk;
import static com.intellij.openapi.util.io.FileUtil.toSystemDependentName;
import static com.intellij.openapi.util.text.StringUtil.isEmpty;
import static org.jetbrains.android.sdk.AndroidSdkData.getSdkData;
import static org.jetbrains.android.sdk.AndroidSdkUtils.*;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidSdkType extends JavaDependentSdkType implements JavaSdkType {
@NonNls public static final String SDK_NAME = "Android SDK";
@NonNls public static final String DEFAULT_EXTERNAL_DOCUMENTATION_URL = "http://developer.android.com/reference/";
public AndroidSdkType() {
super(SDK_NAME);
}
@Override
@Nullable
public String getBinPath(@NotNull Sdk sdk) {
Sdk internalJavaSdk = getInternalJavaSdk(sdk);
return internalJavaSdk == null ? null : JavaSdk.getInstance().getBinPath(internalJavaSdk);
}
@Override
@Nullable
public String getToolsPath(@NotNull Sdk sdk) {
Sdk jdk = getInternalJavaSdk(sdk);
if (jdk != null && jdk.getVersionString() != null) {
return JavaSdk.getInstance().getToolsPath(jdk);
}
return null;
}
@Override
@Nullable
public String getVMExecutablePath(@NotNull Sdk sdk) {
Sdk internalJavaSdk = getInternalJavaSdk(sdk);
return internalJavaSdk == null ? null : JavaSdk.getInstance().getVMExecutablePath(internalJavaSdk);
}
@Override
@Nullable
public String suggestHomePath() {
return null;
}
@Override
public boolean isValidSdkHome(@Nullable String path) {
if (isEmpty(path)) {
return false;
}
File sdkPath = new File(toSystemDependentName(path));
return validateAndroidSdk(sdkPath, false).success;
}
@Override
public String getVersionString(@NotNull Sdk sdk) {
Sdk internalJavaSdk = getInternalJavaSdk(sdk);
return internalJavaSdk != null ? internalJavaSdk.getVersionString() : null;
}
@Override
@NotNull
public String suggestSdkName(String currentSdkName, String sdkHome) {
return SDK_NAME;
}
@Override
public boolean setupSdkPaths(@NotNull Sdk sdk, @NotNull SdkModel sdkModel) {
final List<String> javaSdks = Lists.newArrayList();
final Sdk[] sdks = sdkModel.getSdks();
for (Sdk jdk : sdks) {
if (Jdks.isApplicableJdk(jdk)) {
javaSdks.add(jdk.getName());
}
}
if (javaSdks.isEmpty()) {
Messages.showErrorDialog(AndroidBundle.message("no.jdk.for.android.found.error"), "No Java SDK Found");
return false;
}
MessageBuildingSdkLog log = new MessageBuildingSdkLog();
AndroidSdkData sdkData = getSdkData(sdk);
if (sdkData == null) {
String errorMessage = !log.getErrorMessage().isEmpty() ? log.getErrorMessage() : AndroidBundle.message("cannot.parse.sdk.error");
Messages.showErrorDialog(errorMessage, "SDK Parsing Error");
return false;
}
IAndroidTarget[] targets = sdkData.getTargets();
if (targets.length == 0) {
if (Messages.showOkCancelDialog(AndroidBundle.message("no.android.targets.error"), CommonBundle.getErrorTitle(),
"Open SDK Manager", Messages.CANCEL_BUTTON, Messages.getErrorIcon()) == Messages.OK) {
RunAndroidSdkManagerAction.runSpecificSdkManager(null, sdkData.getLocation());
}
return false;
}
String[] targetNames = new String[targets.length];
String newestPlatform = null;
AndroidVersion version = null;
for (int i = 0; i < targets.length; i++) {
IAndroidTarget target = targets[i];
String targetName = getTargetPresentableName(target);
targetNames[i] = targetName;
if (target.isPlatform() && (version == null || target.getVersion().compareTo(version) > 0)) {
newestPlatform = targetName;
version = target.getVersion();
}
}
AndroidNewSdkDialog dialog = new AndroidNewSdkDialog(null, javaSdks, javaSdks.get(0), Arrays.asList(targetNames),
newestPlatform != null ? newestPlatform : targetNames[0]);
if (!dialog.showAndGet()) {
return false;
}
String name = javaSdks.get(dialog.getSelectedJavaSdkIndex());
Sdk jdk = sdkModel.findSdk(name);
IAndroidTarget target = targets[dialog.getSelectedTargetIndex()];
String sdkName = chooseNameForNewLibrary(target);
setUpSdk(sdk, sdkName, sdks, target, jdk, true);
return true;
}
@Override
@NotNull
public AdditionalDataConfigurable createAdditionalDataConfigurable(@NotNull SdkModel sdkModel, @NotNull SdkModificator sdkModificator) {
return new AndroidSdkConfigurable(sdkModel, sdkModificator);
}
@Override
public void saveAdditionalData(@NotNull SdkAdditionalData data, @NotNull Element e) {
if (data instanceof AndroidSdkAdditionalData) {
((AndroidSdkAdditionalData)data).save(e);
}
}
@Override
@NotNull
public SdkAdditionalData loadAdditionalData(@NotNull Sdk currentSdk, @NotNull Element additional) {
return new AndroidSdkAdditionalData(currentSdk, additional);
}
@Override
@NotNull
public String getPresentableName() {
return AndroidBundle.message("android.sdk.presentable.name");
}
@Override
@NotNull
public Icon getIcon() {
return AndroidIcons.Android;
}
@Override
@NotNull
public Icon getIconForAddAction() {
return getIcon();
}
@Override
@NotNull
public String getDefaultDocumentationUrl(@NotNull Sdk sdk) {
return DEFAULT_EXTERNAL_DOCUMENTATION_URL;
}
@Override
public boolean isRootTypeApplicable(OrderRootType type) {
return type == OrderRootType.CLASSES ||
type == OrderRootType.SOURCES ||
type == JavadocOrderRootType.getInstance() ||
type == AnnotationOrderRootType.getInstance();
}
@Nullable
private static Sdk getInternalJavaSdk(@NotNull Sdk sdk) {
AndroidSdkAdditionalData data = getAndroidSdkAdditionalData(sdk);
return data != null ? data.getJavaSdk() : null;
}
public static AndroidSdkType getInstance() {
return SdkType.findInstance(AndroidSdkType.class);
}
}