From 1aa86eec511fed2acccafef253b66ec68a74d0d7 Mon Sep 17 00:00:00 2001 From: Michael Evans Date: Wed, 18 Mar 2015 17:49:44 -0400 Subject: [PATCH] Added RadioGroup OnCheckedChangeListener annotation --- .../OnRadioGroupCheckedChanged.java | 45 ++++++++++++++++ .../internal/ButterKnifeProcessor.java | 2 + .../OnRadioGroupCheckChangedTest.java | 52 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 butterknife/src/main/java/butterknife/OnRadioGroupCheckedChanged.java create mode 100644 butterknife/src/test/java/butterknife/internal/OnRadioGroupCheckChangedTest.java diff --git a/butterknife/src/main/java/butterknife/OnRadioGroupCheckedChanged.java b/butterknife/src/main/java/butterknife/OnRadioGroupCheckedChanged.java new file mode 100644 index 000000000..da4979a76 --- /dev/null +++ b/butterknife/src/main/java/butterknife/OnRadioGroupCheckedChanged.java @@ -0,0 +1,45 @@ +package butterknife; + +import android.view.View; +import butterknife.internal.ListenerClass; +import butterknife.internal.ListenerMethod; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static android.widget.RadioGroup.OnCheckedChangeListener; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + +/** + * Bind a method to an {@link OnCheckedChangeListener OnCheckedChangeListener} on the view for + * each ID specified. + *

+ * {@literal @}OnCheckedChanged(R.id.example) void onChecked(boolean checked) {
+ *   Toast.makeText(this, checked ? "Checked!" : "Unchecked!", LENGTH_SHORT).show();
+ * }
+ * 
+ * Any number of parameters from + * {@link OnCheckedChangeListener#onCheckedChanged(android.widget.RadioGroup, int) + * onCheckedChanged} may be used on the method. + * + * @see OnCheckedChangeListener + */ +@Target(METHOD) +@Retention(CLASS) +@ListenerClass( + targetType = "android.widget.RadioGroup", + setter = "setOnCheckedChangeListener", + type = "android.widget.RadioGroup.OnCheckedChangeListener", + method = @ListenerMethod( + name = "onCheckedChanged", + parameters = { + "android.widget.RadioGroup", + "int" + } + ) +) +public @interface OnRadioGroupCheckedChanged { + /** View IDs to which the method will be bound. */ + int[] value() default { View.NO_ID }; +} diff --git a/butterknife/src/main/java/butterknife/internal/ButterKnifeProcessor.java b/butterknife/src/main/java/butterknife/internal/ButterKnifeProcessor.java index c8b696ff0..690e92b1c 100644 --- a/butterknife/src/main/java/butterknife/internal/ButterKnifeProcessor.java +++ b/butterknife/src/main/java/butterknife/internal/ButterKnifeProcessor.java @@ -12,6 +12,7 @@ import butterknife.OnItemSelected; import butterknife.OnLongClick; import butterknife.OnPageChange; +import butterknife.OnRadioGroupCheckedChanged; import butterknife.OnTextChanged; import butterknife.OnTouch; import butterknife.ResourceBool; @@ -81,6 +82,7 @@ public final class ButterKnifeProcessor extends AbstractProcessor { OnItemSelected.class, // OnLongClick.class, // OnPageChange.class, // + OnRadioGroupCheckedChanged.class, // OnTextChanged.class, // OnTouch.class // ); diff --git a/butterknife/src/test/java/butterknife/internal/OnRadioGroupCheckChangedTest.java b/butterknife/src/test/java/butterknife/internal/OnRadioGroupCheckChangedTest.java new file mode 100644 index 000000000..15da9349b --- /dev/null +++ b/butterknife/src/test/java/butterknife/internal/OnRadioGroupCheckChangedTest.java @@ -0,0 +1,52 @@ +package butterknife.internal; + +import com.google.common.base.Joiner; +import com.google.testing.compile.JavaFileObjects; +import org.junit.Test; + +import javax.tools.JavaFileObject; + +import static butterknife.internal.ProcessorTestUtilities.butterknifeProcessors; +import static com.google.common.truth.Truth.ASSERT; +import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource; + +public class OnRadioGroupCheckChangedTest { + @Test + public void checkedChanged() { + JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join( + "package test;", + "import android.app.Activity;", + "import butterknife.OnRadioGroupCheckedChanged;", + "public class Test extends Activity {", + " @OnRadioGroupCheckedChanged(1) void doStuff() {}", + "}" + )); + + JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewBinder", + Joiner.on('\n').join( + "package test;", + "import android.view.View;", + "import butterknife.ButterKnife.Finder;", + "import butterknife.ButterKnife.ViewBinder;", + "public class Test$$ViewBinder implements ViewBinder {", + " @Override public void bind(final Finder finder, final T target, Object source) {", + " View view;", + " view = finder.findRequiredView(source, 1, \"method 'doStuff'\");", + " ((android.widget.RadioGroup) view).setOnCheckedChangeListener(new android.widget.RadioGroup.OnCheckedChangeListener() {", + " @Override public void onCheckedChanged(android.widget.RadioGroup p0, int p1) {", + " target.doStuff();", + " }", + " });", + " }", + " @Override public void unbind(T target) {", + " }", + "}" + )); + + ASSERT.about(javaSource()).that(source) + .processedWith(butterknifeProcessors()) + .compilesWithoutError() + .and() + .generatesSources(expectedSource); + } +}