blob: 5e3e42e01d8d33cf63a3924de7f2338635595075 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tools.lint.checks;
import static com.android.SdkConstants.ATTR_DRAWABLE_RIGHT;
import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_END;
import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_LEFT;
import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_START;
import static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_RIGHT;
import static com.android.SdkConstants.ATTR_LAYOUT_MARGIN_END;
import static com.android.SdkConstants.ATTR_NAME;
import static com.android.tools.lint.checks.RtlDetector.ATTRIBUTES;
import static com.android.tools.lint.checks.RtlDetector.convertNewToOld;
import static com.android.tools.lint.checks.RtlDetector.convertOldToNew;
import static com.android.tools.lint.checks.RtlDetector.convertToOppositeDirection;
import static com.android.tools.lint.checks.RtlDetector.isRtlAttributeName;
import com.android.annotations.NonNull;
import com.android.tools.lint.client.api.LintClient;
import com.android.tools.lint.detector.api.Detector;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.Project;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@SuppressWarnings("javadoc")
public class RtlDetectorTest extends AbstractCheckTest {
@Override
protected Detector getDetector() {
return new RtlDetector();
}
private Set<Issue> mEnabled = new HashSet<Issue>();
private static final Set<Issue> ALL = new HashSet<Issue>();
static {
ALL.add(RtlDetector.USE_START);
ALL.add(RtlDetector.ENABLED);
ALL.add(RtlDetector.COMPAT);
ALL.add(RtlDetector.SYMMETRY);
}
public void testIsRtlAttributeName() {
assertTrue(isRtlAttributeName(ATTR_LAYOUT_ALIGN_PARENT_START));
assertTrue(isRtlAttributeName(ATTR_LAYOUT_MARGIN_END));
assertTrue(isRtlAttributeName(ATTR_LAYOUT_ALIGN_END));
assertFalse(isRtlAttributeName(ATTR_LAYOUT_ALIGN_PARENT_LEFT));
assertFalse(isRtlAttributeName(ATTR_DRAWABLE_RIGHT));
assertFalse(isRtlAttributeName(ATTR_LAYOUT_ALIGN_RIGHT));
assertFalse(isRtlAttributeName(ATTR_NAME));
}
@Override
protected TestConfiguration getConfiguration(LintClient client, Project project) {
return new TestConfiguration(client, project, null) {
@Override
public boolean isEnabled(@NonNull Issue issue) {
return super.isEnabled(issue) && mEnabled.contains(issue);
}
};
}
public void testTarget14WithRtl() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "No warnings.",
lintProject(
"rtl/project-api17.properties=>project.properties",
"minsdk5targetsdk14.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testTarget17WithRtl() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "res/layout/rtl.xml:14: Warning: Use \"start\" instead of \"left\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"left\"\n"
+ " ~~~~\n"
+ "res/layout/rtl.xml:22: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"right\"\n"
+ " ~~~~~\n"
+ "res/layout/rtl.xml:30: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:gravity=\"right\"\n"
+ " ~~~~~\n"
+ "AndroidManifest.xml: Warning: The project references RTL attributes, but does not explicitly enable or disable RTL support with android:supportsRtl in the manifest [RtlEnabled]\n"
+ "0 errors, 4 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testTarget14() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "No warnings.",
lintProject(
"rtl/project-api17.properties=>project.properties",
"minsdk5targetsdk14.xml=>AndroidManifest.xml"
));
}
public void testOlderCompilationTarget() throws Exception {
mEnabled = ALL;
assertEquals(
"No warnings.",
lintProject(
"rtl/project-api14.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testUseStart() throws Exception {
mEnabled = Collections.singleton(RtlDetector.USE_START);
assertEquals(""
+ "res/layout/rtl.xml:14: Warning: Use \"start\" instead of \"left\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"left\"\n"
+ " ~~~~\n"
+ "res/layout/rtl.xml:22: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"right\"\n"
+ " ~~~~~\n"
+ "res/layout/rtl.xml:30: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:gravity=\"right\"\n"
+ " ~~~~~\n"
+ "0 errors, 3 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testTarget17Rtl() throws Exception {
mEnabled = Collections.singleton(RtlDetector.USE_START);
assertEquals(""
+ "res/layout/rtl.xml:14: Warning: Use \"start\" instead of \"left\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"left\"\n"
+ " ~~~~\n"
+ "res/layout/rtl.xml:22: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:layout_gravity=\"right\"\n"
+ " ~~~~~\n"
+ "res/layout/rtl.xml:30: Warning: Use \"end\" instead of \"right\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " android:gravity=\"right\"\n"
+ " ~~~~~\n"
+ "0 errors, 3 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/min17rtl.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testRelativeLayoutInOld() throws Exception {
mEnabled = Collections.singleton(RtlDetector.USE_START);
assertEquals(""
+ "res/layout/relative.xml:10: Warning: Consider adding android:layout_alignParentStart=\"true\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignParentLeft=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:13: Warning: Consider adding android:layout_marginStart=\"40dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_marginLeft=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:24: Warning: Consider adding android:layout_marginStart=\"40dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_marginLeft=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:26: Warning: Consider adding android:layout_toEndOf=\"@id/loading_progress\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_toRightOf=\"@id/loading_progress\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:29: Warning: Consider adding android:paddingEnd=\"120dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:paddingRight=\"120dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:37: Warning: Consider adding android:layout_alignParentStart=\"true\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignParentLeft=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:38: Warning: Consider adding android:layout_alignEnd=\"@id/text\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignRight=\"@id/text\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:47: Warning: Consider adding android:layout_alignStart=\"@id/cancel\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignLeft=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:48: Warning: Consider adding android:layout_alignEnd=\"@id/cancel\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignRight=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 9 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/relative.xml=>res/layout/relative.xml"
));
}
public void testRelativeLayoutInNew() throws Exception {
mEnabled = Collections.singleton(RtlDetector.USE_START);
assertEquals(""
+ "res/layout/relative.xml:10: Warning: Consider replacing android:layout_alignParentLeft with android:layout_alignParentStart=\"true\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignParentLeft=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:13: Warning: Consider replacing android:layout_marginLeft with android:layout_marginStart=\"40dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_marginLeft=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:24: Warning: Consider replacing android:layout_marginLeft with android:layout_marginStart=\"40dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_marginLeft=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:26: Warning: Consider replacing android:layout_toRightOf with android:layout_toEndOf=\"@id/loading_progress\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_toRightOf=\"@id/loading_progress\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:29: Warning: Consider replacing android:paddingRight with android:paddingEnd=\"120dip\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:paddingRight=\"120dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:37: Warning: Consider replacing android:layout_alignParentLeft with android:layout_alignParentStart=\"true\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignParentLeft=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:38: Warning: Consider replacing android:layout_alignRight with android:layout_alignEnd=\"@id/text\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignRight=\"@id/text\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:47: Warning: Consider replacing android:layout_alignLeft with android:layout_alignStart=\"@id/cancel\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignLeft=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:48: Warning: Consider replacing android:layout_alignRight with android:layout_alignEnd=\"@id/cancel\" to better support right-to-left layouts [RtlHardcoded]\n"
+ " android:layout_alignRight=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 9 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/min17rtl.xml=>AndroidManifest.xml",
"rtl/relative.xml=>res/layout/relative.xml"
));
}
public void testRelativeLayoutCompat() throws Exception {
mEnabled = Collections.singleton(RtlDetector.COMPAT);
assertEquals(""
+ "res/layout/relative.xml:10: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_alignParentLeft=\"true\" [RtlCompat]\n"
+ " android:layout_alignParentStart=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:13: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_marginLeft=\"40dip\" [RtlCompat]\n"
+ " android:layout_marginStart=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:24: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_marginLeft=\"40dip\" [RtlCompat]\n"
+ " android:layout_marginStart=\"40dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:26: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_toRightOf=\"@id/loading_progress\" [RtlCompat]\n"
+ " android:layout_toEndOf=\"@id/loading_progress\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:29: Error: To support older versions than API 17 (project specifies 5) you should also add android:paddingRight=\"120dip\" [RtlCompat]\n"
+ " android:paddingEnd=\"120dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:37: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_alignParentLeft=\"true\" [RtlCompat]\n"
+ " android:layout_alignParentStart=\"true\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:38: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_alignRight=\"@id/text\" [RtlCompat]\n"
+ " android:layout_alignEnd=\"@id/text\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:47: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_alignLeft=\"@id/cancel\" [RtlCompat]\n"
+ " android:layout_alignStart=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "res/layout/relative.xml:48: Error: To support older versions than API 17 (project specifies 5) you should also add android:layout_alignRight=\"@id/cancel\" [RtlCompat]\n"
+ " android:layout_alignEnd=\"@id/cancel\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~~~~\n"
+ "9 errors, 0 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/relativeCompat.xml=>res/layout/relative.xml"
));
}
public void testRelativeCompatOk() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "No warnings.",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/relativeOk.xml=>res/layout/relative.xml"
));
}
public void testTarget17NoRtl() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "No warnings.",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/min17nortl.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testJava() throws Exception {
mEnabled = ALL;
assertEquals(""
+ "src/test/pkg/GravityTest.java:24: Warning: Use \"Gravity.START\" instead of \"Gravity.LEFT\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " t1.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);\n"
+ " ~~~~\n"
+ "src/test/pkg/GravityTest.java:30: Warning: Use \"Gravity.START\" instead of \"Gravity.LEFT\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " t1.setGravity(LEFT | RIGHT); // static imports\n"
+ " ~~~~\n"
+ "0 errors, 2 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/GravityTest.java.txt=>src/test/pkg/GravityTest.java"
));
}
public void testOk1() throws Exception {
mEnabled = ALL;
// targetSdkVersion < 17
assertEquals(
"No warnings.",
lintProject("rtl/rtl.xml=>res/layout/rtl.xml"));
}
public void testOk2() throws Exception {
mEnabled = ALL;
// build target < 14
assertEquals(
"No warnings.",
lintProject(
"overdraw/project.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/rtl.xml=>res/layout/rtl.xml"
));
}
public void testNullLocalName() throws Exception {
// Regression test for attribute with null local name
mEnabled = ALL;
assertEquals(
"No warnings.",
lintProject(
"overdraw/project.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/rtl_noprefix.xml=>res/layout/rtl.xml"
));
}
public void testSymmetry() throws Exception {
mEnabled = Collections.singleton(RtlDetector.SYMMETRY);
assertEquals(""
+ "res/layout/relative.xml:29: Warning: When you define paddingRight you should probably also define paddingLeft for right-to-left symmetry [RtlSymmetry]\n"
+ " android:paddingRight=\"120dip\"\n"
+ " ~~~~~~~~~~~~~~~~~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/relative.xml=>res/layout/relative.xml"
));
}
public void testCompatAttributeValueConversion() throws Exception {
// Ensure that when the RTL value contains a direction, we produce the
// compatibility version of it for the compatibility attribute, e.g. if the
// attribute for paddingEnd is ?listPreferredItemPaddingEnd, when we suggest
// also setting paddingRight we suggest ?listPreferredItemPaddingRight
mEnabled = Collections.singleton(RtlDetector.COMPAT);
assertEquals(""
+ "res/layout/symmetry.xml:8: Error: To support older versions than API 17 (project specifies 5) you should also add android:paddingRight=\"?android:listPreferredItemPaddingRight\" [RtlCompat]\n"
+ " android:paddingEnd=\"?android:listPreferredItemPaddingEnd\"\n"
+ " ~~~~~~~~~~~~~~~~~~\n"
+ "1 errors, 0 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/symmetry.xml=>res/layout/symmetry.xml"
));
}
public void testTextAlignment() throws Exception {
mEnabled = Collections.singleton(RtlDetector.COMPAT);
assertEquals(""
+ "res/layout/spinner.xml:49: Error: Inconsistent alignment specification between textAlignment and gravity attributes: was end, expected start [RtlCompat]\n"
+ " android:textAlignment=\"textStart\"/> <!-- ERROR -->\n"
+ " ~~~~~~~~~\n"
+ " res/layout/spinner.xml:46: Incompatible direction here\n"
+ "1 errors, 0 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/spinner.xml=>res/layout/spinner.xml"
));
}
public void testConvertBetweenAttributes() {
assertEquals("alignParentStart", convertOldToNew("alignParentLeft"));
assertEquals("alignParentEnd", convertOldToNew("alignParentRight"));
assertEquals("paddingEnd", convertOldToNew("paddingRight"));
assertEquals("paddingStart", convertOldToNew("paddingLeft"));
assertEquals("alignParentLeft", convertNewToOld("alignParentStart"));
assertEquals("alignParentRight", convertNewToOld("alignParentEnd"));
assertEquals("paddingRight", convertNewToOld("paddingEnd"));
assertEquals("paddingLeft", convertNewToOld("paddingStart"));
for (int i = 0, n = ATTRIBUTES.length; i < n; i += 2) {
String oldAttribute = ATTRIBUTES[i];
String newAttribute = ATTRIBUTES[i + 1];
assertEquals(newAttribute, convertOldToNew(oldAttribute));
assertEquals(oldAttribute, convertNewToOld(newAttribute));
}
}
public void testConvertToOppositeDirection() {
assertEquals("alignParentRight", convertToOppositeDirection("alignParentLeft"));
assertEquals("alignParentLeft", convertToOppositeDirection("alignParentRight"));
assertEquals("alignParentStart", convertToOppositeDirection("alignParentEnd"));
assertEquals("alignParentEnd", convertToOppositeDirection("alignParentStart"));
assertEquals("paddingLeft", convertToOppositeDirection("paddingRight"));
assertEquals("paddingRight", convertToOppositeDirection("paddingLeft"));
assertEquals("paddingStart", convertToOppositeDirection("paddingEnd"));
assertEquals("paddingEnd", convertToOppositeDirection("paddingStart"));
}
public void testEnumConstants() throws Exception {
// Regression test for
// https://code.google.com/p/android/issues/detail?id=75480
// Also checks that static imports work correctly
mEnabled = ALL;
assertEquals(""
+ "src/test/pkg/GravityTest2.java:19: Warning: Use \"Gravity.START\" instead of \"Gravity.LEFT\" to ensure correct behavior in right-to-left locales [RtlHardcoded]\n"
+ " if (gravity == LEFT) { // ERROR\n"
+ " ~~~~\n"
+ "0 errors, 1 warnings\n",
lintProject(
"rtl/project-api17.properties=>project.properties",
"rtl/minsdk5targetsdk17.xml=>AndroidManifest.xml",
"rtl/GravityTest2.java.txt=>src/test/pkg/GravityTest2.java"
));
}
}