Skip to content
This repository has been archived by the owner on Feb 26, 2023. It is now read-only.

Commit

Permalink
Merge branch 'fromhtml' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
pyricau committed Oct 13, 2011
2 parents d85d866 + 0445720 commit 3c11139
Show file tree
Hide file tree
Showing 10 changed files with 275 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.googlecode.androidannotations.annotations.Click;
import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.Extra;
import com.googlecode.androidannotations.annotations.FromHtml;
import com.googlecode.androidannotations.annotations.ItemClick;
import com.googlecode.androidannotations.annotations.ItemLongClick;
import com.googlecode.androidannotations.annotations.ItemSelect;
Expand Down Expand Up @@ -90,6 +91,7 @@
import com.googlecode.androidannotations.processing.ClickProcessor;
import com.googlecode.androidannotations.processing.EActivityProcessor;
import com.googlecode.androidannotations.processing.ExtraProcessor;
import com.googlecode.androidannotations.processing.FromHtmlProcessor;
import com.googlecode.androidannotations.processing.ItemClickProcessor;
import com.googlecode.androidannotations.processing.ItemLongClickProcessor;
import com.googlecode.androidannotations.processing.ItemSelectedProcessor;
Expand Down Expand Up @@ -118,6 +120,7 @@
import com.googlecode.androidannotations.validation.ClickValidator;
import com.googlecode.androidannotations.validation.EActivityValidator;
import com.googlecode.androidannotations.validation.ExtraValidator;
import com.googlecode.androidannotations.validation.FromHtmlValidator;
import com.googlecode.androidannotations.validation.ItemClickValidator;
import com.googlecode.androidannotations.validation.ItemLongClickValidator;
import com.googlecode.androidannotations.validation.ItemSelectedValidator;
Expand Down Expand Up @@ -182,7 +185,8 @@
Head.class, //
Options.class, //
Post.class, //
Put.class })
Put.class,
FromHtml.class})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class AndroidAnnotationProcessor extends AnnotatedAbstractProcessor {

Expand Down Expand Up @@ -296,6 +300,7 @@ private ModelValidator buildModelValidator(IRClass rClass, AndroidSystemServices
modelValidator.register(new EActivityValidator(processingEnv, rClass, androidManifest));
modelValidator.register(new RoboGuiceValidator(processingEnv));
modelValidator.register(new ViewByIdValidator(processingEnv, rClass));
modelValidator.register(new FromHtmlValidator(processingEnv, rClass));
modelValidator.register(new ClickValidator(processingEnv, rClass));
modelValidator.register(new LongClickValidator(processingEnv, rClass));
modelValidator.register(new TouchValidator(processingEnv, rClass));
Expand Down Expand Up @@ -341,6 +346,7 @@ private ModelProcessor buildModelProcessor(IRClass rClass, AndroidSystemServices
modelProcessor.register(new PrefProcessor());
modelProcessor.register(new RoboGuiceProcessor());
modelProcessor.register(new ViewByIdProcessor(rClass));
modelProcessor.register(new FromHtmlProcessor(rClass));
modelProcessor.register(new ClickProcessor(rClass));
modelProcessor.register(new LongClickProcessor(rClass));
modelProcessor.register(new TouchProcessor(rClass));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.googlecode.androidannotations.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface FromHtml {
int value() default Id.DEFAULT_VALUE;
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.Extra;
import com.googlecode.androidannotations.annotations.ViewById;
import com.googlecode.androidannotations.annotations.rest.Delete;
import com.googlecode.androidannotations.annotations.rest.Get;
import com.googlecode.androidannotations.annotations.rest.Head;
Expand All @@ -53,6 +54,7 @@
public class ValidatorHelper {

private static final String ANDROID_VIEW_QUALIFIED_NAME = "android.view.View";
private static final String ANDROID_TEXT_VIEW_QUALIFIED_NAME = "android.widget.TextView";
private static final String ANDROID_APPLICATION_QUALIFIED_NAME = "android.app.Application";
private static final String ANDROID_ACTIVITY_QUALIFIED_NAME = "android.app.Activity";
private static final String ANDROID_BUNDLE_QUALIFIED_NAME = "android.os.Bundle";
Expand Down Expand Up @@ -149,6 +151,17 @@ public void hasExtraValue(Element element, IsValid valid) {
annotationHelper.printAnnotationError(element, "%s must have a value, which is the extra name used when sending the intent");
}
}

public void hasViewByIdAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) {
Set<? extends Element> layoutAnnotatedElements = validatedElements.getAnnotatedElements(ViewById.class);

if (!layoutAnnotatedElements.contains(element)) {
valid.invalidate();
if (element.getAnnotation(ViewById.class) == null) {
annotationHelper.printAnnotationError(element, "%s can only be used with annotation " + TargetAnnotationHelper.annotationName(ViewById.class));
}
}
}

public void enclosingElementHasRest(Element element, AnnotationElements validatedElements, IsValid valid) {

Expand Down Expand Up @@ -335,6 +348,10 @@ public void extendsView(Element element, IsValid valid) {
extendsType(element, ANDROID_VIEW_QUALIFIED_NAME, valid);
}

public void extendsTextView(Element element, IsValid valid) {
extendsType(element, ANDROID_TEXT_VIEW_QUALIFIED_NAME, valid);
}


public void extendsApplication(Element element, IsValid valid) {
extendsType(element, ANDROID_APPLICATION_QUALIFIED_NAME, valid);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.googlecode.androidannotations.processing;

import java.lang.annotation.Annotation;

import javax.lang.model.element.Element;

import com.googlecode.androidannotations.annotations.FromHtml;
import com.googlecode.androidannotations.annotations.Id;
import com.googlecode.androidannotations.rclass.IRClass;
import com.googlecode.androidannotations.rclass.IRClass.Res;
import com.googlecode.androidannotations.rclass.IRInnerClass;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JFieldRef;

public class FromHtmlProcessor implements ElementProcessor {

private final IRClass rClass;

public FromHtmlProcessor(IRClass rClass) {
this.rClass = rClass;
}

@Override
public Class<? extends Annotation> getTarget() {
return FromHtml.class;
}

@Override
public void process(Element element, JCodeModel codeModel, ActivitiesHolder activitiesHolder) throws Exception {
ActivityHolder holder = activitiesHolder.getEnclosingActivityHolder(element);

String fieldName = element.getSimpleName().toString();

FromHtml annotation = element.getAnnotation(FromHtml.class);
int idValue = annotation.value();

IRInnerClass rInnerClass = rClass.get(Res.STRING);
JFieldRef idRef;
if (idValue == Id.DEFAULT_VALUE) {
idRef = rInnerClass.getIdStaticRef(fieldName, holder);
} else {
idRef = rInnerClass.getIdStaticRef(idValue, holder);
}

JBlock methodBody = holder.afterSetContentView.body();

methodBody._if(JExpr.ref(fieldName).ne(JExpr._null()))._then().invoke(JExpr.ref(fieldName), "setText").arg(holder.refClass("android.text.Html").staticInvoke("fromHtml").arg(JExpr.invoke("getString").arg(idRef)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.googlecode.androidannotations.validation;

import java.lang.annotation.Annotation;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;

import com.googlecode.androidannotations.annotations.FromHtml;
import com.googlecode.androidannotations.helper.IdAnnotationHelper;
import com.googlecode.androidannotations.helper.IdValidatorHelper;
import com.googlecode.androidannotations.model.AnnotationElements;
import com.googlecode.androidannotations.rclass.IRClass;
import com.googlecode.androidannotations.rclass.IRClass.Res;

public class FromHtmlValidator implements ElementValidator {

private IdValidatorHelper validatorHelper;

public FromHtmlValidator(ProcessingEnvironment processingEnv, IRClass rClass) {
IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass);
validatorHelper = new IdValidatorHelper(annotationHelper);
}

@Override
public Class<? extends Annotation> getTarget() {
return FromHtml.class;
}

@Override
public boolean validate(Element element, AnnotationElements validatedElements) {

IsValid valid = new IsValid();

validatorHelper.hasViewByIdAnnotation(element, validatedElements, valid);

validatorHelper.extendsTextView(element, valid);

validatorHelper.idExists(element, Res.STRING, valid);

return valid.isValid();
}

}
3 changes: 2 additions & 1 deletion AndroidAnnotations/functional-test-1-5/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
<activity android:name=".ExtraInjectedActivity_" />
<activity android:name=".BackpressedActivity_" />
<activity android:name=".TransactionalActivity_" />
<activity android:name=".AbstractActivity_" />
<activity android:name=".AbstractActivity_" />
<activity android:name=".FromHtmlActivity_" />
<activity android:name=".roboguice.MapActivityWithRoboGuice_" />
<activity android:name=".roboguice.ActivityWithRoboGuice_" />
<activity android:name=".ApplicationInjectedActivity_" />
Expand Down
2 changes: 2 additions & 0 deletions AndroidAnnotations/functional-test-1-5/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
-->
<resources>
<string name="hello">Hello android-functional-test-1-5!</string>
<string name="hello_html"><![CDATA[Hello <b>android-functional-test-1-5</b>!]]></string>
<string name="app_name">android-functional-test-1-5</string>
<string name="someView">TextView Text</string>
<string name="injected_activity_caption">Roboguice Activity tested with Robolectric</string>

<string name="injected_string">test</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.googlecode.androidannotations.test15;

import android.app.Activity;
import android.widget.TextView;

import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.FromHtml;
import com.googlecode.androidannotations.annotations.ViewById;

@EActivity(R.layout.views_injected)
public class FromHtmlActivity extends Activity {

@ViewById(R.id.my_text_view)
@FromHtml(R.string.hello_html)
TextView textView;

@ViewById
@FromHtml
TextView someView;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.googlecode.androidannotations.test15;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import android.text.Html;

import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.RobolectricTestRunner;
import com.xtremelabs.robolectric.shadows.ShadowHtml;

@RunWith(RobolectricTestRunner.class)
public class FromHtmlActivityTest {

private FromHtmlActivity_ activity;

@Before
public void setup() {
Robolectric.bindShadowClass(ShadowHtml.class);

activity = new FromHtmlActivity_();
activity.onCreate(null);
}

@Test
public void injectionOfHtmlTest() {
assertNotNull(activity.textView);
assertEquals(Html.fromHtml(activity.getString(R.string.hello_html)), activity.textView.getText());
}

@Test
public void injectionOfHtmlWithDefaultName() {
assertNotNull(activity.someView);
assertEquals(Html.fromHtml(activity.getString(R.string.someView)), activity.someView.getText());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.xtremelabs.robolectric.shadows;

import android.text.Html;
import android.text.Spanned;

import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;

@Implements(Html.class)
public class ShadowHtml {
@Implementation
public static Spanned fromHtml(String source) {
return new SpannedThatActsLikeString(source);
}

private static class SpannedThatActsLikeString implements Spanned {
String source;

private SpannedThatActsLikeString(String source) {
this.source = source;
}

@Override
public <T> T[] getSpans(int start, int end, Class<T> type) {
return null;
}

@Override
public int getSpanStart(Object tag) {
return 0;
}

@Override
public int getSpanEnd(Object tag) {
return 0;
}

@Override
public int getSpanFlags(Object tag) {
return 0;
}

@Override
public int nextSpanTransition(int start, int limit, Class type) {
return 0;
}

@Override
public int length() {
return 0;
}

@Override
public char charAt(int i) {
return 0;
}

@Override
public CharSequence subSequence(int i, int i1) {
return null;
}

@Override
public String toString() {
return source;
}

@Override
public boolean equals(Object o) {
if (o instanceof SpannedThatActsLikeString)
return source.equals(((SpannedThatActsLikeString) o).source);
else
return source.equals(o);
}

@Override
public int hashCode() {
return source != null ? source.hashCode() : 0;
}
}
}

0 comments on commit 3c11139

Please sign in to comment.