diff options
author | Alex Ruiz <alruiz@google.com> | 2015-05-02 15:44:48 -0700 |
---|---|---|
committer | Alex Ruiz <alruiz@google.com> | 2015-05-04 10:21:07 -0700 |
commit | bf9b375544dbe72c96f21ec016d68995a3f29a0c (patch) | |
tree | 85d4c41dbf1904c427d12a6221f3db8b34c7d7f7 | |
parent | 9158cfc2f4dc115b60a7e18c9cbcf8ceba85c1d9 (diff) | |
download | idea-bf9b375544dbe72c96f21ec016d68995a3f29a0c.tar.gz |
Now the IDE warns user if plugin has layout rendering issue.
Android plugin 1.2.0, 1.2.1 and 1.2.2 have a rendering
issue that has been fixed in 1.2.3 and has been reported
here
http://code.google.com/p/android/issues/detail?id=170841
This CL adds a warning, during project sync, if the project
is using a plugin with any of the versions listed above.
The warning is displayed in the "Sync Messages" view.
Change-Id: Ia8fa711a1d6ca417c0c96f29ab363986b3842567
8 files changed, 143 insertions, 87 deletions
diff --git a/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/GradleSyncTest.java b/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/GradleSyncTest.java index a3f2ee41519..642345d0cf4 100644 --- a/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/GradleSyncTest.java +++ b/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/GradleSyncTest.java @@ -96,6 +96,7 @@ import static com.android.tools.idea.tests.gui.framework.fixture.MessageDialogFi import static com.android.tools.idea.tests.gui.framework.fixture.MessagesToolWindowFixture.MessageMatcher.firstLineStartingWith; import static com.google.common.io.Files.write; import static com.intellij.ide.errorTreeView.ErrorTreeElementKind.ERROR; +import static com.intellij.ide.errorTreeView.ErrorTreeElementKind.WARNING; import static com.intellij.openapi.util.io.FileUtil.*; import static com.intellij.openapi.util.text.StringUtil.isEmpty; import static com.intellij.openapi.util.text.StringUtil.isNotEmpty; @@ -854,22 +855,9 @@ public class GradleSyncTest extends GuiTestCase { IdeFrameFixture projectFrame = openSimpleApplication(); - File projectPath = projectFrame.getProjectPath(); - File buildFile = new File(projectPath, FN_BUILD_GRADLE); - assertThat(buildFile).isFile(); - // Set the plugin version to 1.0.0. This version is incompatible with Gradle 2.4. // We expect the IDE to warn the user about this incompatibility. - String contents = Files.toString(buildFile, Charsets.UTF_8); - Pattern pattern = Pattern.compile("classpath ['\"]com.android.tools.build:gradle:(.+)['\"]"); - Matcher matcher = pattern.matcher(contents); - if (matcher.find()) { - contents = contents.substring(0, matcher.start(1)) + "1.0.0" + contents.substring(matcher.end(1)); - write(contents, buildFile, Charsets.UTF_8); - } - else { - fail("Cannot find declaration of Android plugin"); - } + updateAndroidModelVersion(projectFrame.getProjectPath(), "1.0.0"); projectFrame.useLocalGradleDistribution(gradleTwoDotFourHome) .requestProjectSync() @@ -938,7 +926,8 @@ public class GradleSyncTest extends GuiTestCase { DataNode<ProjectData> cache = getCachedProjectData(project); assertNotNull(cache); - List<DataNode<?>> cachedChildren = field("myChildren").ofType(new TypeRef<List<DataNode<?>>>(){}).in(cache).get(); + List<DataNode<?>> cachedChildren = field("myChildren").ofType(new TypeRef<List<DataNode<?>>>() { + }).in(cache).get(); assertThat(cachedChildren.size()).isGreaterThan(1); DataNode<?> toRemove = null; for (DataNode<?> child : cachedChildren) { @@ -961,6 +950,34 @@ public class GradleSyncTest extends GuiTestCase { projectFrame.requestProjectSync().waitForGradleProjectSyncToFinish(); } + // Verify that the IDE warns users about rendering issue when using plugin 1.2.0 to 1.2.2. + // See https://code.google.com/p/android/issues/detail?id=170841 + @Test + public void testModelWithLayoutRenderingIssue() throws IOException { + IdeFrameFixture projectFrame = openSimpleApplication(); + updateAndroidModelVersion(projectFrame.getProjectPath(), "1.2.0"); + projectFrame.requestProjectSync().waitForGradleProjectSyncToFinish(); + + AbstractContentFixture syncMessages = projectFrame.getMessagesToolWindow().getGradleSyncContent(); + syncMessages.findMessage(WARNING, firstLineStartingWith("Using an obsolete version of the Gradle plugin (1.2.0)")); + } + + private static void updateAndroidModelVersion(@NotNull File projectPath, @NotNull String modelVersion) throws IOException { + File buildFile = new File(projectPath, FN_BUILD_GRADLE); + assertThat(buildFile).isFile(); + + String contents = Files.toString(buildFile, Charsets.UTF_8); + Pattern pattern = Pattern.compile("classpath ['\"]com.android.tools.build:gradle:(.+)['\"]"); + Matcher matcher = pattern.matcher(contents); + if (matcher.find()) { + contents = contents.substring(0, matcher.start(1)) + modelVersion + contents.substring(matcher.end(1)); + write(contents, buildFile, Charsets.UTF_8); + } + else { + fail("Cannot find declaration of Android plugin"); + } + } + @NotNull private static String getUnsupportedGradleHome() { return getGradleHomeFromSystemProperty(UNSUPPORTED_GRADLE_HOME_PROPERTY, "2.1"); diff --git a/android/src/com/android/tools/idea/gradle/service/AndroidProjectDataService.java b/android/src/com/android/tools/idea/gradle/service/AndroidProjectDataService.java index b27aca469e8..eebf10ca129 100644 --- a/android/src/com/android/tools/idea/gradle/service/AndroidProjectDataService.java +++ b/android/src/com/android/tools/idea/gradle/service/AndroidProjectDataService.java @@ -15,7 +15,6 @@ */ package com.android.tools.idea.gradle.service; -import com.android.SdkConstants; import com.android.builder.model.AndroidProject; import com.android.sdklib.repository.FullRevision; import com.android.sdklib.repository.FullRevision.PreviewComparison; @@ -26,7 +25,6 @@ import com.android.tools.idea.gradle.IdeaAndroidProject; import com.android.tools.idea.gradle.compiler.PostProjectBuildTasksExecutor; import com.android.tools.idea.gradle.customizer.ModuleCustomizer; import com.android.tools.idea.gradle.customizer.android.*; -import com.android.tools.idea.gradle.messages.CommonMessageGroupNames; import com.android.tools.idea.gradle.messages.Message; import com.android.tools.idea.gradle.messages.ProjectSyncMessages; import com.android.tools.idea.gradle.service.notification.hyperlink.FixGradleModelVersionHyperlink; @@ -75,7 +73,10 @@ import java.util.Map; import static com.android.SdkConstants.GRADLE_PLUGIN_RECOMMENDED_VERSION; import static com.android.sdklib.repository.PreciseRevision.parseRevision; import static com.android.tools.idea.gradle.messages.CommonMessageGroupNames.EXTRA_GENERATED_SOURCES; +import static com.android.tools.idea.gradle.messages.CommonMessageGroupNames.UNHANDLED_SYNC_ISSUE_TYPE; +import static com.android.tools.idea.gradle.messages.Message.Type.*; import static com.android.tools.idea.gradle.util.GradleUtil.getGradleVersion; +import static com.android.tools.idea.gradle.util.GradleUtil.hasLayoutRenderingIssue; /** * Service that sets an Android SDK and facets to the modules of a project that has been imported from an Android-Gradle project. @@ -86,6 +87,7 @@ public class AndroidProjectDataService implements ProjectDataService<IdeaAndroid private final List<ModuleCustomizer<IdeaAndroidProject>> myCustomizers; // This constructor is called by the IDE. See this module's plugin.xml file, implementation of extension 'externalProjectDataService'. + @SuppressWarnings("unused") public AndroidProjectDataService() { this(ImmutableList.of(new AndroidSdkModuleCustomizer(), new AndroidFacetModuleCustomizer(), new ContentRootModuleCustomizer(), new RunConfigModuleCustomizer(), new DependenciesModuleCustomizer(), new CompilerOutputModuleCustomizer())); @@ -148,6 +150,7 @@ public class AndroidProjectDataService implements ProjectDataService<IdeaAndroid String incompatibleVersionFound = null; String nonMatchingEncodingFound = null; + String modelVersionWithRenderingIssue = null; ModuleManager moduleManager = ModuleManager.getInstance(project); for (Module module : moduleManager.getModules()) { @@ -157,6 +160,10 @@ public class AndroidProjectDataService implements ProjectDataService<IdeaAndroid if (androidProject != null) { AndroidProject delegate = androidProject.getDelegate(); + if (modelVersionWithRenderingIssue == null && hasLayoutRenderingIssue(delegate)) { + modelVersionWithRenderingIssue = delegate.getModelVersion(); + } + FullRevision modelVersion = parseRevision(delegate.getModelVersion()); boolean isModelVersionOneDotTwoOrNewer = modelVersion.compareTo(oneDotTwoModelVersion, PreviewComparison.IGNORE) >= 0; @@ -188,21 +195,19 @@ public class AndroidProjectDataService implements ProjectDataService<IdeaAndroid for (File folder : sourceFolders) { // Have to add a word before the path, otherwise IDEA won't show it. String[] text = {"Folder " + folder.getPath()}; - messages.add(new Message(EXTRA_GENERATED_SOURCES, Message.Type.WARNING, text)); + messages.add(new Message(EXTRA_GENERATED_SOURCES, WARNING, text)); } } } if (incompatibleVersionFound != null) { - FixGradleModelVersionHyperlink quickFix = - new FixGradleModelVersionHyperlink("Fix plug-in version and sync project", GRADLE_PLUGIN_RECOMMENDED_VERSION, - null /* do not update Gradle version */, false); + FixGradleModelVersionHyperlink quickFix = new FixGradleModelVersionHyperlink(GRADLE_PLUGIN_RECOMMENDED_VERSION, + null /* do not update Gradle version */, false); String[] text = { String.format("Android plugin version %1$s is not compatible with Gradle version 2.4 (or newer.)", incompatibleVersionFound), "Please use Android plugin version 1.2 or newer." }; - messages.add(new Message(CommonMessageGroupNames.UNHANDLED_SYNC_ISSUE_TYPE, Message.Type.ERROR, text), - quickFix); + messages.add(new Message(UNHANDLED_SYNC_ISSUE_TYPE, ERROR, text), quickFix); } if (nonMatchingEncodingFound != null) { @@ -221,12 +226,23 @@ public class AndroidProjectDataService implements ProjectDataService<IdeaAndroid ideEncoding.displayName(), nonMatchingEncodingFound), "This can lead to serious bugs." }; - messages.add(new Message(CommonMessageGroupNames.UNHANDLED_SYNC_ISSUE_TYPE, Message.Type.WARNING, text), openDocHyperlink, - openEncodingSettingsHyperlink); + messages.add(new Message(UNHANDLED_SYNC_ISSUE_TYPE, WARNING, text), openDocHyperlink, openEncodingSettingsHyperlink); + } + + if (modelVersionWithRenderingIssue != null) { + // See https://code.google.com/p/android/issues/detail?id=170841 + NotificationHyperlink quickFix = new FixGradleModelVersionHyperlink(false); + NotificationHyperlink openDocHyperlink = new OpenUrlHyperlink("https://code.google.com/p/android/issues/detail?id=170841", + "More Info..."); + String[] text = { + String.format("Using an obsolete version of the Gradle plugin (%1$s); this can lead to layouts not rendering correctly.", + modelVersionWithRenderingIssue) + }; + messages.add(new Message(UNHANDLED_SYNC_ISSUE_TYPE, WARNING, text), openDocHyperlink, quickFix); } if (hasExtraGeneratedFolders) { - messages.add(new Message(EXTRA_GENERATED_SOURCES, Message.Type.INFO, "3rd-party Gradle plug-ins may be the cause")); + messages.add(new Message(EXTRA_GENERATED_SOURCES, INFO, "3rd-party Gradle plug-ins may be the cause")); } Sdk jdk = ProjectRootManager.getInstance(project).getProjectSdk(); diff --git a/android/src/com/android/tools/idea/gradle/service/notification/errors/UnsupportedModelVersionErrorHandler.java b/android/src/com/android/tools/idea/gradle/service/notification/errors/UnsupportedModelVersionErrorHandler.java index 8aab1ad0fd2..bfda21d721b 100644 --- a/android/src/com/android/tools/idea/gradle/service/notification/errors/UnsupportedModelVersionErrorHandler.java +++ b/android/src/com/android/tools/idea/gradle/service/notification/errors/UnsupportedModelVersionErrorHandler.java @@ -41,15 +41,8 @@ public class UnsupportedModelVersionErrorHandler extends AbstractSyncErrorHandle @NotNull Project project) { String msg = error.getMessage(); if (msg.startsWith(UNSUPPORTED_MODEL_VERSION_ERROR_PREFIX)) { - NotificationHyperlink fixGradleModelHyperlink; - if (msg.contains(READ_MIGRATION_GUIDE_MSG)) { - fixGradleModelHyperlink = new FixGradleModelVersionHyperlink(); - } - else { - fixGradleModelHyperlink = new FixGradleModelVersionHyperlink("Fix plugin version and re-import project", false); - } - - updateNotification(notification, project, msg, fixGradleModelHyperlink); + boolean openMigrationGuide = msg.contains(READ_MIGRATION_GUIDE_MSG); + updateNotification(notification, project, msg, new FixGradleModelVersionHyperlink(openMigrationGuide)); return true; } return false; diff --git a/android/src/com/android/tools/idea/gradle/service/notification/hyperlink/FixGradleModelVersionHyperlink.java b/android/src/com/android/tools/idea/gradle/service/notification/hyperlink/FixGradleModelVersionHyperlink.java index 3ffb5a643e2..d33b177993a 100644 --- a/android/src/com/android/tools/idea/gradle/service/notification/hyperlink/FixGradleModelVersionHyperlink.java +++ b/android/src/com/android/tools/idea/gradle/service/notification/hyperlink/FixGradleModelVersionHyperlink.java @@ -50,38 +50,27 @@ public class FixGradleModelVersionHyperlink extends NotificationHyperlink { /** * Creates a new {@link FixGradleModelVersionHyperlink}. This constructor updates the Gradle model to the version in * {@link SdkConstants#GRADLE_PLUGIN_RECOMMENDED_VERSION} and Gradle to the version in {@link SdkConstants#GRADLE_LATEST_VERSION}. - * This constructor also opens the migration to the Android Gradle model version 1.0 (from an older version) in the browser. - */ - public FixGradleModelVersionHyperlink() { - this("Open migration guide, fix plug-in version and sync project", true); - } - - /** - * Creates a new {@link FixGradleModelVersionHyperlink}. This constructor updates the Gradle model to the version in - * {@link SdkConstants#GRADLE_PLUGIN_RECOMMENDED_VERSION} and Gradle to the version in {@link SdkConstants#GRADLE_LATEST_VERSION}. * - * @param text the text of the URL. * @param openMigrationGuide indicates whether the migration guide to the Android Gradle model version 1.0 (from an older version) should * be opened in the browser. */ - public FixGradleModelVersionHyperlink(@NotNull String text, boolean openMigrationGuide) { - this(text, GRADLE_PLUGIN_RECOMMENDED_VERSION, GRADLE_LATEST_VERSION, openMigrationGuide); + public FixGradleModelVersionHyperlink(boolean openMigrationGuide) { + this(GRADLE_PLUGIN_RECOMMENDED_VERSION, GRADLE_LATEST_VERSION, openMigrationGuide); } /** * Creates a new {@link FixGradleModelVersionHyperlink}. * - * @param text the text of the URL. * @param modelVersion the version to update the Android Gradle model to. * @param gradleVersion the version of Gradle to update to. This can be {@code null} if only the model version needs to be updated. * @param openMigrationGuide indicates whether the migration guide to the Android Gradle model version 1.0 (from an older version) should * be opened in the browser. */ - public FixGradleModelVersionHyperlink(@NotNull String text, - @NotNull String modelVersion, + public FixGradleModelVersionHyperlink(@NotNull String modelVersion, @Nullable String gradleVersion, boolean openMigrationGuide) { - super("fixGradleElements", text); + super("fixGradleElements", + openMigrationGuide ? "Open migration guide, fix plug-in version and sync project" : "Fix plug-in version and sync project"); myModelVersion = modelVersion; myGradleVersion = gradleVersion; myOpenMigrationGuide = openMigrationGuide; diff --git a/android/src/com/android/tools/idea/gradle/util/GradleUtil.java b/android/src/com/android/tools/idea/gradle/util/GradleUtil.java index c9093997307..c2497c17fe0 100644 --- a/android/src/com/android/tools/idea/gradle/util/GradleUtil.java +++ b/android/src/com/android/tools/idea/gradle/util/GradleUtil.java @@ -1277,4 +1277,16 @@ public final class GradleUtil { assert projectBasePath != null; return projectBasePath; } + + /** + * Indicates whether <a href="https://code.google.com/p/android/issues/detail?id=170841">a known layout rendering issue</a> is present in + * the given model. + * + * @param model the given model. + * @return {@true} if the model has the layout rendering issue; {@code false} otherwise. + */ + public static boolean hasLayoutRenderingIssue(@NotNull AndroidProject model) { + String modelVersion = model.getModelVersion(); + return modelVersion.startsWith("1.2.0") || modelVersion.equals("1.2.1") || modelVersion.equals("1.2.2"); + } } diff --git a/android/src/com/android/tools/idea/rendering/RenderErrorPanel.java b/android/src/com/android/tools/idea/rendering/RenderErrorPanel.java index 21234d16b79..5d7a793ad18 100644 --- a/android/src/com/android/tools/idea/rendering/RenderErrorPanel.java +++ b/android/src/com/android/tools/idea/rendering/RenderErrorPanel.java @@ -16,8 +16,8 @@ package com.android.tools.idea.rendering; -import com.android.SdkConstants; import com.android.annotations.VisibleForTesting; +import com.android.builder.model.AndroidProject; import com.android.ide.common.rendering.RenderSecurityManager; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.resources.ResourceResolver; @@ -101,6 +101,7 @@ import static com.android.SdkConstants.*; import static com.android.ide.common.rendering.api.LayoutLog.TAG_RESOURCES_PREFIX; import static com.android.ide.common.rendering.api.LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR; import static com.android.tools.idea.configurations.RenderContext.UsageType.LAYOUT_EDITOR; +import static com.android.tools.idea.gradle.util.GradleUtil.hasLayoutRenderingIssue; import static com.android.tools.idea.rendering.HtmlLinkManager.URL_ACTION_CLOSE; import static com.android.tools.idea.rendering.RenderLogger.TAG_STILL_BUILDING; import static com.android.tools.idea.rendering.ResourceHelper.viewNeedsPackage; @@ -554,8 +555,9 @@ public class RenderErrorPanel extends JPanel { if (module != null) { AndroidFacet facet = AndroidFacet.getInstance(module); if (facet != null && facet.isGradleProject() && facet.getIdeaAndroidProject() != null) { - String modelVersion = facet.getIdeaAndroidProject().getDelegate().getModelVersion(); - if (modelVersion.startsWith("1.2.0") || modelVersion.equals("1.2.1") || modelVersion.equals("1.2.2")) { + AndroidProject androidProject = facet.getIdeaAndroidProject().getDelegate(); + String modelVersion = androidProject.getModelVersion(); + if (hasLayoutRenderingIssue(androidProject)) { builder.addBold("Using an obsolete version of the Gradle plugin (" + modelVersion + "); this can lead to layouts not rendering correctly.").newline(); builder.addIcon(HtmlBuilderHelper.getTipIconPath()); @@ -563,7 +565,7 @@ public class RenderErrorPanel extends JPanel { Runnable runnable = new Runnable() { @Override public void run() { - FixGradleModelVersionHyperlink quickFix = new FixGradleModelVersionHyperlink("", GRADLE_PLUGIN_RECOMMENDED_VERSION, + FixGradleModelVersionHyperlink quickFix = new FixGradleModelVersionHyperlink(GRADLE_PLUGIN_RECOMMENDED_VERSION, null, false); quickFix.executeIfClicked(module.getProject(), new HyperlinkEvent(this, HyperlinkEvent.EventType.ACTIVATED, null, quickFix.getUrl())); diff --git a/android/testSrc/com/android/tools/idea/gradle/stubs/android/AndroidProjectStub.java b/android/testSrc/com/android/tools/idea/gradle/stubs/android/AndroidProjectStub.java index 3102951e8c8..4ad554f6aba 100644 --- a/android/testSrc/com/android/tools/idea/gradle/stubs/android/AndroidProjectStub.java +++ b/android/testSrc/com/android/tools/idea/gradle/stubs/android/AndroidProjectStub.java @@ -44,6 +44,7 @@ public class AndroidProjectStub implements AndroidProject { @NotNull private final JavaCompileOptionsStub myJavaCompileOptions = new JavaCompileOptionsStub(); + @NotNull private String myModelVersion = SdkConstants.GRADLE_PLUGIN_MINIMUM_VERSION + "-SNAPSHOT"; @Nullable private VariantStub myFirstVariant; private boolean myLibrary; @@ -66,7 +67,11 @@ public class AndroidProjectStub implements AndroidProject { @Override @NotNull public String getModelVersion() { - return SdkConstants.GRADLE_PLUGIN_MINIMUM_VERSION + "-SNAPSHOT"; + return myModelVersion; + } + + public void setModelVersion(@NotNull String modelVersion) { + myModelVersion = modelVersion; } @Override diff --git a/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java b/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java index 83afe05cc4d..ef12a638327 100644 --- a/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java +++ b/android/testSrc/com/android/tools/idea/gradle/util/GradleUtilTest.java @@ -16,11 +16,10 @@ package com.android.tools.idea.gradle.util; import com.android.sdklib.repository.FullRevision; +import com.android.tools.idea.gradle.stubs.android.AndroidProjectStub; import com.google.common.base.Charsets; import com.google.common.collect.Lists; -import com.google.common.io.Files; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; import junit.framework.TestCase; import java.io.File; @@ -29,6 +28,10 @@ import java.util.List; import java.util.Properties; import static com.android.SdkConstants.*; +import static com.android.tools.idea.gradle.util.PropertiesUtil.getProperties; +import static com.google.common.io.Files.createTempDir; +import static com.google.common.io.Files.write; +import static com.intellij.openapi.util.io.FileUtilRt.createIfNotExists; /** * Tests for {@link GradleUtil}. @@ -53,69 +56,69 @@ public class GradleUtilTest extends TestCase { } public void testGetGradleWrapperPropertiesFilePath() throws IOException { - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File wrapper = new File(myTempDir, FN_GRADLE_WRAPPER_PROPERTIES); - FileUtilRt.createIfNotExists(wrapper); + createIfNotExists(wrapper); GradleUtil.updateGradleDistributionUrl("1.6", wrapper); - Properties properties = PropertiesUtil.getProperties(wrapper); + Properties properties = getProperties(wrapper); String distributionUrl = properties.getProperty("distributionUrl"); assertEquals("https://services.gradle.org/distributions/gradle-1.6-all.zip", distributionUrl); } public void testLeaveGradleWrapperAloneBin() throws IOException { // Ensure that if we already have the right version, we don't replace a -bin.zip with a -all.zip - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File wrapper = new File(myTempDir, FN_GRADLE_WRAPPER_PROPERTIES); - Files.write("#Wed Apr 10 15:27:10 PDT 2013\n" + - "distributionBase=GRADLE_USER_HOME\n" + - "distributionPath=wrapper/dists\n" + - "zipStoreBase=GRADLE_USER_HOME\n" + - "zipStorePath=wrapper/dists\n" + - "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-bin.zip", wrapper, Charsets.UTF_8); + write("#Wed Apr 10 15:27:10 PDT 2013\n" + + "distributionBase=GRADLE_USER_HOME\n" + + "distributionPath=wrapper/dists\n" + + "zipStoreBase=GRADLE_USER_HOME\n" + + "zipStorePath=wrapper/dists\n" + + "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-bin.zip", wrapper, Charsets.UTF_8); GradleUtil.updateGradleDistributionUrl("1.9", wrapper); - Properties properties = PropertiesUtil.getProperties(wrapper); + Properties properties = getProperties(wrapper); String distributionUrl = properties.getProperty("distributionUrl"); assertEquals("https://services.gradle.org/distributions/gradle-1.9-bin.zip", distributionUrl); } public void testLeaveGradleWrapperAloneAll() throws IOException { // Ensure that if we already have the right version, we don't replace a -all.zip with a -bin.zip - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File wrapper = new File(myTempDir, FN_GRADLE_WRAPPER_PROPERTIES); - Files.write("#Wed Apr 10 15:27:10 PDT 2013\n" + - "distributionBase=GRADLE_USER_HOME\n" + - "distributionPath=wrapper/dists\n" + - "zipStoreBase=GRADLE_USER_HOME\n" + - "zipStorePath=wrapper/dists\n" + - "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-all.zip", wrapper, Charsets.UTF_8); + write("#Wed Apr 10 15:27:10 PDT 2013\n" + + "distributionBase=GRADLE_USER_HOME\n" + + "distributionPath=wrapper/dists\n" + + "zipStoreBase=GRADLE_USER_HOME\n" + + "zipStorePath=wrapper/dists\n" + + "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-all.zip", wrapper, Charsets.UTF_8); GradleUtil.updateGradleDistributionUrl("1.9", wrapper); - Properties properties = PropertiesUtil.getProperties(wrapper); + Properties properties = getProperties(wrapper); String distributionUrl = properties.getProperty("distributionUrl"); assertEquals("https://services.gradle.org/distributions/gradle-1.9-all.zip", distributionUrl); } public void testReplaceGradleWrapper() throws IOException { // Test that when we replace to a new version we use -all.zip - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File wrapper = new File(myTempDir, FN_GRADLE_WRAPPER_PROPERTIES); - Files.write("#Wed Apr 10 15:27:10 PDT 2013\n" + - "distributionBase=GRADLE_USER_HOME\n" + - "distributionPath=wrapper/dists\n" + - "zipStoreBase=GRADLE_USER_HOME\n" + - "zipStorePath=wrapper/dists\n" + - "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-bin.zip", wrapper, Charsets.UTF_8); + write("#Wed Apr 10 15:27:10 PDT 2013\n" + + "distributionBase=GRADLE_USER_HOME\n" + + "distributionPath=wrapper/dists\n" + + "zipStoreBase=GRADLE_USER_HOME\n" + + "zipStorePath=wrapper/dists\n" + + "distributionUrl=https\\://services.gradle.org/distributions/gradle-1.9-bin.zip", wrapper, Charsets.UTF_8); GradleUtil.updateGradleDistributionUrl("1.6", wrapper); - Properties properties = PropertiesUtil.getProperties(wrapper); + Properties properties = getProperties(wrapper); String distributionUrl = properties.getProperty("distributionUrl"); assertEquals("https://services.gradle.org/distributions/gradle-1.6-all.zip", distributionUrl); } public void testUpdateGradleDistributionUrl() { - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File wrapperPath = GradleUtil.getGradleWrapperPropertiesFilePath(myTempDir); List<String> expected = Lists.newArrayList(FileUtil.splitPath(myTempDir.getPath())); @@ -136,7 +139,7 @@ public class GradleUtilTest extends TestCase { } public void testGetGradleBuildFilePath() { - myTempDir = Files.createTempDir(); + myTempDir = createTempDir(); File buildFilePath = GradleUtil.getGradleBuildFilePath(myTempDir); assertEquals(new File(myTempDir, FN_BUILD_GRADLE), buildFilePath); } @@ -279,4 +282,23 @@ public class GradleUtilTest extends TestCase { version = GradleUtil.getGradleWrapperVersionOnlyIfComingForGradleDotOrg(url); assertNull(version); } + + public void testHasLayoutRenderingIssue() { + AndroidProjectStub model = new AndroidProjectStub("app"); + + model.setModelVersion("1.1.0"); + assertFalse(GradleUtil.hasLayoutRenderingIssue(model)); + + model.setModelVersion("1.2.0"); + assertTrue(GradleUtil.hasLayoutRenderingIssue(model)); + + model.setModelVersion("1.2.1"); + assertTrue(GradleUtil.hasLayoutRenderingIssue(model)); + + model.setModelVersion("1.2.2"); + assertTrue(GradleUtil.hasLayoutRenderingIssue(model)); + + model.setModelVersion("1.2.3"); + assertFalse(GradleUtil.hasLayoutRenderingIssue(model)); + } } |