Merge remote-tracking branch 'aosp/upstream-master' into merge-upstream
Conflicts:
android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
This includes the following CLs:
e0a5c04: uppercase prefix should middle-match lowercase string
6588401: support for resource directories: enable java-specific actions only for directories under source roots
44dc6a5: IDEA-100044 Parceable.CREATOR shouldn't be marker as unused
f255477: IDEA-89390 proguard vm options settings
9763c39: IDEA-113138 do not suggest class-based test run configuration in method context
a4baa06: do not open logcat automatically if it is test configuration
f5e0724: fix typo
02615b7: fix regression of IDEA-80976: restore access to logcat view
b602f9e: IDEA-85457 activate "DDMS" tool window automatically after application is successfully deployed and launched if we're not in debug mo
d52b94e: IDEA-112293 clear resolved apklibs info when importing is finished
6815307: first letter case sensitivity should match pattern start with name start even in middle matches
6234bda: spellchecker: suggest to renaming of value resource, ID, app package to update all usages
4439bc0: IDEA-112979 spellchecker inspection should be suppressed for symbols user cannot edit
2ed6ec6: IDEA-102180 Android XML: markup nested to string resources should not be reformatted
bd6ee47: IDEA-112932 place "width" and then "height" attributes right after "layout_*" attrs
c107496: do not add "generated_by_ide" mark 2 times
b0e3c52: IDEA-100046 BuildConfig.DEBUG shouldn't be marked as always true/false
Change-Id: I890945feb64f12547d3301807deb95120150283a
diff --git a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
index 8a5150b..858c86e 100644
--- a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
+++ b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
@@ -37,6 +37,7 @@
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.HashMap;
+import com.intellij.util.execution.ParametersListUtil;
import org.jetbrains.android.AndroidCommonBundle;
import org.jetbrains.android.sdk.MessageBuildingSdkLog;
import org.jetbrains.annotations.NonNls;
@@ -356,6 +357,8 @@
public static Map<AndroidCompilerMessageKind, List<String>> launchProguard(@NotNull IAndroidTarget target,
int sdkToolsRevision,
@NotNull String sdkOsPath,
+ @NotNull String javaExecutablePath,
+ @NotNull String proguardVmOptions,
@NotNull String[] proguardConfigFileOsPaths,
boolean includeSystemProguardFile,
@NotNull String inputJarOsPath,
@@ -363,11 +366,15 @@
@NotNull String outputJarFileOsPath,
@Nullable String logDirOutputOsPath) throws IOException {
final List<String> commands = new ArrayList<String>();
- final String toolOsPath = sdkOsPath + File.separator + SdkConstants.OS_SDK_TOOLS_PROGUARD_BIN_FOLDER + SdkConstants.FN_PROGUARD;
- commands.add(toolOsPath);
+ commands.add(javaExecutablePath);
+ if (proguardVmOptions.length() > 0) {
+ commands.addAll(ParametersListUtil.parse(proguardVmOptions));
+ }
+ commands.add("-jar");
final String proguardHome = sdkOsPath + File.separator + SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_PROGUARD;
-
+ final String proguardJarOsPath = proguardHome + File.separator + "lib" + File.separator + "proguard.jar";
+ commands.add(proguardJarOsPath);
final String systemProguardCfgPath = proguardHome + File.separator + SYSTEM_PROGUARD_CFG_FILE_NAME;
if (isIncludingInProguardSupported(sdkToolsRevision)) {
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java b/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
index e22abb6..943f4be 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
@@ -301,18 +301,13 @@
context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.WARNING,
AndroidJpsBundle.message("android.jps.cannot.delete.file", outFilePath)));
}
+ final String javaExecutable = getJavaExecutable(platform, context, builderName);
- final JpsSdk<JpsSimpleElement<JpsAndroidSdkProperties>> sdk = platform.getSdk();
- final String jdkName = sdk.getSdkProperties().getData().getJdkName();
- final JpsLibrary javaSdk = context.getProjectDescriptor().getModel().getGlobal().getLibraryCollection().findLibrary(jdkName);
- if (javaSdk == null || !javaSdk.getType().equals(JpsJavaSdkType.INSTANCE)) {
- context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.ERROR,
- AndroidJpsBundle.message("android.jps.errors.java.sdk.not.specified", jdkName)));
+ if (javaExecutable == null) {
return false;
}
-
final List<String> commandLine = ExternalProcessUtil
- .buildJavaCommandLine(JpsJavaSdkType.getJavaExecutable((JpsSdk<?>)javaSdk.getProperties()), AndroidDxRunner.class.getName(),
+ .buildJavaCommandLine(javaExecutable, AndroidDxRunner.class.getName(),
Collections.<String>emptyList(), classPath, vmOptions, programParamList);
LOG.info(AndroidCommonUtils.command2string(commandLine));
@@ -364,6 +359,18 @@
}
@Nullable
+ private static String getJavaExecutable(@NotNull AndroidPlatform platform, @NotNull CompileContext context, @NotNull String builderName) {
+ final JpsSdk<JpsSimpleElement<JpsAndroidSdkProperties>> sdk = platform.getSdk();
+ final String jdkName = sdk.getSdkProperties().getData().getJdkName();
+ final JpsLibrary javaSdk = context.getProjectDescriptor().getModel().getGlobal().getLibraryCollection().findLibrary(jdkName);
+ if (javaSdk == null || !javaSdk.getType().equals(JpsJavaSdkType.INSTANCE)) {
+ context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.ERROR,
+ AndroidJpsBundle.message("android.jps.errors.java.sdk.not.specified", jdkName)));
+ return null;
+ }
+ return JpsJavaSdkType.getJavaExecutable((JpsSdk<?>)javaSdk.getProperties());
+ }
+
private static Pair<Boolean, AndroidProGuardStateStorage.MyState>
runProguardIfNecessary(@NotNull JpsAndroidModuleExtension extension,
@NotNull AndroidDexBuildTarget target,
@@ -395,6 +402,11 @@
return null;
}
+ final String javaExecutable = getJavaExecutable(platform, context, PRO_GUARD_BUILDER_NAME);
+ if (javaExecutable == null) {
+ return null;
+ }
+
final String logsDirOsPath =
FileUtil.toSystemDependentName(mainContentRoot.getPath() + '/' + AndroidCommonUtils.DIRECTORY_FOR_LOGS_NAME);
final AndroidProGuardStateStorage.MyState newState = new AndroidProGuardStateStorage.MyState(
@@ -455,13 +467,18 @@
return null;
}
}
-
+ final JpsAndroidDexCompilerConfiguration configuration =
+ JpsAndroidExtensionService.getInstance().getDexCompilerConfiguration(module.getProject());
+ String proguardVmOptions = configuration != null ? configuration.getProguardVmOptions() : null;
+ if (proguardVmOptions == null) {
+ proguardVmOptions = "";
+ }
context.processMessage(new ProgressMessage(AndroidJpsBundle.message("android.jps.progress.proguard", module.getName())));
final Map<AndroidCompilerMessageKind, List<String>> messages =
AndroidCommonUtils.launchProguard(platform.getTarget(), platform.getSdkToolsRevision(), platform.getSdk().getHomePath(),
- proguardCfgPaths, includeSystemProguardCfg, inputJarOsPath, externalJarOsPaths,
- outputJarPath, logsDirOsPath);
+ javaExecutable, proguardVmOptions, proguardCfgPaths, includeSystemProguardCfg, inputJarOsPath,
+ externalJarOsPaths, outputJarPath, logsDirOsPath);
AndroidJpsUtil.addMessages(context, messages, PRO_GUARD_BUILDER_NAME, module.getName());
return messages.get(AndroidCompilerMessageKind.ERROR).isEmpty()
? Pair.create(true, newState) : null;
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java b/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
index 6668beb..9b8ca8c 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
@@ -48,6 +48,7 @@
out.println(c.isOptimize());
out.println(c.isForceJumbo());
out.println(c.isCoreLibrary());
+ out.println(c.getProguardVmOptions());
}
}
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java b/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
index ade7831..e12f3d6 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
@@ -25,4 +25,8 @@
boolean isCoreLibrary();
void setCoreLibrary(boolean value);
+
+ String getProguardVmOptions();
+
+ void setProguardVmOptions(String value);
}
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java b/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
index addc9bd..60afac0 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
@@ -26,6 +26,7 @@
myState.VM_OPTIONS = state.VM_OPTIONS;
myState.FORCE_JUMBO = state.FORCE_JUMBO;
myState.CORE_LIBRARY = state.CORE_LIBRARY;
+ myState.PROGUARD_VM_OPTIONS = state.PROGUARD_VM_OPTIONS;
}
@Override
@@ -93,6 +94,19 @@
}
}
+ @Override
+ public String getProguardVmOptions() {
+ return myState.PROGUARD_VM_OPTIONS;
+ }
+
+ @Override
+ public void setProguardVmOptions(String value) {
+ if (!myState.PROGUARD_VM_OPTIONS.equals(value)) {
+ myState.PROGUARD_VM_OPTIONS = value;
+ fireElementChanged();
+ }
+ }
+
@NotNull
@Override
public JpsAndroidDexCompilerConfigurationImpl createCopy() {
@@ -106,6 +120,7 @@
setOptimize(modified.isOptimize());
setForceJumbo(modified.isForceJumbo());
setCoreLibrary(modified.isCoreLibrary());
+ setProguardVmOptions(modified.getProguardVmOptions());
}
@NotNull
@@ -115,6 +130,7 @@
public static class MyState {
public String VM_OPTIONS = "";
+ public String PROGUARD_VM_OPTIONS = "";
public int MAX_HEAP_SIZE = 1024;
public boolean OPTIMIZE = true;
public boolean FORCE_JUMBO = false;
diff --git a/android/jps-plugin/testData/4/expected_log_4.txt b/android/jps-plugin/testData/4/expected_log_4.txt
index f1b9ca1..421c77f 100644
--- a/android/jps-plugin/testData/4/expected_log_4.txt
+++ b/android/jps-plugin/testData/4/expected_log_4.txt
@@ -14,7 +14,9 @@
$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/proguard.txt
______ENTRY_1:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
-include
$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
-include
diff --git a/android/jps-plugin/testData/4/expected_log_5.txt b/android/jps-plugin/testData/4/expected_log_5.txt
new file mode 100644
index 0000000..282d354
--- /dev/null
+++ b/android/jps-plugin/testData/4/expected_log_5.txt
@@ -0,0 +1,56 @@
+______ENTRY_0:
+$JAVA_PATH$
+-Xmx700M
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
+-include
+$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
+-include
+$PROJECT_DIR$/root/proguard-project.txt
+-include
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/proguard.txt
+-injars
+$PROGUARD_INPUT_JAR$
+-outjars
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/obfuscated_sources.jar
+-libraryjars
+$ANDROID_SDK_DIR$/platforms/android-1.5/android.jar
+-dump
+$PROJECT_DIR$/root/proguard_logs/dump.txt
+-printseeds
+$PROJECT_DIR$/root/proguard_logs/seeds.txt
+-printusage
+$PROJECT_DIR$/root/proguard_logs/usage.txt
+-printmapping
+$PROJECT_DIR$/root/proguard_logs/mapping.txt
+env: PROGUARD_HOME=$ANDROID_SDK_DIR$/tools/proguard
+
+______ENTRY_1:0
+$JAVA_PATH$
+-Xmx1024M
+-classpath
+$IDEA_RT_PATH$
+com.intellij.rt.execution.CommandLineWrapper
+$CLASSPATH_TMP$
+org.jetbrains.android.compiler.tools.AndroidDxRunner
+$ANDROID_SDK_DIR$/platform-tools/lib/dx.jar
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/classes.dex
+--optimize
+true
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/obfuscated_sources.jar
+--exclude
+
+______ENTRY_2:0,1
+apk_builder
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/module.apk.res
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/classes.dex
+[
+$PROJECT_DIR$/out/production/java_module
+$PROJECT_DIR$/out/production/module
+]
+[]
+[]
+[]
+$PROJECT_DIR$/out/production/module/module.apk
+false
+$ANDROID_SDK_DIR$
\ No newline at end of file
diff --git a/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt b/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
index f874218..c447ff3 100644
--- a/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
+++ b/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
@@ -55,7 +55,9 @@
--exclude
______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
-include
$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
-include
diff --git a/android/jps-plugin/testData/proGuardWithJar/expected_log.txt b/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
index a290543..88b9b69 100644
--- a/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
@@ -55,7 +55,9 @@
--exclude
______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
-include
$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
-include
diff --git a/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt b/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
index b58b2d2..0dd8e48 100644
--- a/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
@@ -40,7 +40,9 @@
$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/module.apk.res
______ENTRY_3:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
-include
$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
-include
diff --git a/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt b/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
index f874218..c447ff3 100644
--- a/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
@@ -55,7 +55,9 @@
--exclude
______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
-include
$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
-include
diff --git a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
index 4268686..8deef21 100644
--- a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
+++ b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
@@ -446,6 +446,15 @@
checkBuildLog(executor, "expected_log_4");
assertEquals(Collections.singleton("proguard_input_jar"), executor.getCheckedJars());
checkMakeUpToDate(executor);
+
+ final JpsAndroidExtensionService service = JpsAndroidExtensionService.getInstance();
+ final JpsAndroidDexCompilerConfiguration c = service.getDexCompilerConfiguration(myProject);
+ assertNotNull(c);
+ service.setDexCompilerConfiguration(myProject, c);
+ c.setProguardVmOptions("-Xmx700M");
+ makeAll();
+ checkBuildLog(executor, "expected_log_5");
+ checkMakeUpToDate(executor);
}
public void test5() throws Exception {
diff --git a/android/resources/messages/AndroidBundle.properties b/android/resources/messages/AndroidBundle.properties
index 1f2f34e..ee36617 100644
--- a/android/resources/messages/AndroidBundle.properties
+++ b/android/resources/messages/AndroidBundle.properties
@@ -207,7 +207,8 @@
android.ddms.disabled.error=You have to enable ADB integration to launch debugging. Do you want to do that?
android.ddms.disabled.dialog.title=ADB Integration Disabled
android.dex.compiler.vm.options.title=Android DX Compiler VM Options
-android.dex.compiler.configurable.display.name=Android DX Compiler
+android.proguard.vm.options.title=Android ProGuard VM Options
+android.dex.compiler.configurable.display.name=Android Tools
android.run.configuration.general.tab.title=General
android.run.configuration.emulator.tab.title=Emulator
android.run.configuration.logcat.tab.title=Logcat
@@ -509,7 +510,7 @@
android.facet.importing.notification.group=Importing Error
android.facet.importing.title=Error when importing module ''{0}''
android.find.style.applications.title=Use Style Where Possible
-android.aapt.use.custom.package.name=Rename manifest pac&kag\:
+android.aapt.use.custom.package.name=Rename manifest pac&kage\:
android.wizard.cannot.find.main.content.root.error=Cannot find content root containing AndroidManifest.xml file in module {0}
android.9patch.file.type.description=Android 9-patch Files
android.update.project.properties.dialog.text=The structure of following Android modules was changed:<br>{0}<br>Would you like to update related project.properties files?<br>\
diff --git a/android/src/META-INF/plugin.xml b/android/src/META-INF/plugin.xml
index 37d1d69..90d5513 100755
--- a/android/src/META-INF/plugin.xml
+++ b/android/src/META-INF/plugin.xml
@@ -474,6 +474,7 @@
<codeInsight.lineMarkerProvider language="JAVA" implementationClass="org.jetbrains.android.AndroidLineMarkerProvider"/>
<implicitUsageProvider implementation="org.jetbrains.android.AndroidImplicitUsagesProvider"/>
<xml.completionExtension implementation="org.jetbrains.android.dom.AndroidXmlCompletionExtension"/>
+ <spellchecker.support language="XML" implementationClass="org.jetbrains.android.spellchecker.AndroidXmlSpellcheckingStrategy" order="before xml"/>
</extensions>
<extensionPoints>
diff --git a/android/src/com/android/tools/idea/actions/JavaSourceAction.java b/android/src/com/android/tools/idea/actions/JavaSourceAction.java
index 3d7726c..eae29b4 100644
--- a/android/src/com/android/tools/idea/actions/JavaSourceAction.java
+++ b/android/src/com/android/tools/idea/actions/JavaSourceAction.java
@@ -26,6 +26,7 @@
import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiDirectory;
import org.jetbrains.android.facet.AndroidFacet;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import javax.swing.*;
@@ -51,7 +52,7 @@
final JavaDirectoryService dirService = JavaDirectoryService.getInstance();
for (PsiDirectory dir : view.getDirectories()) {
- if (projectIndex.isInSourceContent(dir.getVirtualFile()) &&
+ if (projectIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) &&
dirService.getPackage(dir) != null &&
!dirService.getPackage(dir).getQualifiedName().isEmpty()) {
return true;
diff --git a/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java b/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
index 7b1b690..42308cf 100644
--- a/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
+++ b/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
@@ -2,6 +2,7 @@
import com.intellij.codeInsight.daemon.ImplicitUsageProvider;
import com.intellij.psi.*;
+import com.intellij.psi.util.InheritanceUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidUtils;
@@ -11,7 +12,21 @@
public class AndroidImplicitUsagesProvider implements ImplicitUsageProvider {
@Override
public boolean isImplicitUsage(PsiElement element) {
- return false;
+ if (!(element instanceof PsiField)) {
+ return false;
+ }
+ final PsiField field = (PsiField)element;
+
+ if (!"CREATOR".equals(field.getName())) {
+ return false;
+ }
+ final PsiModifierList modifierList = field.getModifierList();
+
+ if (modifierList == null || !modifierList.hasModifierProperty(PsiModifier.STATIC)) {
+ return false;
+ }
+ final PsiClass aClass = field.getContainingClass();
+ return aClass != null && InheritanceUtil.isInheritor(aClass, "android.os.Parcelable");
}
@Override
diff --git a/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java b/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
index 5e65e9a..799184a 100644
--- a/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
+++ b/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
@@ -30,6 +30,7 @@
import icons.AndroidIcons;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidBundle;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
/**
* @author Eugene.Kudelevsky
@@ -60,7 +61,7 @@
final JavaDirectoryService dirService = JavaDirectoryService.getInstance();
for (PsiDirectory dir : view.getDirectories()) {
- if (projectIndex.isInSourceContent(dir.getVirtualFile()) &&
+ if (projectIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) &&
dirService.getPackage(dir) != null) {
return true;
}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
index 5b24a17..d641730 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
@@ -160,18 +160,11 @@
return;
}
- // doesn't matter, because autogenerated class is used for resolve/completion only
- final boolean debug = true;
- final BuildConfigGenerator generator = new BuildConfigGenerator(item.mySourceRootOsPath, item.myPackage, debug);
try {
- try {
- generator.generate();
- }
- catch (RuntimeException e) {
- // todo: report to context
- LOG.debug(e);
- return;
- }
+ // hack for IDEA-100046: we need to avoid reporting "condition is always 'true'
+ // from data flow inspection, so use non-constant value here
+ generateStubClass(item.myPackage, new File(item.mySourceRootOsPath), "BuildConfig",
+ " public final static boolean DEBUG = Boolean.parseBoolean(null);\n");
final VirtualFile genSourceRoot = LocalFileSystem.getInstance().findFileByPath(item.mySourceRootOsPath);
if (genSourceRoot != null) {
@@ -183,7 +176,7 @@
item.mySourceRootOsPath + '/' + item.myPackage.replace('.', '/') + '/' + BuildConfigGenerator.BUILD_CONFIG_NAME);
if (genFile != null && genFile.exists()) {
- patchAndMarkGeneratedFile(facet, AndroidAutogeneratorMode.BUILDCONFIG, genFile);
+ facet.markFileAutogenerated(AndroidAutogeneratorMode.BUILDCONFIG, genFile);
}
}
catch (final IOException e) {
@@ -358,23 +351,28 @@
assert aPackage.length() > 0;
for (String className : classNames) {
- final File packageDir = new File(outputDir.getPath() + '/' + aPackage.replace('.', '/'));
- if (!packageDir.exists() && !packageDir.mkdirs()) {
- throw new IOException("Cannot create directory " + FileUtil.toSystemDependentName(packageDir.getPath()));
- }
- final BufferedWriter writer = new BufferedWriter(new FileWriter(new File(packageDir, className + ".java")));
- try {
- writer.write(
- AndroidCommonUtils.AUTOGENERATED_JAVA_FILE_HEADER +
- "\n\npackage " + aPackage + ";\n\n" +
- "/* This stub is only used by the IDE. It is NOT the " + className + " class actually packed into the APK */\n" +
- "public final class " + className + " {\n" +
- "}"
- );
- }
- finally {
- writer.close();
- }
+ generateStubClass(aPackage, outputDir, className, "");
+ }
+ }
+
+ private static void generateStubClass(String aPackage, File outputDir, String className, String content) throws IOException {
+ final File packageDir = new File(outputDir.getPath() + '/' + aPackage.replace('.', '/'));
+ if (!packageDir.exists() && !packageDir.mkdirs()) {
+ throw new IOException("Cannot create directory " + FileUtil.toSystemDependentName(packageDir.getPath()));
+ }
+ final BufferedWriter writer = new BufferedWriter(new FileWriter(new File(packageDir, className + ".java")));
+ try {
+ writer.write(
+ AndroidCommonUtils.AUTOGENERATED_JAVA_FILE_HEADER +
+ "\n\npackage " + aPackage + ";\n\n" +
+ "/* This stub is only used by the IDE. It is NOT the " + className + " class actually packed into the APK */\n" +
+ "public final class " + className + " {\n" +
+ content +
+ "}"
+ );
+ }
+ finally {
+ writer.close();
}
}
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
index 60f43db..ad4143b 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
@@ -35,6 +35,7 @@
public boolean OPTIMIZE = true;
public boolean FORCE_JUMBO = false;
public boolean CORE_LIBRARY = false;
+ public String PROGUARD_VM_OPTIONS = "";
@Override
public AndroidDexCompilerConfiguration getState() {
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
index 00bff84..c1b2689 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.android.compiler.AndroidDexCompilerSettingsConfigurable">
- <grid id="27dc6" binding="myContentPanel" layout-manager="GridLayoutManager" row-count="6" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="27dc6" binding="myContentPanel" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="378" height="400"/>
@@ -8,71 +8,112 @@
<properties/>
<border type="none"/>
<children>
- <component id="74b9" class="javax.swing.JLabel">
+ <grid id="23587" layout-manager="GridLayoutManager" row-count="5" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
- <properties>
- <labelFor value="163dc"/>
- <text value="&Maximum heap size (MB):"/>
- </properties>
- </component>
- <hspacer id="a5efd">
- <constraints>
- <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- </hspacer>
+ <properties/>
+ <clientProperties>
+ <BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndentWithoutInsets"/>
+ </clientProperties>
+ <border type="etched" title="DEX"/>
+ <children>
+ <component id="74b9" class="javax.swing.JLabel">
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <labelFor value="163dc"/>
+ <text value="&Maximum heap size (MB):"/>
+ </properties>
+ </component>
+ <hspacer id="a5efd">
+ <constraints>
+ <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ </hspacer>
+ <component id="5c5d1" class="javax.swing.JLabel" binding="myVmOptionsLabel">
+ <constraints>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="&Additional VM options:"/>
+ </properties>
+ </component>
+ <component id="b3b7a" class="com.intellij.ui.RawCommandLineEditor" binding="myVmOptionsEditor">
+ <constraints>
+ <grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ </component>
+ <component id="163dc" class="javax.swing.JSpinner" binding="myHeapSizeSpinner">
+ <constraints>
+ <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false">
+ <preferred-size width="100" height="-1"/>
+ </grid>
+ </constraints>
+ <properties/>
+ </component>
+ <component id="a1a71" class="com.intellij.ui.components.JBCheckBox" binding="myOptimizeCheckBox">
+ <constraints>
+ <grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="&Optimize"/>
+ </properties>
+ </component>
+ <component id="4ee27" class="com.intellij.ui.components.JBCheckBox" binding="myJumboModeCheckBox">
+ <constraints>
+ <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Force &jumbo mode"/>
+ </properties>
+ </component>
+ <component id="4b4ef" class="com.intellij.ui.components.JBCheckBox" binding="myCoreLibraryCheckBox">
+ <constraints>
+ <grid row="4" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Add "--&core-library" flag"/>
+ </properties>
+ </component>
+ </children>
+ </grid>
<vspacer id="e6619">
<constraints>
- <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
- <component id="5c5d1" class="javax.swing.JLabel" binding="myVmOptionsLabel">
+ <grid id="77ae5" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="&Additional VM options:"/>
- </properties>
- </component>
- <component id="b3b7a" class="com.intellij.ui.RawCommandLineEditor" binding="myVmOptionsEditor">
- <constraints>
- <grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
- </component>
- <component id="163dc" class="javax.swing.JSpinner" binding="myHeapSizeSpinner">
- <constraints>
- <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false">
- <preferred-size width="100" height="-1"/>
- </grid>
- </constraints>
- <properties/>
- </component>
- <component id="a1a71" class="com.intellij.ui.components.JBCheckBox" binding="myOptimizeCheckBox">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="&Optimize"/>
- </properties>
- </component>
- <component id="4ee27" class="com.intellij.ui.components.JBCheckBox" binding="myJumboModeCheckBox">
- <constraints>
- <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Force &jumbo mode"/>
- </properties>
- </component>
- <component id="4b4ef" class="com.intellij.ui.components.JBCheckBox" binding="myCoreLibraryCheckBox">
- <constraints>
- <grid row="4" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Add "--&core-library" flag"/>
- </properties>
- </component>
+ <clientProperties>
+ <BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndentWithoutInsets"/>
+ </clientProperties>
+ <border type="etched" title="ProGuard"/>
+ <children>
+ <component id="4150b" class="com.intellij.ui.components.JBLabel">
+ <constraints>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <labelFor value="b3d20"/>
+ <text value="&VM options:"/>
+ </properties>
+ </component>
+ <component id="b3d20" class="com.intellij.ui.RawCommandLineEditor" binding="myProguardVmOptionsEditor">
+ <constraints>
+ <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ </component>
+ </children>
+ </grid>
</children>
</grid>
</form>
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
index a49b152..d323c87 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
@@ -40,11 +40,13 @@
private JBCheckBox myOptimizeCheckBox;
private JBCheckBox myJumboModeCheckBox;
private JBCheckBox myCoreLibraryCheckBox;
+ private RawCommandLineEditor myProguardVmOptionsEditor;
public AndroidDexCompilerSettingsConfigurable(Project project) {
myConfig = AndroidDexCompilerConfiguration.getInstance(project);
myVmOptionsLabel.setLabelFor(myVmOptionsEditor);
myVmOptionsEditor.setDialogCaption(AndroidBundle.message("android.dex.compiler.vm.options.title"));
+ myProguardVmOptionsEditor.setDialogCaption(AndroidBundle.message("android.proguard.vm.options.title"));
}
@Nls
@@ -70,7 +72,8 @@
!myVmOptionsEditor.getText().equals(myConfig.VM_OPTIONS) ||
myOptimizeCheckBox.isSelected() != myConfig.OPTIMIZE ||
myJumboModeCheckBox.isSelected() != myConfig.FORCE_JUMBO ||
- myCoreLibraryCheckBox.isSelected() != myConfig.CORE_LIBRARY;
+ myCoreLibraryCheckBox.isSelected() != myConfig.CORE_LIBRARY ||
+ !myProguardVmOptionsEditor.getText().equals(myConfig.PROGUARD_VM_OPTIONS);
}
@Override
@@ -80,6 +83,7 @@
myConfig.OPTIMIZE = myOptimizeCheckBox.isSelected();
myConfig.FORCE_JUMBO = myJumboModeCheckBox.isSelected();
myConfig.CORE_LIBRARY = myCoreLibraryCheckBox.isSelected();
+ myConfig.PROGUARD_VM_OPTIONS = myProguardVmOptionsEditor.getText();
}
@Override
@@ -89,6 +93,7 @@
myOptimizeCheckBox.setSelected(myConfig.OPTIMIZE);
myJumboModeCheckBox.setSelected(myConfig.FORCE_JUMBO);
myCoreLibraryCheckBox.setSelected(myConfig.CORE_LIBRARY);
+ myProguardVmOptionsEditor.setText(myConfig.PROGUARD_VM_OPTIONS);
}
@Override
diff --git a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
index 05b539d..6688ebe 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
@@ -9,7 +9,11 @@
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.projectRoots.JavaSdkType;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkTypeId;
import com.intellij.openapi.roots.CompilerModuleExtension;
+import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.io.FileUtil;
@@ -153,6 +157,21 @@
});
}
+ @Nullable
+ private static String getJavaExecutablePath(@NotNull Module module) {
+ final Sdk sdk = ModuleRootManager.getInstance(module).getSdk();
+
+ if (sdk == null) {
+ return null;
+ }
+ final SdkTypeId sdkType = sdk.getSdkType();
+
+ if (!(sdkType instanceof JavaSdkType)) {
+ return null;
+ }
+ return ((JavaSdkType)sdkType).getVMExecutablePath(sdk);
+ }
+
@Override
public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
final List<ProcessingItem> processedItems = new ArrayList<ProcessingItem>();
@@ -163,6 +182,13 @@
if (!AndroidCompileUtil.isModuleAffected(context, processingItem.myModule)) {
continue;
}
+ final Module module = ((MyProcessingItem)item).getModule();
+ final String javaExecutablePath = getJavaExecutablePath(module);
+
+ if (javaExecutablePath == null) {
+ context.addMessage(CompilerMessageCategory.ERROR, "Cannot find Java SDK for module " + module.getName(), null, -1, -1);
+ continue;
+ }
final List<VirtualFile> cfgFiles = processingItem.getProguardConfigFiles();
final String[] proguardCfgOsPaths = AndroidCompileUtil.toOsPaths(cfgFiles.toArray(new VirtualFile[cfgFiles.size()]));
@@ -176,7 +202,7 @@
final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
AndroidCommonUtils.launchProguard(processingItem.getTarget(), processingItem.getSdkToolsRevision(),
- processingItem.getSdkOsPath(), proguardCfgOsPaths,
+ processingItem.getSdkOsPath(), javaExecutablePath, "", proguardCfgOsPaths,
processingItem.isIncludeSystemProguardFile(), inputJarOsPath, externalJarOsPaths,
processingItem.getOutputJarOsPath(), logsDirOsPath));
diff --git a/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java b/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
index faa4065..323a060 100644
--- a/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
+++ b/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
@@ -217,6 +217,21 @@
}
@Override
+ public boolean keepWhiteSpacesInsideTag(XmlTag tag) {
+ if (super.keepWhiteSpacesInsideTag(tag)) {
+ return true;
+ }
+
+ while (tag != null) {
+ if ("string".equals(tag.getName())) {
+ return true;
+ }
+ tag = tag.getParentTag();
+ }
+ return false;
+ }
+
+ @Override
public boolean insertLineBreakBeforeTag(XmlTag xmlTag) {
if (!INSERT_LINE_BREAKS_AROUND_STYLE) {
return false;
diff --git a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
index 226d2f5..d7d2602 100644
--- a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
+++ b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
@@ -55,6 +55,8 @@
rules.add(attrArrangementRule(".*:layout_width", SdkConstants.NS_RESOURCES, KEEP));
rules.add(attrArrangementRule(".*:layout_height", SdkConstants.NS_RESOURCES, KEEP));
rules.add(attrArrangementRule(".*:layout_.*", SdkConstants.NS_RESOURCES, BY_NAME));
+ rules.add(attrArrangementRule(".*:width", SdkConstants.NS_RESOURCES, BY_NAME));
+ rules.add(attrArrangementRule(".*:height", SdkConstants.NS_RESOURCES, BY_NAME));
rules.add(attrArrangementRule(".*", SdkConstants.NS_RESOURCES, BY_NAME));
rules.add(attrArrangementRule(".*", ".*", BY_NAME));
// TODO: Should sort name:"color",namespace:"" to the end (primarily for color state lists)
diff --git a/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java b/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
index ce16ae8..7de3cbe 100644
--- a/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
+++ b/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
@@ -103,9 +103,12 @@
final ContentManager contentManager = toolWindow.getContentManager();
Content c = contentManager.getFactory().createContent(layoutUi.getComponent(), "DDMS", true);
+
// Store a reference to the logcat view, so that this view can be retrieved directly from
// the DDMS tool window. (e.g. to clear logcat before a launch)
+ // add possibility to access logcat view externally in the future
c.putUserData(AndroidLogcatView.ANDROID_LOGCAT_VIEW_KEY, logcatView);
+
contentManager.addContent(c);
ApplicationManager.getApplication().invokeLater(new Runnable() {
diff --git a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
index 594246f..32f20ee 100644
--- a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
+++ b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
@@ -91,6 +91,8 @@
private static final Key<Boolean> DELETE_OBSOLETE_MODULE_TASK_KEY = Key.create("DELETE_OBSOLETE_MODULE_TASK");
+ private static final Key<Boolean> CLEAR_RESOLVED_APKLIBS_TASK_KEY = Key.create("CLEAR_RESOLVED_APKLIBS");
+
public AndroidFacetImporterBase(@NotNull String pluginId) {
super("com.jayway.maven.plugins.android.generation2", pluginId, FacetType.findInstance(AndroidFacetType.class));
}
@@ -171,6 +173,16 @@
project.putUserData(DELETE_OBSOLETE_MODULE_TASK_KEY, Boolean.TRUE);
postTasks.add(new MyDeleteObsoleteApklibModulesTask(project));
+ project.putUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY, Boolean.TRUE);
+ postTasks.add(new MavenProjectsProcessorTask() {
+ @Override
+ public void perform(Project project, MavenEmbeddersManager embeddersManager,
+ MavenConsole console, MavenProgressIndicator indicator)
+ throws MavenProcessCanceledException {
+ clearResolvedApklibsInfo(project);
+ }
+ });
+
// exclude folders where Maven generates sources if gen source roots were changed by user manually
final AndroidFacetConfiguration defaultConfig = new AndroidFacetConfiguration();
AndroidMavenProviderImpl.setPathsToDefault(mavenProject, module, defaultConfig);
@@ -190,6 +202,25 @@
}
}
+ private static void clearResolvedApklibsInfo(final Project project) {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (project.isDisposed() || project.getUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY) != Boolean.TRUE) {
+ return;
+ }
+ project.putUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY, null);
+ final AndroidExternalApklibDependenciesManager.State state =
+ AndroidExternalApklibDependenciesManager.getInstance(project).getState();
+
+ if (state != null) {
+ state.getResolvedInfoMap().clear();
+ state.getArtifactFilesMap().clear();
+ }
+ }
+ });
+ }
+
private void importNativeDependencies(@NotNull AndroidFacet facet, @NotNull MavenProject mavenProject, @NotNull String moduleDirPath) {
final List<AndroidNativeLibData> additionalNativeLibs = new ArrayList<AndroidNativeLibData>();
final String localRepository = MavenProjectsManager.getInstance(facet.getModule().getProject()).getLocalRepository().getPath();
diff --git a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
index 72a9e3b..f672792 100755
--- a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
+++ b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
@@ -133,6 +133,7 @@
AndroidRunningState state = super.getState(executor, env);
if (state != null) {
state.setDeploy(DEPLOY);
+ state.setOpenLogcatAutomatically(true);
}
return state;
}
diff --git a/android/src/org/jetbrains/android/run/AndroidRunningState.java b/android/src/org/jetbrains/android/run/AndroidRunningState.java
index 56b5a49..2c55f7d 100644
--- a/android/src/org/jetbrains/android/run/AndroidRunningState.java
+++ b/android/src/org/jetbrains/android/run/AndroidRunningState.java
@@ -136,6 +136,7 @@
private volatile String myAvdName;
private volatile boolean myDebugMode;
+ private volatile boolean myOpenLogcatAutomatically;
private volatile DebugLauncher myDebugLauncher;
@@ -782,6 +783,10 @@
}
}
+ public void setOpenLogcatAutomatically(boolean openLogcatAutomatically) {
+ myOpenLogcatAutomatically = openLogcatAutomatically;
+ }
+
private boolean doPrepareAndStart(IDevice device) {
if (myClearLogcatBeforeStart) {
clearLogcatAndConsole(getModule().getProject(), device);
@@ -841,6 +846,16 @@
}
}
}
+ if (!myDebugMode && myOpenLogcatAutomatically) {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ final ToolWindow androidToolWindow = ToolWindowManager.getInstance(myEnv.getProject()).
+ getToolWindow(AndroidToolWindowFactory.TOOL_WINDOW_ID);
+ androidToolWindow.activate(null, false);
+ }
+ });
+ }
return true;
}
catch (TimeoutException e) {
diff --git a/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java b/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
index 60e361c..d1e6500 100644
--- a/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
+++ b/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
@@ -194,7 +194,7 @@
return packageName != null && packageName.equals(configuration.PACKAGE_NAME);
case AndroidTestRunConfiguration.TEST_CLASS:
- return className != null && className.equals(configuration.CLASS_NAME);
+ return elementMethod == null && className != null && className.equals(configuration.CLASS_NAME);
case AndroidTestRunConfiguration.TEST_METHOD:
return methodName != null && methodName.equals(configuration.METHOD_NAME);
diff --git a/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java b/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java
new file mode 100644
index 0000000..dfb38e5
--- /dev/null
+++ b/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java
@@ -0,0 +1,114 @@
+package org.jetbrains.android.spellchecker;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.xml.XmlAttribute;
+import com.intellij.psi.xml.XmlAttributeValue;
+import com.intellij.psi.xml.XmlTag;
+import com.intellij.spellchecker.inspections.TextSplitter;
+import com.intellij.spellchecker.tokenizer.TokenConsumer;
+import com.intellij.spellchecker.tokenizer.Tokenizer;
+import com.intellij.spellchecker.xml.XmlSpellcheckingStrategy;
+import com.intellij.util.xml.Converter;
+import com.intellij.util.xml.DomElement;
+import com.intellij.util.xml.DomManager;
+import com.intellij.util.xml.GenericAttributeValue;
+import org.jetbrains.android.dom.AndroidDomElement;
+import org.jetbrains.android.dom.converters.AndroidPackageConverter;
+import org.jetbrains.android.dom.converters.AndroidResourceReferenceBase;
+import org.jetbrains.android.dom.converters.ConstantFieldConverter;
+import org.jetbrains.android.dom.converters.ResourceReferenceConverter;
+import org.jetbrains.android.dom.resources.ResourceNameConverter;
+import org.jetbrains.android.util.AndroidResourceUtil;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class AndroidXmlSpellcheckingStrategy extends XmlSpellcheckingStrategy {
+ private final MyResourceReferenceTokenizer myResourceReferenceTokenizer = new MyResourceReferenceTokenizer();
+
+ private final Tokenizer<XmlAttributeValue> myAttributeValueRenamingTokenizer = new Tokenizer<XmlAttributeValue>() {
+ @Override
+ public void tokenize(@NotNull XmlAttributeValue element, TokenConsumer consumer) {
+ consumer.consumeToken(element, true, TextSplitter.getInstance());
+ }
+ };
+
+ @NotNull
+ @Override
+ public Tokenizer getTokenizer(PsiElement element) {
+ assert element instanceof XmlAttributeValue;
+
+ if (AndroidResourceUtil.isIdDeclaration((XmlAttributeValue)element)) {
+ return myAttributeValueRenamingTokenizer;
+ }
+ final PsiElement parent = element.getParent();
+
+ if (parent instanceof XmlAttribute) {
+ final String value = ((XmlAttribute)parent).getValue();
+
+ if (value != null) {
+ final GenericAttributeValue domValue = DomManager.getDomManager(
+ parent.getProject()).getDomElement((XmlAttribute)parent);
+
+ if (domValue != null) {
+ final Converter converter = domValue.getConverter();
+
+ if (converter instanceof ResourceReferenceConverter) {
+ return myResourceReferenceTokenizer;
+ }
+ else if (converter instanceof ConstantFieldConverter) {
+ return EMPTY_TOKENIZER;
+ }
+ else if (converter instanceof ResourceNameConverter || converter instanceof AndroidPackageConverter) {
+ return myAttributeValueRenamingTokenizer;
+ }
+ }
+ }
+ }
+ return super.getTokenizer(element);
+ }
+
+ @Override
+ public boolean isMyContext(@NotNull PsiElement element) {
+ if (!super.isMyContext(element)) {
+ return false;
+ }
+ if (!(element instanceof XmlAttributeValue)) {
+ return false;
+ }
+ PsiElement parent = element.getParent();
+ parent = parent != null ? parent.getParent() : null;
+
+ if (!(parent instanceof XmlTag)) {
+ return false;
+ }
+ final DomElement domElement = DomManager.getDomManager(
+ element.getProject()).getDomElement((XmlTag)parent);
+ return domElement instanceof AndroidDomElement;
+ }
+
+ private static class MyResourceReferenceTokenizer extends XmlAttributeValueTokenizer {
+ private static AndroidResourceReferenceBase findResourceReference(PsiElement element) {
+ for (PsiReference reference : element.getReferences()) {
+ if (reference instanceof AndroidResourceReferenceBase) {
+ return (AndroidResourceReferenceBase)reference;
+ }
+ }
+ return null;
+ }
+
+ public void tokenize(@NotNull final XmlAttributeValue element, final TokenConsumer consumer) {
+ final AndroidResourceReferenceBase reference = findResourceReference(element);
+
+ if (reference != null) {
+ if (reference.getResourceValue().getPackage() == null) {
+ consumer.consumeToken(element, true, TextSplitter.getInstance());
+ }
+ return;
+ }
+ super.tokenize(element, consumer);
+ }
+ }
+}
diff --git a/android/testData/dom/layout/spellchecker.xml b/android/testData/dom/layout/spellchecker.xml
new file mode 100644
index 0000000..7e00c13
--- /dev/null
+++ b/android/testData/dom/layout/spellchecker.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/my_<TYPO>idddd</TYPO>"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@android:string/defaultMsisdnAlphaTag" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/my<TYPO>Msisdn</TYPO>AlphaTag" />
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="Hello <TYPO>Worlld</TYPO>" />
+</LinearLayout>
+
diff --git a/android/testData/dom/layout/spellcheckerQuickfix.xml b/android/testData/dom/layout/spellcheckerQuickfix.xml
new file mode 100644
index 0000000..8178c2a
--- /dev/null
+++ b/android/testData/dom/layout/spellcheckerQuickfix.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/myMsisdnAlphaTag" />
+</LinearLayout>
+
diff --git a/android/testData/dom/layout/spellchecker_resources.xml b/android/testData/dom/layout/spellchecker_resources.xml
new file mode 100644
index 0000000..19ca68b
--- /dev/null
+++ b/android/testData/dom/layout/spellchecker_resources.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="myMsisdnAlphaTag"></string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/dom/manifest/spellchecker1.xml b/android/testData/dom/manifest/spellchecker1.xml
new file mode 100644
index 0000000..b71c1ac
--- /dev/null
+++ b/android/testData/dom/manifest/spellchecker1.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="p1.<TYPO>alola</TYPO>">
+ <uses-permission android:name="android.permission.BRICKP"/>
+ <uses-permission android:name="android.permission.BIND_APPWIDGET"/>
+ <application>
+ </application>
+</manifest>
\ No newline at end of file
diff --git a/android/testData/dom/manifest/spellchecker2.xml b/android/testData/dom/manifest/spellchecker2.xml
new file mode 100644
index 0000000..b2d4ff5
--- /dev/null
+++ b/android/testData/dom/manifest/spellchecker2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="p1.alola">
+ <application>
+ </application>
+</manifest>
\ No newline at end of file
diff --git a/android/testData/dom/resources/spellchecker1.xml b/android/testData/dom/resources/spellchecker1.xml
new file mode 100644
index 0000000..18287ef
--- /dev/null
+++ b/android/testData/dom/resources/spellchecker1.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="hello_<TYPO>worlld</TYPO>">Hello, <TYPO>worlld</TYPO></string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/dom/resources/spellchecker2.xml b/android/testData/dom/resources/spellchecker2.xml
new file mode 100644
index 0000000..ececae8
--- /dev/null
+++ b/android/testData/dom/resources/spellchecker2.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="hello_worlld">Hello, world</string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/attributesArrangement1.xml b/android/testData/formatter/xml/attributesArrangement1.xml
index 64be50a..403b32a 100644
--- a/android/testData/formatter/xml/attributesArrangement1.xml
+++ b/android/testData/formatter/xml/attributesArrangement1.xml
@@ -13,6 +13,8 @@
<TextView
android:layout_height="wrap_content"
+ android:height="30dp"
android:text="Hello World, MyActivity"
- android:layout_width="fill_parent" />
+ android:width="30dp"
+ android:layout_width="fill_parent"/>
</LinearLayout>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/attributesArrangement1_after.xml b/android/testData/formatter/xml/attributesArrangement1_after.xml
index ba98f41..77c7b6b 100644
--- a/android/testData/formatter/xml/attributesArrangement1_after.xml
+++ b/android/testData/formatter/xml/attributesArrangement1_after.xml
@@ -14,5 +14,7 @@
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:text="Hello World, MyActivity" />
+ android:width="30dp"
+ android:height="30dp"
+ android:text="Hello World, MyActivity"/>
</LinearLayout>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/htmlInsideString.xml b/android/testData/formatter/xml/htmlInsideString.xml
new file mode 100644
index 0000000..16e8fe5
--- /dev/null
+++ b/android/testData/formatter/xml/htmlInsideString.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font>
+ \nAfter syncing to your phone, <p>your contacts</p> will be <div><font>available</font></div>\n
+ to you wherever you go.</string>
+</resources>
diff --git a/android/testData/formatter/xml/htmlInsideString_after.xml b/android/testData/formatter/xml/htmlInsideString_after.xml
new file mode 100644
index 0000000..16e8fe5
--- /dev/null
+++ b/android/testData/formatter/xml/htmlInsideString_after.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font>
+ \nAfter syncing to your phone, <p>your contacts</p> will be <div><font>available</font></div>\n
+ to you wherever you go.</string>
+</resources>
diff --git a/android/testData/javaHighlighting/Parcelable.java b/android/testData/javaHighlighting/Parcelable.java
new file mode 100644
index 0000000..ccdae2d
--- /dev/null
+++ b/android/testData/javaHighlighting/Parcelable.java
@@ -0,0 +1,39 @@
+package p1.p2;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class <warning>MyParcelable</warning> implements Parcelable {
+ public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() {
+ @Override
+ public MyParcelable createFromParcel(Parcel source) {
+ return new MyParcelable();
+ }
+
+ @Override
+ public MyParcelable[] newArray(int size) {
+ return new MyParcelable[size];
+ }
+ };
+
+ public static final Creator<MyParcelable> <warning>CREATOR1</warning> = new Creator<MyParcelable>() {
+ @Override
+ public MyParcelable createFromParcel(Parcel source) {
+ return new MyParcelable();
+ }
+
+ @Override
+ public MyParcelable[] newArray(int size) {
+ return new MyParcelable[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ }
+}
\ No newline at end of file
diff --git a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
index d9a902b..e9c7758 100644
--- a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
+++ b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
@@ -22,4 +22,5 @@
<string name="cancel">cancel</string>
<string name="private_str">private</string>
+ <string name="defaultMsisdnAlphaTag"></string>
</resources>
\ No newline at end of file
diff --git a/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java b/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
index d119c40..c778170 100644
--- a/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
@@ -1,5 +1,6 @@
package org.jetbrains.android;
+import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
import com.intellij.codeInspection.unusedSymbol.UnusedSymbolLocalInspection;
import com.intellij.openapi.vfs.VirtualFile;
@@ -20,4 +21,12 @@
myFixture.configureFromExistingVirtualFile(f);
myFixture.checkHighlighting(true, false, true);
}
+
+ public void testParcelable() throws Exception {
+ myFixture.enableInspections(new UnusedDeclarationInspection());
+ myFixture.enableInspections(UnusedSymbolLocalInspection.class);
+ final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".java", "src/p1/p2/MyParcelable.java");
+ myFixture.configureFromExistingVirtualFile(f);
+ myFixture.checkHighlighting(true, false, true);
+ }
}
diff --git a/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java b/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
index 34b57e2..0880e84 100644
--- a/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
@@ -154,6 +154,11 @@
doTestValues("values4.xml");
}
+ public void testHtmlInsideString() throws Exception {
+ new AndroidXmlPredefinedCodeStyle().apply(mySettings);
+ doTestValues(getTestName(true) + ".xml");
+ }
+
public void testSelector1() throws Exception {
new AndroidXmlPredefinedCodeStyle().apply(mySettings);
doTest("selector1.xml", "res/drawable/selector.xml");
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
index 54101a7..ff96e22 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
@@ -4,6 +4,7 @@
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.codeInsight.intention.IntentionAction;
+import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.application.ApplicationManager;
@@ -11,6 +12,9 @@
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
+import com.intellij.spellchecker.quickfixes.AcceptWordAsCorrect;
+import com.intellij.spellchecker.quickfixes.RenameTo;
import com.intellij.testFramework.UsefulTestCase;
import org.jetbrains.android.AndroidTestCase;
import org.jetbrains.android.inspections.AndroidDomInspection;
@@ -115,6 +119,16 @@
myFixture.checkResultByFile(testFolder + '/' + fileAfter);
}
+ protected void doTestSpellcheckerQuickFixes() throws IOException {
+ myFixture.enableInspections(SpellCheckingInspection.class);
+ VirtualFile virtualFile = copyFileToProject(getTestName(true) + ".xml");
+ myFixture.configureFromExistingVirtualFile(virtualFile);
+ final List<IntentionAction> fixes = highlightAndFindQuickFixes(null);
+ assertEquals(2, fixes.size());
+ assertInstanceOf(((QuickFixWrapper)fixes.get(0)).getFix(), RenameTo.class);
+ assertInstanceOf(((QuickFixWrapper)fixes.get(1)).getFix(), AcceptWordAsCorrect.class);
+ }
+
protected abstract String getPathToCopy(String testFileName);
protected VirtualFile copyFileToProject(String path) throws IOException {
@@ -162,7 +176,7 @@
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
- if (action.getClass() == aClass) {
+ if (aClass == null || action.getClass() == aClass) {
actions.add(action);
}
}
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
index 3b2fa82..33d9c7f 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
@@ -15,6 +15,7 @@
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.util.ThrowableRunnable;
@@ -279,7 +280,6 @@
VirtualFile file = copyFileToProject("tn1.xml");
myFixture.configureFromExistingVirtualFile(file);
myFixture.complete(CompletionType.BASIC);
- myFixture.type('\n');
myFixture.checkResultByFile(testFolder + '/' + "tn1_after.xml");
}
@@ -350,7 +350,10 @@
}
public void testTagNameCompletion2() throws Throwable {
- doTestCompletionVariants("tn2.xml", "EditText", "ExpandableListView", "ExtractEditText");
+ VirtualFile file = copyFileToProject("tn2.xml");
+ myFixture.configureFromExistingVirtualFile(file);
+ myFixture.complete(CompletionType.BASIC);
+ myFixture.assertPreferredCompletionItems(0, "EditText", "ExpandableListView", "ExtractEditText");
}
public void testTagNameCompletion3() throws Throwable {
@@ -984,6 +987,17 @@
assertEmpty(fixes);
}
+ public void testSpellchecker() throws Throwable {
+ myFixture.enableInspections(SpellCheckingInspection.class);
+ myFixture.copyFileToProject(testFolder + "/spellchecker_resources.xml", "res/values/sr.xml");
+ doTestHighlighting();
+ }
+
+ public void testSpellcheckerQuickfix() throws Throwable {
+ myFixture.copyFileToProject(testFolder + "/spellchecker_resources.xml", "res/values/sr.xml");
+ doTestSpellcheckerQuickFixes();
+ }
+
private void doTestAttrReferenceCompletion(String textToType) throws IOException {
copyFileToProject("attrReferences_attrs.xml", "res/values/attrReferences_attrs.xml");
VirtualFile file = copyFileToProject(getTestName(true) + ".xml");
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
index 8a5353a..a2560ea 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
@@ -6,6 +6,7 @@
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
import org.jetbrains.android.inspections.AndroidElementNotAllowedInspection;
import org.jetbrains.android.inspections.AndroidUnknownAttributeInspection;
@@ -322,6 +323,15 @@
doTestSdkVersionAttributeValueCompletion();
}
+ public void testSpellchecker1() throws Throwable {
+ myFixture.enableInspections(SpellCheckingInspection.class);
+ doTestHighlighting();
+ }
+ public void testSpellchecker2() throws Throwable {
+ doTestSpellcheckerQuickFixes();
+ }
+
+
private void doTestSdkVersionAttributeValueCompletion() throws Throwable {
final ProjectJdkTable projectJdkTable = ProjectJdkTable.getInstance();
final Sdk sdk = ModuleRootManager.getInstance(myModule).getSdk();
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
index 75763f1..61edfc2 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
@@ -36,6 +36,7 @@
import com.intellij.psi.xml.XmlTag;
import com.intellij.refactoring.actions.InlineAction;
import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper;
import org.jetbrains.android.inspections.CreateValueResourceQuickFix;
@@ -401,6 +402,15 @@
assertEquals(file, targetElement.getContainingFile().getVirtualFile());
}
+ public void testSpellchecker1() throws Throwable {
+ myFixture.enableInspections(SpellCheckingInspection.class);
+ doTestHighlighting();
+ }
+
+ public void testSpellchecker2() throws Throwable {
+ doTestSpellcheckerQuickFixes();
+ }
+
private void doCreateValueResourceFromUsage(VirtualFile virtualFile) {
myFixture.configureFromExistingVirtualFile(virtualFile);
final List<HighlightInfo> infos = myFixture.doHighlighting();