blob: 3fbb94a39b8c392b213177af429a2e8146b0bd92 [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.TextView;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import java.util.ArrayList;
import java.util.List;
import static android.view.View.VISIBLE;
import static com.xtremelabs.robolectric.Robolectric.shadowOf_;
@SuppressWarnings({"UnusedDeclaration"})
@Implements(TextView.class)
public class ShadowTextView extends ShadowView {
private CharSequence text = "";
private CompoundDrawables compoundDrawablesImpl;
private Integer textColorHexValue;
private float textSize = 14.0f;
private boolean autoLinkPhoneNumbers;
private int autoLinkMask;
private CharSequence hintText;
private int compoundDrawablePadding;
@Override public void __constructor__(Context context, AttributeSet attributeSet) {
super.__constructor__(context, attributeSet);
applyTextAttribute();
applyCompoundDrawablesWithIntrinsicBoundsAttributes();
}
@Implementation
public void setText(CharSequence text) {
if (text == null) {
text = "";
}
this.text = text;
}
@Implementation
public void setText(int textResourceId) {
this.text = getResources().getText(textResourceId);
}
@Implementation
public CharSequence getText() {
return text;
}
@Implementation
public int length() {
return text.length();
}
@Implementation
public void setTextColor(int color) {
textColorHexValue = color;
}
@Implementation
public void setTextSize(float size) {
textSize = size;
}
@Implementation
public final void setHint(int resId) {
this.hintText = getResources().getText(resId);
}
@Implementation
public CharSequence getHint() {
return hintText;
}
@Implementation
public URLSpan[] getUrls() {
String[] words = text.toString().split("\\s+");
List<URLSpan> urlSpans = new ArrayList<URLSpan>();
for (String word : words) {
if (word.startsWith("http://")) {
urlSpans.add(new URLSpan(word));
}
}
return urlSpans.toArray(new URLSpan[urlSpans.size()]);
}
@Implementation
public final void setAutoLinkMask(int mask) {
autoLinkMask = mask;
autoLinkPhoneNumbers = (mask & Linkify.PHONE_NUMBERS) != 0;
}
@Implementation
public void setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) {
compoundDrawablesImpl = new CompoundDrawables(left, top, right, bottom);
}
@Implementation
public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top,
Drawable right, Drawable bottom) {
compoundDrawablesImpl = new CompoundDrawables(left, top, right, bottom);
}
@Implementation
public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
compoundDrawablesImpl = new CompoundDrawables(left, top, right, bottom);
}
@Implementation
public Drawable[] getCompoundDrawables() {
if (compoundDrawablesImpl == null) {
return new Drawable[]{null, null, null, null};
}
return new Drawable[]{
compoundDrawablesImpl.leftDrawable,
compoundDrawablesImpl.topDrawable,
compoundDrawablesImpl.rightDrawable,
compoundDrawablesImpl.bottomDrawable
};
}
@Implementation
public void setCompoundDrawablePadding(int compoundDrawablePadding) {
this.compoundDrawablePadding = compoundDrawablePadding;
}
@Implementation
public int getCompoundDrawablePadding() {
return compoundDrawablePadding;
}
@Implementation
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (onKeyListener != null) {
return onKeyListener.onKey(realView, keyCode, event);
} else {
return false;
}
}
/**
* Returns the text string of this {@code TextView}.
* <p/>
* Robolectric extension.
*/
@Override
public String innerText() {
return (text == null || getVisibility() != VISIBLE) ? "" : text.toString();
}
@Override @Implementation
public boolean equals(Object o) {
return super.equals(shadowOf_(o));
}
@Override @Implementation
public int hashCode() {
return super.hashCode();
}
public CompoundDrawables getCompoundDrawablesImpl() {
return compoundDrawablesImpl;
}
void setCompoundDrawablesImpl(CompoundDrawables compoundDrawablesImpl) {
this.compoundDrawablesImpl = compoundDrawablesImpl;
}
public Integer getTextColorHexValue() {
return textColorHexValue;
}
@Implementation
public float getTextSize() {
return textSize;
}
public boolean isAutoLinkPhoneNumbers() {
return autoLinkPhoneNumbers;
}
private void applyTextAttribute() {
String text = attributeSet.getAttributeValue("android", "text");
if (text != null) {
if (text.startsWith("@string/")) {
int textResId = attributeSet.getAttributeResourceValue("android", "text", 0);
text = context.getResources().getString(textResId);
}
setText(text);
}
}
private void applyCompoundDrawablesWithIntrinsicBoundsAttributes() {
setCompoundDrawablesWithIntrinsicBounds(
attributeSet.getAttributeResourceValue("android", "drawableLeft", 0),
attributeSet.getAttributeResourceValue("android", "drawableTop", 0),
attributeSet.getAttributeResourceValue("android", "drawableRight", 0),
attributeSet.getAttributeResourceValue("android", "drawableBottom", 0));
}
public static class CompoundDrawables {
public int left;
public int top;
public int right;
public int bottom;
public Drawable leftDrawable;
public Drawable topDrawable;
public Drawable rightDrawable;
public Drawable bottomDrawable;
public CompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
leftDrawable = left;
topDrawable = top;
rightDrawable = right;
bottomDrawable = bottom;
}
public CompoundDrawables(int left, int top, int right, int bottom) {
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CompoundDrawables that = (CompoundDrawables) o;
if (bottom != that.bottom) return false;
if (left != that.left) return false;
if (right != that.right) return false;
if (top != that.top) return false;
return true;
}
@Override
public int hashCode() {
int result = left;
result = 31 * result + top;
result = 31 * result + right;
result = 31 * result + bottom;
return result;
}
@Override
public String toString() {
return "CompoundDrawables{" +
"left=" + left +
", top=" + top +
", right=" + right +
", bottom=" + bottom +
'}';
}
}
}