StringBlockpublic final class StringBlock extends Object Conveniences for retrieving data out of a compiled string resource.
{@hide} |
Fields Summary |
---|
private static final String | TAG | private static final boolean | localLOGV | private final int | mNative | private final boolean | mUseSparse | private final boolean | mOwnsNative | private CharSequence[] | mStrings | private android.util.SparseArray | mSparseStrings | StyleIDs | mStyleIDs |
Constructors Summary |
---|
public StringBlock(byte[] data, boolean useSparse)
mNative = nativeCreate(data, 0, data.length);
mUseSparse = useSparse;
mOwnsNative = true;
if (localLOGV) Log.v(TAG, "Created string block " + this
+ ": " + nativeGetSize(mNative));
| public StringBlock(byte[] data, int offset, int size, boolean useSparse)
mNative = nativeCreate(data, offset, size);
mUseSparse = useSparse;
mOwnsNative = true;
if (localLOGV) Log.v(TAG, "Created string block " + this
+ ": " + nativeGetSize(mNative));
| StringBlock(int obj, boolean useSparse)Create from an existing string block native object. This is
-extremely- dangerous -- only use it if you absolutely know what you
are doing! The given native object must exist for the entire lifetime
of this newly creating StringBlock.
mNative = obj;
mUseSparse = useSparse;
mOwnsNative = false;
if (localLOGV) Log.v(TAG, "Created string block " + this
+ ": " + nativeGetSize(mNative));
|
Methods Summary |
---|
private static void | addParagraphSpan(Spannable buffer, java.lang.Object what, int start, int end)If a translator has messed up the edges of paragraph-level markup,
fix it to actually cover the entire paragraph that it is attached to
instead of just whatever range they put it on.
int len = buffer.length();
if (start != 0 && start != len && buffer.charAt(start - 1) != '\n") {
for (start--; start > 0; start--) {
if (buffer.charAt(start - 1) == '\n") {
break;
}
}
}
if (end != 0 && end != len && buffer.charAt(end - 1) != '\n") {
for (end++; end < len; end++) {
if (buffer.charAt(end - 1) == '\n") {
break;
}
}
}
buffer.setSpan(what, start, end, Spannable.SPAN_PARAGRAPH);
| private java.lang.CharSequence | applyStyles(java.lang.String str, int[] style, android.content.res.StringBlock$StyleIDs ids)
if (style.length == 0)
return str;
SpannableString buffer = new SpannableString(str);
int i=0;
while (i < style.length) {
int type = style[i];
if (localLOGV) Log.v(TAG, "Applying style span id=" + type
+ ", start=" + style[i+1] + ", end=" + style[i+2]);
if (type == ids.boldId) {
buffer.setSpan(new StyleSpan(Typeface.BOLD),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.italicId) {
buffer.setSpan(new StyleSpan(Typeface.ITALIC),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.underlineId) {
buffer.setSpan(new UnderlineSpan(),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.ttId) {
buffer.setSpan(new TypefaceSpan("monospace"),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.bigId) {
buffer.setSpan(new RelativeSizeSpan(1.25f),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.smallId) {
buffer.setSpan(new RelativeSizeSpan(0.8f),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.subId) {
buffer.setSpan(new SubscriptSpan(),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.supId) {
buffer.setSpan(new SuperscriptSpan(),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.strikeId) {
buffer.setSpan(new StrikethroughSpan(),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (type == ids.listItemId) {
addParagraphSpan(buffer, new BulletSpan(10),
style[i+1], style[i+2]+1);
} else if (type == ids.marqueeId) {
buffer.setSpan(TextUtils.TruncateAt.MARQUEE,
style[i+1], style[i+2]+1,
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
String tag = nativeGetString(mNative, type);
if (tag.startsWith("font;")) {
String sub;
sub = subtag(tag, ";height=");
if (sub != null) {
int size = Integer.parseInt(sub);
addParagraphSpan(buffer, new Height(size),
style[i+1], style[i+2]+1);
}
sub = subtag(tag, ";size=");
if (sub != null) {
int size = Integer.parseInt(sub);
buffer.setSpan(new AbsoluteSizeSpan(size),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
sub = subtag(tag, ";fgcolor=");
if (sub != null) {
int color = XmlUtils.convertValueToUnsignedInt(sub, -1);
buffer.setSpan(new ForegroundColorSpan(color),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
sub = subtag(tag, ";bgcolor=");
if (sub != null) {
int color = XmlUtils.convertValueToUnsignedInt(sub, -1);
buffer.setSpan(new BackgroundColorSpan(color),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else if (tag.startsWith("a;")) {
String sub;
sub = subtag(tag, ";href=");
if (sub != null) {
buffer.setSpan(new URLSpan(sub),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else if (tag.startsWith("annotation;")) {
int len = tag.length();
int next;
for (int t = tag.indexOf(';"); t < len; t = next) {
int eq = tag.indexOf('=", t);
if (eq < 0) {
break;
}
next = tag.indexOf(';", eq);
if (next < 0) {
next = len;
}
String key = tag.substring(t + 1, eq);
String value = tag.substring(eq + 1, next);
buffer.setSpan(new Annotation(key, value),
style[i+1], style[i+2]+1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
i += 3;
}
return new SpannedString(buffer);
| protected void | finalize()
if (mOwnsNative) {
nativeDestroy(mNative);
}
| public java.lang.CharSequence | get(int idx)
synchronized (this) {
if (mStrings != null) {
CharSequence res = mStrings[idx];
if (res != null) {
return res;
}
} else if (mSparseStrings != null) {
CharSequence res = mSparseStrings.get(idx);
if (res != null) {
return res;
}
} else {
final int num = nativeGetSize(mNative);
if (mUseSparse && num > 250) {
mSparseStrings = new SparseArray<CharSequence>();
} else {
mStrings = new CharSequence[num];
}
}
String str = nativeGetString(mNative, idx);
CharSequence res = str;
int[] style = nativeGetStyle(mNative, idx);
if (localLOGV) Log.v(TAG, "Got string: " + str);
if (localLOGV) Log.v(TAG, "Got styles: " + style);
if (style != null) {
if (mStyleIDs == null) {
mStyleIDs = new StyleIDs();
mStyleIDs.boldId = nativeIndexOfString(mNative, "b");
mStyleIDs.italicId = nativeIndexOfString(mNative, "i");
mStyleIDs.underlineId = nativeIndexOfString(mNative, "u");
mStyleIDs.ttId = nativeIndexOfString(mNative, "tt");
mStyleIDs.bigId = nativeIndexOfString(mNative, "big");
mStyleIDs.smallId = nativeIndexOfString(mNative, "small");
mStyleIDs.supId = nativeIndexOfString(mNative, "sup");
mStyleIDs.subId = nativeIndexOfString(mNative, "sub");
mStyleIDs.strikeId = nativeIndexOfString(mNative, "strike");
mStyleIDs.listItemId = nativeIndexOfString(mNative, "li");
mStyleIDs.marqueeId = nativeIndexOfString(mNative, "marquee");
if (localLOGV) Log.v(TAG, "BoldId=" + mStyleIDs.boldId
+ ", ItalicId=" + mStyleIDs.italicId
+ ", UnderlineId=" + mStyleIDs.underlineId);
}
res = applyStyles(str, style, mStyleIDs);
}
if (mStrings != null) mStrings[idx] = res;
else mSparseStrings.put(idx, res);
return res;
}
| private static final native int | nativeCreate(byte[] data, int offset, int size)
| private static final native void | nativeDestroy(int obj)
| private static final native int | nativeGetSize(int obj)
| private static final native java.lang.String | nativeGetString(int obj, int idx)
| private static final native int[] | nativeGetStyle(int obj, int idx)
| private static final native int | nativeIndexOfString(int obj, java.lang.String str)
| private static java.lang.String | subtag(java.lang.String full, java.lang.String attribute)
int start = full.indexOf(attribute);
if (start < 0) {
return null;
}
start += attribute.length();
int end = full.indexOf(';", start);
if (end < 0) {
return full.substring(start);
} else {
return full.substring(start, end);
}
|
|