mirror of https://github.com/NekoX-Dev/NekoX.git
89 lines
2.7 KiB
Java
89 lines
2.7 KiB
Java
/*
|
|
* This is the source code of Telegram for Android v. 5.x.x.
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Nikolai Kudashov, 2013-2018.
|
|
*/
|
|
|
|
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) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
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) {
|
|
FileLog.e(e);
|
|
}
|
|
}
|
|
|
|
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) {
|
|
FileLog.e(e);
|
|
}
|
|
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);
|
|
}
|
|
}
|