diff options
4 files changed, 39 insertions, 10 deletions
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/XmlContext.java b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/XmlContext.java index aabbf79..78e8632 100644 --- a/lint/libs/lint_api/src/com/android/tools/lint/detector/api/XmlContext.java +++ b/lint/libs/lint_api/src/com/android/tools/lint/detector/api/XmlContext.java @@ -138,6 +138,9 @@ public class XmlContext extends Context { private final static Pattern sVersionPattern = Pattern.compile("^v(\\d+)$");//$NON-NLS-1$ + private static File sCachedFolder = null; + private static int sCachedFolderVersion = -1; + /** * Returns the folder version. For example, for the file values-v14/foo.xml, * it returns 14. @@ -145,14 +148,23 @@ public class XmlContext extends Context { * @return the folder version, or -1 if no specific version was specified */ public int getFolderVersion() { - String[] qualifiers = file.getParentFile().getName().split("-"); //$NON-NLS-1$ + File parent = file.getParentFile(); + if (parent.equals(sCachedFolder)) { + return sCachedFolderVersion; + } + + sCachedFolder = parent; + sCachedFolderVersion = -1; + + String[] qualifiers = parent.getName().split("-"); //$NON-NLS-1$ for (String qualifier : qualifiers) { Matcher matcher = sVersionPattern.matcher(qualifier); if (matcher.matches()) { - return Integer.parseInt(matcher.group(1)); + sCachedFolderVersion = Integer.parseInt(matcher.group(1)); + break; } } - return -1; + return sCachedFolderVersion; } } diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/ApiDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/ApiDetector.java index c670952..52eaaa8 100644 --- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/ApiDetector.java +++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/ApiDetector.java @@ -18,6 +18,7 @@ package com.android.tools.lint.checks; import static com.android.tools.lint.detector.api.LintConstants.ANDROID_RESOURCE_PREFIX; import static com.android.tools.lint.detector.api.LintConstants.TARGET_API; +import static com.android.tools.lint.detector.api.LintConstants.VALUE_MATCH_PARENT; import com.android.annotations.NonNull; import com.android.resources.ResourceFolderType; @@ -133,6 +134,21 @@ public class ApiDetector extends ResourceXmlDetector implements Detector.ClassSc } String value = attribute.getValue(); + + if (value.equals(VALUE_MATCH_PARENT)) { + int minSdk = getMinSdk(context); + // minSdk != -1: Avoid warning about this in library projects where + // no uses-sdk has been specified + if (minSdk != -1 && minSdk < 8 && context.getFolderVersion() < 8) { + Location location = context.getLocation(attribute); + String message = String.format( + "\"match_parent\" requires API level 8 (current min is %1$d), " + + "use \"fill_parent\" instead", + minSdk); + context.report(UNSUPPORTED, attribute, location, message, null); + } + } + if (value.startsWith(ANDROID_RESOURCE_PREFIX)) { // Convert @android:type/foo into android/R$type and "foo" int index = value.indexOf('/', ANDROID_RESOURCE_PREFIX.length()); diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java index 39a1e4f..0cde634 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ApiDetectorTest.java @@ -32,6 +32,7 @@ public class ApiDetectorTest extends AbstractCheckTest { "layout.xml:21: Error: View requires API level 14 (current min is 1): <GridLayout>\n" + "layout.xml:22: Error: @android:attr/actionBarSplitStyle requires API level 14 (current min is 1)\n" + "layout.xml:23: Error: @android:color/holo_red_light requires API level 14 (current min is 1)\n" + + "layout.xml:4: Error: \"match_parent\" requires API level 8 (current min is 1), use \"fill_parent\" instead\n" + "layout.xml:9: Error: View requires API level 5 (current min is 1): <QuickContactBadge>\n" + "themes.xml:9: Error: @android:color/holo_red_light requires API level 14 (current min is 1)", diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/apicheck/layout.xml b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/apicheck/layout.xml index e2751ec..83b6b0a 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/apicheck/layout.xml +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/apicheck/layout.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" + android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" > @@ -13,20 +13,20 @@ <!-- Requires API 11 --> <CalendarView - android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_width="fill_parent" + android:layout_height="fill_parent" /> <!-- Requires API 14 --> <GridLayout foo="@android:attr/actionBarSplitStyle" bar="@android:color/holo_red_light" - android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_width="fill_parent" + android:layout_height="fill_parent" > <Button - android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_width="fill_parent" + android:layout_height="fill_parent" /> </GridLayout> </LinearLayout> |