NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/SpannableStringLight.java

89 lines
2.7 KiB
Java
Raw Normal View History

2015-07-22 20:56:37 +02:00
/*
2019-01-23 18:03:33 +01:00
* This is the source code of Telegram for Android v. 5.x.x.
2015-07-22 20:56:37 +02:00
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
2019-01-23 18:03:33 +01:00
* Copyright Nikolai Kudashov, 2013-2018.
2015-07-22 20:56:37 +02:00
*/
package org.telegram.ui.Components;
import android.text.SpannableString;
import org.telegram.messenger.FileLog;
import java.lang.reflect.Field;
public class SpannableStringLight extends SpannableString {
private static Field mSpansField;
private static Field mSpanDataField;
private static Field mSpanCountField;
private static boolean fieldsAvailable;
private Object[] mSpansOverride;
private int[] mSpanDataOverride;
private int mSpanCountOverride;
private int num;
public SpannableStringLight(CharSequence source) {
super(source);
try {
mSpansOverride = (Object[]) mSpansField.get(this);
mSpanDataOverride = (int[]) mSpanDataField.get(this);
mSpanCountOverride = (int) mSpanCountField.get(this);
} catch (Throwable e) {
2017-03-31 01:58:05 +02:00
FileLog.e(e);
2015-07-22 20:56:37 +02:00
}
}
public void setSpansCount(int count) {
count += mSpanCountOverride;
mSpansOverride = new Object[count];
mSpanDataOverride = new int[count * 3];
num = mSpanCountOverride;
mSpanCountOverride = count;
try {
mSpansField.set(this, mSpansOverride);
mSpanDataField.set(this, mSpanDataOverride);
mSpanCountField.set(this, mSpanCountOverride);
} catch (Throwable e) {
2017-03-31 01:58:05 +02:00
FileLog.e(e);
2015-07-22 20:56:37 +02:00
}
}
public static boolean isFieldsAvailable() {
if (!fieldsAvailable && mSpansField == null) {
try {
mSpansField = SpannableString.class.getSuperclass().getDeclaredField("mSpans");
mSpansField.setAccessible(true);
mSpanDataField = SpannableString.class.getSuperclass().getDeclaredField("mSpanData");
mSpanDataField.setAccessible(true);
mSpanCountField = SpannableString.class.getSuperclass().getDeclaredField("mSpanCount");
mSpanCountField.setAccessible(true);
} catch (Throwable e) {
2017-03-31 01:58:05 +02:00
FileLog.e(e);
2015-07-22 20:56:37 +02:00
}
fieldsAvailable = true;
}
return mSpansField != null;
}
public void setSpanLight(Object what, int start, int end, int flags) {
mSpansOverride[num] = what;
mSpanDataOverride[num * 3] = start;
mSpanDataOverride[num * 3 + 1] = end;
mSpanDataOverride[num * 3 + 2] = flags;
num++;
}
@Override
public void removeSpan(Object what) {
super.removeSpan(what);
}
}