diff options
author | Tor Norbye <tnorbye@google.com> | 2012-12-16 20:59:13 -0800 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2012-12-19 09:14:21 -0800 |
commit | b28737ae52aa0a186587be6b1fa5f35cdf384291 (patch) | |
tree | c83eaf91feb92323c8973cb15a4fd94aea2a69cf /lint/cli | |
parent | 75c40ee9e1d69ba6e494582f029e200a1c294999 (diff) | |
download | sdk-b28737ae52aa0a186587be6b1fa5f35cdf384291.zip sdk-b28737ae52aa0a186587be6b1fa5f35cdf384291.tar.gz sdk-b28737ae52aa0a186587be6b1fa5f35cdf384291.tar.bz2 |
Look for missing commit calls on fragment managers
This implements
41339: Forgetting .commit() after .beginTransaction()
Also renames the RecycleDetector to something more generic
since it checks for other types of cleanup as well.
Change-Id: I19ca6537ba88745845ad452f87b6562085a47fe5
Diffstat (limited to 'lint/cli')
4 files changed, 105 insertions, 2 deletions
diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/RecycleDetectorTest.java b/lint/cli/src/test/java/com/android/tools/lint/checks/RecycleDetectorTest.java index ebef046..df6f451 100644 --- a/lint/cli/src/test/java/com/android/tools/lint/checks/RecycleDetectorTest.java +++ b/lint/cli/src/test/java/com/android/tools/lint/checks/RecycleDetectorTest.java @@ -22,10 +22,10 @@ import com.android.tools.lint.detector.api.Detector; public class RecycleDetectorTest extends AbstractCheckTest { @Override protected Detector getDetector() { - return new RecycleDetector(); + return new CleanupDetector(); } - public void test() throws Exception { + public void testRecycle() throws Exception { assertEquals( "src/test/pkg/RecycleTest.java:56: Warning: This TypedArray should be recycled after use with #recycle() [Recycle]\n" + " final TypedArray a = getContext().obtainStyledAttributes(attrs,\n" + @@ -73,4 +73,41 @@ public class RecycleDetectorTest extends AbstractCheckTest { "bytecode/RecycleTest.class.data=>bin/classes/test/pkg/RecycleTest.class" )); } + + public void testCommit() throws Exception { + assertEquals("" + + "src/test/pkg/CommitTest.java:24: Warning: This FragmentTransaction should be recycled after use with #recycle() [CommitTransaction]\n" + + " getFragmentManager().beginTransaction(); // Missing commit\n" + + " ~~~~~~~~~~~~~~~~\n" + + "src/test/pkg/CommitTest.java:29: Warning: This FragmentTransaction should be recycled after use with #recycle() [CommitTransaction]\n" + + " FragmentTransaction transaction2 = getFragmentManager().beginTransaction(); // Missing commit\n" + + " ~~~~~~~~~~~~~~~~\n" + + "src/test/pkg/CommitTest.java:38: Warning: This FragmentTransaction should be recycled after use with #recycle() [CommitTransaction]\n" + + " getFragmentManager().beginTransaction(); // Missing commit\n" + + " ~~~~~~~~~~~~~~~~\n" + + "src/test/pkg/CommitTest.java:64: Warning: This FragmentTransaction should be recycled after use with #recycle() [Recycle]\n" + + " getSupportFragmentManager().beginTransaction();\n" + + " ~~~~~~~~~~~~~~~~\n" + + "0 errors, 4 warnings\n", + + lintProject( + "apicheck/classpath=>.classpath", + "apicheck/minsdk4.xml=>AndroidManifest.xml", + "project.properties1=>project.properties", + "bytecode/CommitTest.java.txt=>src/test/pkg/CommitTest.java", + "bytecode/CommitTest.class.data=>bin/classes/test/pkg/CommitTest.class" + )); + } + + public void testCommit2() throws Exception { + assertEquals("" + + "No warnings.", + + lintProject( + "apicheck/classpath=>.classpath", + "apicheck/minsdk4.xml=>AndroidManifest.xml", + "project.properties1=>project.properties", + "bytecode/DialogFragment.class.data=>bin/classes/test/pkg/DialogFragment.class" + )); + } } diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.class.data b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.class.data Binary files differnew file mode 100644 index 0000000..76f35c0 --- /dev/null +++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.class.data diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.java.txt b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.java.txt new file mode 100644 index 0000000..49395d7 --- /dev/null +++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/CommitTest.java.txt @@ -0,0 +1,66 @@ +package test.pkg; + +import android.app.Activity; +import android.app.FragmentManager; +import android.app.FragmentTransaction; + +@SuppressWarnings("unused") +public class CommitTest extends Activity { + public void ok1() { + getFragmentManager().beginTransaction().commit(); + } + + public void ok2() { + FragmentTransaction transaction = getFragmentManager().beginTransaction(); + transaction.commit(); + } + + public void ok3() { + FragmentTransaction transaction = getFragmentManager().beginTransaction(); + transaction.commitAllowingStateLoss(); + } + + public void error1() { + getFragmentManager().beginTransaction(); // Missing commit + } + + public void error() { + FragmentTransaction transaction1 = getFragmentManager().beginTransaction(); + FragmentTransaction transaction2 = getFragmentManager().beginTransaction(); // Missing commit + transaction1.commit(); + } + + public void error3_public() { + error3(); + } + + private void error3() { + getFragmentManager().beginTransaction(); // Missing commit + } + + public void ok4(FragmentManager manager, String tag) { + FragmentTransaction ft = manager.beginTransaction(); + ft.add(null, tag); + ft.commit(); + } + + // Support library + + private android.support.v4.app.FragmentManager getSupportFragmentManager() { + return null; + } + + public void ok5() { + getSupportFragmentManager().beginTransaction().commit(); + } + + public void ok6(android.support.v4.app.FragmentManager manager, String tag) { + android.support.v4.app.FragmentTransaction ft = manager.beginTransaction(); + ft.add(null, tag); + ft.commit(); + } + + public void error4() { + getSupportFragmentManager().beginTransaction(); + } +} diff --git a/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/DialogFragment.class.data b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/DialogFragment.class.data Binary files differnew file mode 100644 index 0000000..f57a263 --- /dev/null +++ b/lint/cli/src/test/java/com/android/tools/lint/checks/data/bytecode/DialogFragment.class.data |