blob: 3efde74dff83fcb4dea747dd491fd541c2558094 [file] [log] [blame]
/*
* Copyright 2000-2010 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.facet;
import com.android.sdklib.IAndroidTarget;
import com.intellij.facet.FacetConfiguration;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.facet.ui.FacetEditorTab;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import org.jdom.Element;
import org.jetbrains.android.sdk.AndroidPlatform;
import org.jetbrains.android.sdk.AndroidSdkData;
import org.jetbrains.android.util.AndroidNativeLibData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.android.model.impl.AndroidImportableProperty;
import org.jetbrains.jps.android.model.impl.JpsAndroidModuleProperties;
import org.jetbrains.jps.util.JpsPathUtil;
import java.util.ArrayList;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidFacetConfiguration implements FacetConfiguration, PersistentStateComponent<JpsAndroidModuleProperties> {
private static final FacetEditorTab[] NO_EDITOR_TABS = new FacetEditorTab[0];
private AndroidFacet myFacet = null;
private JpsAndroidModuleProperties myProperties = new JpsAndroidModuleProperties();
public void init(@NotNull Module module, @NotNull VirtualFile contentRoot) {
init(module, contentRoot.getPath());
}
public void init(@NotNull Module module, @NotNull String baseDirectoryPath) {
final String s = AndroidRootUtil.getPathRelativeToModuleDir(module, baseDirectoryPath);
if (s == null || s.length() == 0) {
return;
}
myProperties.GEN_FOLDER_RELATIVE_PATH_APT = '/' + s + myProperties.GEN_FOLDER_RELATIVE_PATH_APT;
myProperties.GEN_FOLDER_RELATIVE_PATH_AIDL = '/' + s + myProperties.GEN_FOLDER_RELATIVE_PATH_AIDL;
myProperties.MANIFEST_FILE_RELATIVE_PATH = '/' + s + myProperties.MANIFEST_FILE_RELATIVE_PATH;
myProperties.RES_FOLDER_RELATIVE_PATH = '/' + s + myProperties.RES_FOLDER_RELATIVE_PATH;
myProperties.ASSETS_FOLDER_RELATIVE_PATH = '/' + s + myProperties.ASSETS_FOLDER_RELATIVE_PATH;
myProperties.LIBS_FOLDER_RELATIVE_PATH = '/' + s + myProperties.LIBS_FOLDER_RELATIVE_PATH;
myProperties.PROGUARD_LOGS_FOLDER_RELATIVE_PATH = '/' + s + myProperties.PROGUARD_LOGS_FOLDER_RELATIVE_PATH;
for (int i = 0; i < myProperties.RES_OVERLAY_FOLDERS.size(); i++) {
myProperties.RES_OVERLAY_FOLDERS.set(i, '/' + s + myProperties.RES_OVERLAY_FOLDERS.get(i));
}
}
@Nullable
public AndroidPlatform getAndroidPlatform() {
return AndroidPlatform.getInstance(myFacet.getModule());
}
@Nullable
public AndroidSdkData getAndroidSdk() {
AndroidPlatform platform = getAndroidPlatform();
return platform != null ? platform.getSdkData() : null;
}
@Nullable
public IAndroidTarget getAndroidTarget() {
AndroidPlatform platform = getAndroidPlatform();
return platform != null ? platform.getTarget() : null;
}
public void setFacet(@NotNull AndroidFacet facet) {
this.myFacet = facet;
facet.androidPlatformChanged();
}
@Override
public FacetEditorTab[] createEditorTabs(FacetEditorContext editorContext, FacetValidatorsManager validatorsManager) {
JpsAndroidModuleProperties state = getState();
assert state != null;
if (state.ALLOW_USER_CONFIGURATION) {
return new FacetEditorTab[]{new AndroidFacetEditorTab(editorContext, this)};
}
return NO_EDITOR_TABS;
}
@Override
public void readExternal(Element element) throws InvalidDataException {
}
@Override
public void writeExternal(Element element) throws WriteExternalException {
}
@NotNull
public List<AndroidNativeLibData> getAdditionalNativeLibraries() {
final List<AndroidNativeLibData> libDatas = new ArrayList<AndroidNativeLibData>();
for (JpsAndroidModuleProperties.AndroidNativeLibDataEntry nativeLib : myProperties.myNativeLibs) {
if (nativeLib.myArchitecture != null && nativeLib.myUrl != null && nativeLib.myTargetFileName != null) {
libDatas.add(new AndroidNativeLibData(nativeLib.myArchitecture, JpsPathUtil.urlToPath(nativeLib.myUrl),
nativeLib.myTargetFileName));
}
}
return libDatas;
}
public void setAdditionalNativeLibraries(@NotNull List<AndroidNativeLibData> additionalNativeLibraries) {
myProperties.myNativeLibs = new ArrayList<JpsAndroidModuleProperties.
AndroidNativeLibDataEntry>(additionalNativeLibraries.size());
for (AndroidNativeLibData lib : additionalNativeLibraries) {
final JpsAndroidModuleProperties.AndroidNativeLibDataEntry data =
new JpsAndroidModuleProperties.AndroidNativeLibDataEntry();
data.myArchitecture = lib.getArchitecture();
data.myUrl = VfsUtilCore.pathToUrl(lib.getPath());
data.myTargetFileName = lib.getTargetFileName();
myProperties.myNativeLibs.add(data);
}
}
public boolean isImportedProperty(@NotNull AndroidImportableProperty property) {
return !myProperties.myNotImportedProperties.contains(property);
}
public boolean isIncludeAssetsFromLibraries() {
return myProperties.myIncludeAssetsFromLibraries;
}
public void setIncludeAssetsFromLibraries(boolean includeAssetsFromLibraries) {
myProperties.myIncludeAssetsFromLibraries = includeAssetsFromLibraries;
}
@Nullable
@Override
public JpsAndroidModuleProperties getState() {
return myProperties;
}
@Override
public void loadState(JpsAndroidModuleProperties properties) {
myProperties = properties;
}
}