diff options
author | Tor Norbye <tnorbye@google.com> | 2012-10-04 09:34:27 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2012-10-04 09:34:27 -0700 |
commit | c3e3de0a15a83422d3c43f536a45e53e8156bfe5 (patch) | |
tree | d392f8d65e15eb2d5194f3e19d8290d41efbce91 /lint | |
parent | 1fca455a13e2dc7c20904a7e9a89911c7e9a887b (diff) | |
download | sdk-c3e3de0a15a83422d3c43f536a45e53e8156bfe5.zip sdk-c3e3de0a15a83422d3c43f536a45e53e8156bfe5.tar.gz sdk-c3e3de0a15a83422d3c43f536a45e53e8156bfe5.tar.bz2 |
Fix misc lint bugs
I ran lint over some large projects and manually verified the report;
this uncovered a couple of false positives.
Change-Id: I006d64a03119c6badc40e33df9ab4079e07dc7c5
Diffstat (limited to 'lint')
11 files changed, 94 insertions, 7 deletions
diff --git a/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultSdkInfo.java b/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultSdkInfo.java index b5ae26d..b5a1628 100644 --- a/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultSdkInfo.java +++ b/lint/libs/lint_api/src/com/android/tools/lint/client/api/DefaultSdkInfo.java @@ -23,6 +23,7 @@ import static com.android.SdkConstants.ABS_SPINNER; import static com.android.SdkConstants.ADAPTER_VIEW; import static com.android.SdkConstants.AUTO_COMPLETE_TEXT_VIEW; import static com.android.SdkConstants.BUTTON; +import static com.android.SdkConstants.CHECKABLE; import static com.android.SdkConstants.CHECKED_TEXT_VIEW; import static com.android.SdkConstants.CHECK_BOX; import static com.android.SdkConstants.COMPOUND_BUTTON; @@ -125,6 +126,9 @@ class DefaultSdkInfo extends SdkInfo { if (parent.equals(child)) { return true; } + if (implementsInterface(child, parentType)) { + return true; + } child = PARENTS.get(child); if (child == null) { // Unknown view - err on the side of caution @@ -135,6 +139,10 @@ class DefaultSdkInfo extends SdkInfo { return false; } + private static boolean implementsInterface(String className, String interfaceName) { + return interfaceName.equals(INTERFACES.get(className)); + } + // Strip off type parameters, e.g. AdapterView<?> => AdapterView private static String getRawType(String type) { if (type != null) { @@ -230,4 +238,13 @@ class DefaultSdkInfo extends SdkInfo { } */ } + + // Currently using a map; this should really be a list, but using a map until we actually + // start adding more than one item + @NonNull + private static final Map<String, String> INTERFACES = new HashMap<String, String>(2); + static { + INTERFACES.put(CHECKED_TEXT_VIEW, CHECKABLE); + INTERFACES.put(COMPOUND_BUTTON, CHECKABLE); + } } diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/DeprecationDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/DeprecationDetector.java index 00953d8..86dcef4 100644 --- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/DeprecationDetector.java +++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/DeprecationDetector.java @@ -27,6 +27,8 @@ import static com.android.SdkConstants.ATTR_NUMERIC; import static com.android.SdkConstants.ATTR_PASSWORD; import static com.android.SdkConstants.ATTR_PHONE_NUMBER; import static com.android.SdkConstants.ATTR_SINGLE_LINE; +import static com.android.SdkConstants.EDIT_TEXT; +import static com.android.SdkConstants.VALUE_TRUE; import com.android.annotations.NonNull; import com.android.tools.lint.detector.api.Category; @@ -135,7 +137,15 @@ public class DeprecationDetector extends LayoutDetector { String fix; int minSdk = 1; if (name.equals(ATTR_EDITABLE)) { - fix = "Use an <EditText> to make it editable"; + if (!EDIT_TEXT.equals(attribute.getOwnerElement().getTagName())) { + fix = "Use an <EditText> to make it editable"; + } else { + if (VALUE_TRUE.equals(attribute.getValue())) { + fix = "<EditText> is already editable"; + } else { + fix = "Use inputType instead"; + } + } } else if (name.equals(ATTR_ENABLED)) { fix = "Use state_enabled instead"; } else if (name.equals(ATTR_SINGLE_LINE)) { diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/NamespaceDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/NamespaceDetector.java index a4fc2f6..2d72271 100644 --- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/NamespaceDetector.java +++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/NamespaceDetector.java @@ -68,7 +68,7 @@ public class NamespaceDetector extends LayoutDetector { "Unused namespace declarations take up space and require processing that is not " + "necessary", - Category.CORRECTNESS, + Category.PERFORMANCE, 1, Severity.WARNING, NamespaceDetector.class, diff --git a/lint/libs/lint_checks/src/com/android/tools/lint/checks/WrongIdDetector.java b/lint/libs/lint_checks/src/com/android/tools/lint/checks/WrongIdDetector.java index 3f8afb6..7efbfbf 100644 --- a/lint/libs/lint_checks/src/com/android/tools/lint/checks/WrongIdDetector.java +++ b/lint/libs/lint_checks/src/com/android/tools/lint/checks/WrongIdDetector.java @@ -231,7 +231,8 @@ public class WrongIdDetector extends LayoutDetector { id, suggestionMessage); } report(context, UNKNOWN_ID, handle, message); - } else if (checkSameLayout && (!projectScope || isBound)) { + } else if (checkSameLayout && (!projectScope || isBound) + && id.startsWith(NEW_ID_PREFIX)) { // The id was defined, but in a different layout. Usually not intentional // (might be referring to a random other view that happens to have the same // name.) diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java index 0e4ec2f..f399014 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/DeprecationDetectorTest.java @@ -33,8 +33,13 @@ public class DeprecationDetectorTest extends AbstractCheckTest { "res/layout/deprecation.xml:18: Warning: android:editable is deprecated: Use an <EditText> to make it editable [Deprecated]\n" + " android:editable=\"true\"\n" + " ~~~~~~~~~~~~~~~~~~~~~~~\n" + - "0 errors, 2 warnings\n" + - "", + "res/layout/deprecation.xml:26: Warning: android:editable is deprecated: <EditText> is already editable [Deprecated]\n" + + " <EditText android:editable=\"true\" />\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~\n" + + "res/layout/deprecation.xml:27: Warning: android:editable is deprecated: Use inputType instead [Deprecated]\n" + + " <EditText android:editable=\"false\" />\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~~\n" + + "0 errors, 4 warnings\n", lintProject( "apicheck/minsdk1.xml=>AndroidManifest.xml", @@ -67,8 +72,13 @@ public class DeprecationDetectorTest extends AbstractCheckTest { "res/layout/deprecation.xml:23: Warning: android:phoneNumber is deprecated: Use inputType instead [Deprecated]\n" + " android:phoneNumber=\"true\"\n" + " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - "0 errors, 8 warnings\n" + - "", + "res/layout/deprecation.xml:26: Warning: android:editable is deprecated: <EditText> is already editable [Deprecated]\n" + + " <EditText android:editable=\"true\" />\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~\n" + + "res/layout/deprecation.xml:27: Warning: android:editable is deprecated: Use inputType instead [Deprecated]\n" + + " <EditText android:editable=\"false\" />\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~~\n" + + "0 errors, 10 warnings\n", lintProject( "apicheck/minsdk4.xml=>AndroidManifest.xml", diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java index a200de0..bfc56e2 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/ViewTypeDetectorTest.java @@ -48,4 +48,14 @@ public class ViewTypeDetectorTest extends AbstractCheckTest { "src/test/pkg/WrongCastActivity2.java.txt=>src/test/pkg/WrongCastActivity2.java" )); } + + public void testCheckable() throws Exception { + assertEquals( + "No warnings.", + + lintProject( + "res/layout/casts2.xml", + "src/test/pkg/WrongCastActivity3.java.txt=>src/test/pkg/WrongCastActivity3.java" + )); + } } diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java index 15675ba..b3fd203 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/WrongIdDetectorTest.java @@ -87,4 +87,12 @@ public class WrongIdDetectorTest extends AbstractCheckTest { lintFiles("wrongid/ignorelayout1.xml=>res/layout/layout1.xml")); } + public void testNewIdPrefix() throws Exception { + assertEquals( + "No warnings.", + + lintFiles("res/layout/default_item_badges.xml", + "res/layout/detailed_item.xml")); + } + } diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/default_item_badges.xml b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/default_item_badges.xml new file mode 100644 index 0000000..082a520 --- /dev/null +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/default_item_badges.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/video_badges" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/deprecation.xml b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/deprecation.xml index 74a78ff..70b7f23 100644 --- a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/deprecation.xml +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/deprecation.xml @@ -23,4 +23,7 @@ android:phoneNumber="true" android:singleLine="true" /> + <EditText android:editable="true" /> + <EditText android:editable="false" /> + </AbsoluteLayout> diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/detailed_item.xml b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/detailed_item.xml new file mode 100644 index 0000000..a5d4226 --- /dev/null +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/res/layout/detailed_item.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" > + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/video_badges" /> + +</RelativeLayout> diff --git a/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/WrongCastActivity3.java.txt b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/WrongCastActivity3.java.txt new file mode 100644 index 0000000..1701600 --- /dev/null +++ b/lint/libs/lint_checks/tests/src/com/android/tools/lint/checks/data/src/test/pkg/WrongCastActivity3.java.txt @@ -0,0 +1,11 @@ +package test.pkg; + +import android.app.*; +import android.view.*; +import android.widget.*; + +public class WrongCastActivity3 extends Activity { + private void test() { + final Checkable check = (Checkable) findViewById(R.id.additional); + } +} |